51 lines
930 B
C
51 lines
930 B
C
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
#include <pwd.h>
|
|
|
|
#include "hlswmaster.h"
|
|
|
|
void daemonize(char *pw_name) {
|
|
int fail = 0;
|
|
pid_t pid;
|
|
struct passwd *pwl;
|
|
|
|
if ((pid = fork()) < 0) {
|
|
log_print("daemonize(): fork()");
|
|
exit(-1);
|
|
|
|
} else if (pid != 0) {
|
|
exit(0);
|
|
|
|
} else {
|
|
/* Kindprozess weiterlaufen lassen */
|
|
if (setsid() == -1) {
|
|
log_print("daemonize: setsid()");
|
|
exit(-1);
|
|
}
|
|
|
|
umask(0) ;
|
|
|
|
if (pw_name != NULL) {
|
|
if((pwl = getpwnam(pw_name)) == NULL) {
|
|
log_print("mkdaemon(): getpwnam(\"%s\")", pw_name);
|
|
exit(-1);
|
|
}
|
|
|
|
if (setgid(pwl->pw_gid) != 0) {
|
|
log_print("mkdaemon(): setgid()");
|
|
fail = 1;
|
|
}
|
|
|
|
if (setuid(pwl->pw_uid) != 0) {
|
|
log_print("mkdaemon(): setuid()");
|
|
fail = 1;
|
|
}
|
|
|
|
if (fail == 0) {
|
|
log_print("user changed to: %s, pid: %d", pw_name, getpid());
|
|
}
|
|
}
|
|
}
|
|
}
|