From b175db347d0a9f7f7a7f6c2c88fd52fb7c3521f9 Mon Sep 17 00:00:00 2001 From: Emil Mikulic Date: Sat, 29 Nov 2003 07:36:01 +0000 Subject: [PATCH] . Added --accf instead of compile-time NO_ACCEPTFILTER. . Fixed const issues in dlent_cmp(). . Fixed uninitialized from/to warning. --- trunk/darkhttpd.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/trunk/darkhttpd.c b/trunk/darkhttpd.c index 9f93ca4..d3c5493 100644 --- a/trunk/darkhttpd.c +++ b/trunk/darkhttpd.c @@ -32,7 +32,6 @@ static const char rcsid[] = /* * Note: Solaris users: link with -lxnet - * Note: FreeBSD users: -DNO_ACCEPTFILTER to turn off acceptfilter */ #ifdef __linux @@ -257,7 +256,7 @@ static int sockin = -1; /* socket to accept connections from */ static char *wwwroot = NULL; /* a path name */ static char *logfile_name = NULL; /* NULL = no logging */ static FILE *logfile = NULL; -static int want_chroot = 0; +static int want_chroot = 0, want_accf = 0; #define INVALID_UID ((uid_t) -1) #define INVALID_GID ((gid_t) -1) @@ -461,15 +460,20 @@ static void nonblock_socket(const int sock) */ static void acceptfilter_socket(const int sock) { -#if defined(__FreeBSD__) && !defined(NO_ACCEPTFILTER) - struct accept_filter_arg filt = {"httpready", ""}; - if (setsockopt(sock, SOL_SOCKET, SO_ACCEPTFILTER, - &filt, sizeof(filt)) == -1) - fprintf(stderr, "cannot enable acceptfilter: %s\n", - strerror(errno)); - else - printf("enabled acceptfilter\n"); + if (want_accf) + { +#if defined(__FreeBSD__) + struct accept_filter_arg filt = {"httpready", ""}; + if (setsockopt(sock, SOL_SOCKET, SO_ACCEPTFILTER, + &filt, sizeof(filt)) == -1) + fprintf(stderr, "cannot enable acceptfilter: %s\n", + strerror(errno)); + else + printf("enabled acceptfilter\n"); +#else + printf("this platform doesn't support acceptfilter\n"); #endif + } } @@ -924,6 +928,11 @@ static void usage(void) "\n" "\t--uid uid, --gid gid\n" "\t\tDrops privileges to given uid:gid after initialization.\n" +#ifdef __FreeBSD__ + "\n" + "\t--accf\n" + "\t\tUse acceptfilter.\n" +#endif "\n", bindport, index_name); } @@ -1037,6 +1046,10 @@ static void parse_commandline(const int argc, char *argv[]) if (g == NULL) errx(1, "no such gid: `%s'", argv[i]); drop_gid = g->gr_gid; } + else if (strcmp(argv[i], "--accf") == 0) + { + want_accf = 1; + } else errx(1, "unknown argument `%s'", argv[i]); } @@ -1545,8 +1558,8 @@ struct dlent static int dlent_cmp(const void *a, const void *b) { - return strcmp( (*(const struct dlent **)a)->name, - (*(const struct dlent **)b)->name ); + return strcmp( (*((const struct dlent * const *)a))->name, + (*((const struct dlent * const *)b))->name ); } static ssize_t make_sorted_dirlist(const char *path, struct dlent ***output) @@ -1588,7 +1601,7 @@ static ssize_t make_sorted_dirlist(const char *path, struct dlent ***output) entries++; } - (void)closedir(dir); /* FIXME: not checking return -1 */ + (void)closedir(dir); /* can't error out if opendir() succeeded */ safefree(currname); qsort(list, entries, sizeof(struct dlent*), dlent_cmp); @@ -1826,6 +1839,7 @@ static void process_get(struct connection *conn) /* check for wrapping */ if (from < 0 || from > to) from = 0; } + else errx(1, "internal error - from/to mismatch"); conn->reply_start = from; conn->reply_length = to - from + 1;