Функция Stat всегда возвращает -1 на допустимых путях - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь написать простой веб-сервер с использованием сокетов на C. Я хочу проверить, является ли URL-адрес запроса просто каталогом или файлом, например localhost: 8080 / docroot или localhost: 8080 / docroot / file.html.

Вот почему я хотел использовать stat () и макросы ISDIR и ISREG. К сожалению, функция stat всегда возвращает -1. URL-адрес запроса является правильным (в данном примере это / docroot). Я также попытался добавить точку перед ней, но это тоже не сработало.

struct stat fileinfo;
char request_line[255];
char* request_method; // GET, POST etc.
char* request_path; // the url
strncpy(request_line, in, indexOf(in, '\n'));

request_method = strtok(request_line, " ");
request_path = strtok(NULL, " ");

// the actual thing
if (stat(request_path, &fileinfo) == -1) {
  printf("Invalid path: #%s#", request_path);
  throwError();
}
if (S_ISDIR(fileinfo.st_mode))
  renderDirectory(request_path, sockfd);
else if (S_ISREG(fileinfo.st_mode)) {
  transferFile(request_path, sockfd);
} 
else
  throwError("Fehler beim erkennen der Datei/des Pfades");

Итак, как я уже сказал, request_path возвращает правильный URL, который является / docroot. Каталог существует внутри cwd. К сожалению, функция stat возвращает -1, несмотря ни на что. Может быть, это просто моя глупая ошибка, но я не могу понять это ...

Редактировать: вывод printf:

#/docroot#

1 Ответ

0 голосов
/ 28 марта 2019

Итак, я нашел проблему.Все вы, кто сказал, что это потому, что путь не относительный: вы были не правы.Я понятия не имею, почему, но, очевидно, проблема с потоками в некоторой части кода, которая вызывается намного позже, была здесь.Я удалил этот бит, и теперь он работает с и без точки и / или косой черты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...