Use the correct error codes and meaningful explanations

Introduce status_error: it's like status or status_redirect but for
errors, thus it doesn't add ``;lang=$lang'' at the end.
This commit is contained in:
Omar Polo 2021-03-06 20:21:13 +00:00 committed by Solene Rapenne
parent e87b36c991
commit 7431d3eeec
1 changed files with 12 additions and 6 deletions

18
main.c
View File

@ -32,6 +32,7 @@ void cgi(const char *cgicmd);
void display_file(const char *);
void status(const int, const char *);
void status_redirect(const int, const char *);
void status_error(const int, const char*);
void drop_privileges(const char *, const char *);
void
@ -121,6 +122,13 @@ status_redirect(const int code, const char *url)
code, url);
}
void
status_error(const int code, const char *reason)
{
printf("%i %s\r\n",
code, reason);
}
void
display_file(const char *uri)
{
@ -191,7 +199,7 @@ display_file(const char *uri)
err:
/* return an error code and no content */
status(51, "text/gemini");
status_error(51, "file not found");
syslog(LOG_DAEMON, "path invalid %s", fp);
goto closefd;
@ -217,11 +225,8 @@ autoindex(const char *path)
char *pos = NULL;
struct dirent **namelist; /* this must be freed at last */
syslog(LOG_DAEMON, "autoindex: %s", path);
status(20, "text/gemini");
/* display link to parent */
char parent[PATH_MAX] = {'\0'};
/* parent is "path" without chroot_dir */
@ -235,13 +240,14 @@ autoindex(const char *path)
if (pos != NULL) {
pos[1] = '\0'; /* at worse, parent is now "/" */
}
printf("=> %s ../\n", parent);
/* use alphasort to always have the same order on every system */
if ((n = scandir(path, &namelist, NULL, alphasort)) < 0) {
status(51, "text/gemini");
status_error(50, "Internal server error");
errlog("Can't scan %s", path);
} else {
status(20, "text/gemini");
printf("=> %s ../\n", parent);
for(int j = 0; j < n; j++) {
/* skip self and parent */
if ((strcmp(namelist[j]->d_name, ".") == 0) ||