#include #include #include #include #include #include #include #include #include "tlmplib.h" int daemon_init( const char *pidfile, const char *user) { int ret = -1; int fd = open ("/dev/null",O_RDONLY); if (fd == -1){ tlmp_error ("Can't open /dev/null, can't detach"); }else{ dup2 (fd,0); dup2 (fd,1); dup2 (fd,2); } setsid(); pid_t pid = fork(); if (pid == 0){ if (pidfile != NULL){ (pidfile,false); fprintf (fout,"%d\n",getpid()); return 0; } ret = 0; }else if (pid == (pid_t)-1){ tlmp_error ("Can't fork (%s)",strerror(errno)); }else{ exit (0); } if (user != NULL && strcmp(user,"root")!=0){ struct passwd *u = getpwnam(user) ; if (u == NULL){ tlmp_error ("Error retrieving uid/gid for user %s\n",user) ; }else{ setgid (u->pw_gid); setuid (u->pw_uid); } } return ret; }