-static pid_t daemonize(const char *lockfile, char *tty, char *name)
-{
- pid_t pid, sid, parent;
- int lfp = -1;
- FILE *pFile;
- char const *pidprefix = "/var/run/";
- char const *pidsuffix = ".pid";
-
- snprintf(pidfile, PIDFILE_LENGTH, "%s%s-%s%s", pidprefix, DAEMON_NAME, tty, pidsuffix);
-
- /* already a daemon */
- if (getppid() == 1)
- return 0;
-
- /* Create the lock file as the current user */
- if (lockfile && lockfile[0]) {
-
- lfp = open(lockfile, O_RDWR | O_CREAT, 0640);
- if (lfp < 0)
- {
- syslog(LOG_ERR, "unable to create lock file %s, code=%d (%s)",
- lockfile, errno, strerror(errno));
- exit(EXIT_FAILURE);
- }
- }
-
- /* Drop user if there is one, and we were run as root */
- if (getuid() == 0 || geteuid() == 0) {
- struct passwd *pw = getpwnam(RUN_AS_USER);
-
- if (pw)
- {
- /* syslog(LOG_NOTICE, "setting user to " RUN_AS_USER); */
- setuid(pw->pw_uid);
- }
- }
-
- /* Trap signals that we expect to receive */
- signal(SIGINT, child_handler);
- signal(SIGTERM, child_handler);
- signal(SIGCHLD, child_handler);
- signal(SIGUSR1, child_handler);
- signal(SIGALRM, child_handler);
-
- /* Fork off the parent process */
- pid = fork();
- if (pid < 0) {
- syslog(LOG_ERR, "unable to fork daemon, code=%d (%s)",
- errno, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- /* If we got a good PID, then we can exit the parent process. */
- if (pid > 0) {
- /* Wait for confirmation from the child via SIGTERM or SIGCHLD, or
- for five seconds to elapse (SIGALRM). pause() should not return. */
- alarm(5);
- pause();
- exit(EXIT_FAILURE);
- }
-
- /* At this point we are executing as the child process */
- parent = getppid();
-
- /* Cancel certain signals */
- signal(SIGCHLD, SIG_DFL); /* A child process dies */
- signal(SIGTSTP, SIG_IGN); /* Various TTY signals */
- signal(SIGTTOU, SIG_IGN);
- signal(SIGTTIN, SIG_IGN);
- signal(SIGHUP, SIG_IGN); /* Ignore hangup signal */
- signal(SIGINT, child_handler);
- signal(SIGTERM, child_handler);
-
- /* Change the file mode mask */
- umask(0);
-
- /* Create a new SID for the child process */
- sid = setsid();
- if (sid < 0) {
- syslog(LOG_ERR, "unable to create a new session, code %d (%s)",
- errno, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- pFile = fopen(pidfile, "w");
- if (NULL == pFile) {
- syslog(LOG_ERR, "unable to create pid file %s, code=%d (%s)",
- pidfile, errno, strerror(errno));
- exit(EXIT_FAILURE);
- }
- fprintf(pFile, "%d\n", sid);
- fclose(pFile);
-
- /* Change the current working directory. This prevents the current
- directory from being locked; hence not being able to remove it. */
- if (chdir("/") < 0) {
- syslog(LOG_ERR, "unable to change directory to %s, code %d (%s)",
- "/", errno, strerror(errno));
- exit(EXIT_FAILURE);
- }
-
- /* Redirect standard files to /dev/null */
- pFile = freopen("/dev/null", "r", stdin);
- pFile = freopen("/dev/null", "w", stdout);
- pFile = freopen("/dev/null", "w", stderr);
-
- /* Tell the parent process that we are A-okay */
- /* kill(parent, SIGUSR1); */
- return parent;
-}
-