diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-18 18:05:48 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-18 18:05:58 -0500 |
| commit | 3b364f97f6122618cce35fa24633faaf9ab4e685 (patch) | |
| tree | 4fdaee890be078262d2039b2576f8aff70cc326c /src/server.c | |
| parent | dfa1581f631a233b33ebc64ad2117498600c1b8d (diff) | |
| download | netcosm-3b364f97f6122618cce35fa24633faaf9ab4e685.zip netcosm-3b364f97f6122618cce35fa24633faaf9ab4e685.tar.gz netcosm-3b364f97f6122618cce35fa24633faaf9ab4e685.tar.bz2 netcosm-3b364f97f6122618cce35fa24633faaf9ab4e685.tar.xz | |
drop libgcrypt because of all its memory leaks; openssl is used instead
Diffstat (limited to 'src/server.c')
| -rw-r--r-- | src/server.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/src/server.c b/src/server.c index c8fa8c3..4430f7e 100644 --- a/src/server.c +++ b/src/server.c @@ -337,16 +337,14 @@ static void init_signals(void) error("sigaction"); } -int main(int argc, char *argv[]) +int server_main(int argc, char *argv[]) { - debugf("*** Starting NetCosm "NETCOSM_VERSION" (libev %d.%d, libgcrypt "GCRYPT_VERSION") ***\n", - EV_VERSION_MAJOR, EV_VERSION_MINOR); + 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); - assert(!strcmp(GCRYPT_VERSION, gcry_check_version(GCRYPT_VERSION))); - if(argc != 2) port = PORT; else @@ -372,9 +370,27 @@ int main(int argc, char *argv[]) struct ev_loop *loop = EV_DEFAULT; - /* we initialize signals after creating the default event loop */ + /* we initialize signals after creating the default event loop + * 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); |