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