#include #include #include #include #include #include #include #include #include pid_t fork_proc() { /* Fork off the parent. */ pid_t pid = fork(); /* The process id is non zero, so it must be the parent process. */ if (pid) { /* Exit with EXIT_FAILURE if the parent's pid is * negative, otherwise exit with EXIT_SUCCESS. */ exit((pid < 0) ? EXIT_FAILURE : EXIT_SUCCESS); } return pid; } void child_handler(int sig_num) { signal(SIGCHLD, child_handler); } void hangup_handler(int sig_num) { signal(SIGHUP, hangup_handler); } void init_daemon(int change_dir, char *path) { /* Fork the parent. */ pid_t pid = fork_proc(); /* Exit if the child process isn't the session leader. */ if (setsid() < 0) { exit(EXIT_FAILURE); } /* Catch, ignore, and/or handle signals. */ signal(SIGCHLD, child_handler); signal(SIGHUP, hangup_handler); /* Fork again. */ pid = fork_proc(); /* Set new file permissions. */ umask(0); /* If change_dir is true, change the working directory to path, or * the root directory if path isn't set. */ if (change_dir) { chdir((!path) ? "/" : path); } /* Close any open file descriptors. */ for (int i = sysconf(_SC_OPEN_MAX); i >= 0; close(i--)); /* Open the logfile. */ openlog("pullreqd", LOG_PID, LOG_DAEMON); } int main(int argc, char **argv) { init_daemon(1, "/"); syslog(LOG_NOTICE, "pullreqd started."); for (;;) { break; } syslog(LOG_NOTICE, "pullreqd stopped."); closelog(); return EXIT_SUCCESS; }