Compare commits
2 commits
7781c2b960
...
d2c3270b4b
Author | SHA1 | Date | |
---|---|---|---|
d2c3270b4b | |||
e9009b9198 |
1 changed files with 26 additions and 32 deletions
58
feuille.c
58
feuille.c
|
@ -218,6 +218,7 @@ int main(int argc, char *argv[])
|
||||||
if (argc != 0)
|
if (argc != 0)
|
||||||
usage(1);
|
usage(1);
|
||||||
|
|
||||||
|
|
||||||
/* output folder checks */
|
/* output folder checks */
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
|
|
||||||
|
@ -232,6 +233,20 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
chdir(path);
|
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) */
|
/* server socket creation (before dropping root permissions) */
|
||||||
verbose(1, "initializing server socket...");
|
verbose(1, "initializing server socket...");
|
||||||
|
|
||||||
|
@ -239,20 +254,17 @@ int main(int argc, char *argv[])
|
||||||
if ((server = initialize_server()) == -1)
|
if ((server = initialize_server()) == -1)
|
||||||
die(errno, "Failed to initialize server socket: %s\n", strerror(errno));
|
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 */
|
/* chroot and drop root permissions */
|
||||||
if (getuid() == 0) {
|
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);
|
verbose(2, "setting owner of `%s' to `%s'...", path, settings.user);
|
||||||
chown(path, uid, gid);
|
chown(path, uid, gid);
|
||||||
|
|
||||||
|
@ -272,31 +284,12 @@ int main(int argc, char *argv[])
|
||||||
puts("");
|
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 */
|
/* OpenBSD-only security measures */
|
||||||
#ifdef __OpenBSD__
|
#ifdef __OpenBSD__
|
||||||
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
pledge("proc stdio rpath wpath cpath inet", "stdio rpath wpath cpath inet");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* create a thread pool for incoming connections */
|
/* create a thread pool for incoming connections */
|
||||||
verbose(1, "initializing worker pool...");
|
verbose(1, "initializing worker pool...");
|
||||||
|
|
||||||
|
@ -379,6 +372,7 @@ int main(int argc, char *argv[])
|
||||||
die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
|
die(errno, "Could not initialize worker n. %d: %s\n", i, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
verbose(1, "all workers have been initialized.");
|
verbose(1, "all workers have been initialized.");
|
||||||
|
|
Reference in a new issue