aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-02-01 22:12:12 -0500
committerFranklin Wei <git@fwei.tk>2016-02-01 22:12:12 -0500
commita006044fbcb3355f0fa063720e7c41f4971894a0 (patch)
treed831c6f9a1cc5e9b9166b22be2194c4fd407dec7 /src/server.c
parent7e223238ec9d6711290b1718c44cfe8158477b71 (diff)
downloadnetcosm-a006044fbcb3355f0fa063720e7c41f4971894a0.zip
netcosm-a006044fbcb3355f0fa063720e7c41f4971894a0.tar.gz
netcosm-a006044fbcb3355f0fa063720e7c41f4971894a0.tar.bz2
netcosm-a006044fbcb3355f0fa063720e7c41f4971894a0.tar.xz
better command parsing
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/server.c b/src/server.c
index d65a3f1..0b1569d 100644
--- a/src/server.c
+++ b/src/server.c
@@ -118,6 +118,7 @@ static void __attribute__((noreturn)) serv_cleanup(void)
close(server_socket);
/* shut down modules */
+ client_shutdown();
obj_shutdown();
reqmap_free();
userdb_shutdown();
@@ -380,28 +381,32 @@ static void parse_args(int argc, char *argv[])
static SIMP_HASH(pid_t, pid_hash);
static SIMP_EQUAL(pid_t, pid_equal);
-int server_main(int argc, char *argv[])
+static void check_libs(void)
{
debugf("*** Starting NetCosm %s (libev %d.%d, %s) ***\n",
NETCOSM_VERSION, EV_VERSION_MAJOR, EV_VERSION_MINOR, OPENSSL_VERSION_TEXT);
-
assert(ev_version_major() == EV_VERSION_MAJOR &&
ev_version_minor() >= EV_VERSION_MINOR);
+}
- parse_args(argc, argv);
+int server_main(int argc, char *argv[])
+{
+ check_libs();
- srand(time(0));
+ parse_args(argc, argv);
server_socket = server_bind();
userdb_init(USERFILE);
check_userfile();
-
load_worldfile();
reqmap_init();
+ /* save some time after a fork() */
+ client_init();
+
/* this initial size very low to make iteration faster */
child_map = hash_init(16, pid_hash, pid_equal);
hash_setfreedata_cb(child_map, free_child_data);
@@ -409,7 +414,7 @@ int server_main(int argc, char *argv[])
debugf("Listening on port %d\n", port);
- struct ev_loop *loop = EV_DEFAULT;
+ struct ev_loop *loop = ev_default_loop(0);
/* we initialize signals after creating the default event loop
* because libev grabs SIGCHLD */
@@ -418,10 +423,12 @@ int server_main(int argc, char *argv[])
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);
+ /* everything's ready, hand it over to libev */
ev_loop(loop, 0);
/* should never get here */