diff --git a/feuille.c b/feuille.c index 67787ad..4222ffd 100644 --- a/feuille.c +++ b/feuille.c @@ -218,7 +218,6 @@ int main(int argc, char *argv[]) if (argc != 0) usage(1); - /* output folder checks */ char path[PATH_MAX]; @@ -233,20 +232,6 @@ int main(int argc, char *argv[]) chdir(path); - /* user checks */ - if (strlen(settings.user) == 0) - settings.user = "nobody"; - - verbose(2, "getting uid and gid of user `%s'...", settings.user); - - struct passwd *user; - if ((user = getpwnam(settings.user)) == NULL) - die(1, "User `%s' doesn't exist\n", settings.user); - - int uid = user->pw_uid; - int gid = user->pw_gid; - - /* server socket creation (before dropping root permissions) */ verbose(1, "initializing server socket..."); @@ -254,17 +239,20 @@ int main(int argc, char *argv[]) if ((server = initialize_server()) == -1) die(errno, "Failed to initialize server socket: %s\n", strerror(errno)); - /* make feuille run in the background */ - if (!settings.foreground) { - verbose(1, "making feuille run in the background..."); - verbose(2, "closing input / output file descriptors..."); - - daemon(1, 0); - } - - /* chroot and drop root permissions */ if (getuid() == 0) { + if (strlen(settings.user) == 0) + settings.user = "nobody"; + + verbose(2, "getting uid and gid of user `%s'...", settings.user); + + struct passwd *user; + if ((user = getpwnam(settings.user)) == NULL) + die(1, "User `%s' doesn't exist\n", settings.user); + + int uid = user->pw_uid; + int gid = user->pw_gid; + verbose(2, "setting owner of `%s' to `%s'...", path, settings.user); chown(path, uid, gid); @@ -284,12 +272,31 @@ int main(int argc, char *argv[]) puts(""); } + /* run feuille in the background */ + if (!settings.foreground) { + verbose(1, "making feuille run in the background..."); + verbose(2, "closing input / output file descriptors..."); + + int pid; + if ((pid = fork()) < 0) + exit(1); + + else if (pid > 0) + exit(0); + + if (setsid() < 0) + exit(1); + + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); + } + /* OpenBSD-only security measures */ #ifdef __OpenBSD__ pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet"); #endif - /* create a thread pool for incoming connections */ verbose(1, "initializing worker pool..."); @@ -372,7 +379,6 @@ int main(int argc, char *argv[]) die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno)); } - sleep(1); verbose(1, "all workers have been initialized.");