aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c58
1 files changed, 15 insertions, 43 deletions
diff --git a/src/server.c b/src/server.c
index 4430f7e..6ce4de4 100644
--- a/src/server.c
+++ b/src/server.c
@@ -103,28 +103,10 @@ static void handle_client(int fd, struct sockaddr_in *addr,
static void __attribute__((noreturn)) serv_cleanup(void)
{
- debugf("Shutdown server.\n");
-
- /* kill all our children (usually init claims them and wait()'s
- for them, but not always) */
- if(child_map)
- {
- struct sigaction sa;
- sigfillset(&sa.sa_mask);
- sigaddset(&sa.sa_mask, SIGCHLD);
- sa.sa_handler = SIG_IGN;
- sa.sa_flags = 0;
- sigaction(SIGCHLD, &sa, NULL); /* kill all children */
- void *ptr = child_map, *save;
- do {
- struct child_data *child = hash_iterate(ptr, &save, NULL);
- if(!child)
- break;
- ptr = NULL;
- kill(child->pid, SIGKILL);
- } while(1);
- handle_disconnects();
- }
+ if(!are_child)
+ debugf("Shutdown server.\n");
+ else
+ debugf("Shutdown worker.\n");
if(shutdown(server_socket, SHUT_RDWR) > 0)
error("shutdown");
@@ -136,6 +118,10 @@ static void __attribute__((noreturn)) serv_cleanup(void)
hash_free(child_map);
child_map = NULL;
+ extern void *dir_map;
+ hash_free(dir_map);
+ dir_map = NULL;
+
userdb_shutdown();
extern char *current_user;
@@ -150,7 +136,7 @@ static void __attribute__((noreturn)) serv_cleanup(void)
static void __attribute__((noreturn)) sigint_handler(int s)
{
(void) s;
- serv_cleanup();
+ exit(0);
}
static void check_userfile(void)
@@ -208,9 +194,6 @@ static int server_bind(void)
return sock;
}
-static SIMP_HASH(pid_t, pid_hash);
-static SIMP_EQUAL(pid_t, pid_equal);
-
static void childreq_cb(EV_P_ ev_io *w, int revents)
{
(void) EV_A;
@@ -337,6 +320,9 @@ static void init_signals(void)
error("sigaction");
}
+static SIMP_HASH(pid_t, pid_hash);
+static SIMP_EQUAL(pid_t, pid_equal);
+
int server_main(int argc, char *argv[])
{
debugf("*** Starting NetCosm %s (libev %d.%d, %s) ***\n",
@@ -353,6 +339,7 @@ int server_main(int argc, char *argv[])
srand(time(0));
server_socket = server_bind();
+
userdb_init(USERFILE);
check_userfile();
@@ -374,28 +361,13 @@ int server_main(int argc, char *argv[])
* because libev grabs SIGCHLD */
init_signals();
- /* drop root privileges */
- if(getuid() == 0)
- {
- struct passwd *nobody = getpwnam("nobody");
- if(!nobody)
- error("couldn't get unprivileged user");
- if(setgid(nobody->pw_gid) != 0)
- error("setgid");
- if(setuid(nobody->pw_uid) != 0)
- error("setuid");
- if(setuid(0) >= 0)
- error("failed to drop root");
- if(access(USERFILE, R_OK) >= 0)
- error("failed to drop root");
- debugf("Dropped root privileges.\n");
- }
-
ev_io server_watcher;
ev_io_init(&server_watcher, new_connection_cb, server_socket, EV_READ);
ev_set_priority(&server_watcher, EV_MAXPRI);
ev_io_start(EV_A_ &server_watcher);
+ atexit(serv_cleanup);
+
ev_loop(loop, 0);
/* should never get here */