const char *chroot_dir = NULL;
static void cb_chroot(const char *arg) { chroot_dir = arg; }
-static void cb_base(const char *arg) { http_init_base(arg); }
+const char *base = NULL;
+static void cb_base(const char *arg) { base = arg; }
const char *privdrop_user = NULL;
static void cb_user(const char *arg) { privdrop_user = arg; }
/* do this first as it forks - minimize memory use */
if (want_dns) dns_init(privdrop_user);
cap_init(interface, filter, want_promisc); /* needs root */
- http_init(bindaddr, bindport, /*maxconn=*/ -1); /* low ports need root */
+ http_init(base, bindaddr, bindport, /*maxconn=*/-1);
ncache_init(); /* must do before chroot() */
privdrop(chroot_dir, privdrop_user);
verbosef("shutting down");
verbosef("pcap stats: %u packets received, %u packets dropped",
pkts_recv, pkts_drop);
+ http_stop();
cap_stop();
dns_stop();
if (export_fn != NULL) db_export(export_fn);
#include <unistd.h>
#include <zlib.h>
-const char *base_url = "/";
+char *base_url = NULL;
static const char mime_type_xml[] = "text/xml";
static const char mime_type_html[] = "text/html; charset=us-ascii";
/* --------------------------------------------------------------------------
* Initialize the base path.
*/
-void http_init_base(const char *url)
+static void http_init_base(const char *url)
{
char *slashed_url, *safe_url;
size_t urllen;
+ if (url == NULL) {
+ base_url = strdup("/");
+ return;
+ }
+
/* make sure that the url has leading and trailing slashes */
urllen = strlen(url);
slashed_url = xmalloc(urllen+3);
/* clean the url */
safe_url = make_safe_uri(slashed_url);
free(slashed_url);
- if (safe_url == NULL)
- {
- verbosef("invalid base \"%s\", ignored", url, "/");
+ if (safe_url == NULL) {
+ verbosef("invalid base \"%s\", ignored", url);
+ base_url = strdup("/"); /* set to default */
return;
}
-
- base_url = safe_url;
+ else
+ base_url = safe_url;
}
/* --------------------------------------------------------------------------
* Initialize the sockin global. This is the socket that we accept
* connections from. Pass -1 as max_conn for system limit.
*/
-void http_init(const char *bindaddr, const unsigned short bindport,
- const int max_conn)
+void http_init(const char *base, const char *bindaddr,
+ const unsigned short bindport, const int max_conn)
{
struct sockaddr_storage addrin;
struct addrinfo hints, *ai, *aiptr;
char ipaddr[INET6_ADDRSTRLEN], portstr[12];
int sockopt, ret;
+ http_init_base(base);
+
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
}
}
+void http_stop(void) {
+ free(base_url);
+ close(sockin);
+}
+
/* vim:set ts=4 sw=4 et tw=78: */
#include <sys/select.h>
#include <netinet/in.h>
-extern const char *base_url;
+extern char *base_url;
-void http_init_base(const char *path);
-void http_init(const char * bindaddr, const unsigned short bindport,
- const int max_conn);
+void http_init(const char *base, const char * bindaddr,
+ const unsigned short bindport, const int max_conn);
void http_fd_set(fd_set *recv_set, fd_set *send_set, int *max_fd,
struct timeval *timeout, int *need_timeout);
void http_poll(fd_set *read_set, fd_set *write_set);
+void http_stop(void);
/* vim:set ts=3 sw=3 tw=78 expandtab: */