Annotation of embedaddon/miniupnpd/daemonize.c, revision 1.1

1.1     ! misho       1: /* $Id: daemonize.c,v 1.11 2008/01/29 13:04:45 nanard Exp $ */
        !             2: /* MiniUPnP project
        !             3:  * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
        !             4:  * (c) 2006 Thomas Bernard 
        !             5:  * This software is subject to the conditions detailed
        !             6:  * in the LICENCE file provided within the distribution */
        !             7: 
        !             8: #include <sys/types.h>
        !             9: #include <sys/stat.h>
        !            10: #include <unistd.h>
        !            11: #include <fcntl.h>
        !            12: #include <stdio.h>
        !            13: #include <stdlib.h>
        !            14: #include <syslog.h>
        !            15: #include <string.h>
        !            16: #include <signal.h>
        !            17: 
        !            18: #include "daemonize.h"
        !            19: #include "config.h"
        !            20: 
        !            21: #ifndef USE_DAEMON
        !            22: 
        !            23: int
        !            24: daemonize(void)
        !            25: {
        !            26:        int pid, i;
        !            27: 
        !            28:        switch(fork())
        !            29:        {
        !            30:        /* fork error */
        !            31:        case -1:
        !            32:                perror("fork()");
        !            33:                exit(1);
        !            34:        
        !            35:        /* child process */
        !            36:        case 0:
        !            37:                /* obtain a new process group */
        !            38:                if( (pid = setsid()) < 0)
        !            39:                {
        !            40:                        perror("setsid()");
        !            41:                        exit(1);
        !            42:                }
        !            43: 
        !            44:                /* close all descriptors */
        !            45:                for (i=getdtablesize();i>=0;--i) close(i);              
        !            46: 
        !            47:                i = open("/dev/null",O_RDWR); /* open stdin */
        !            48:                dup(i); /* stdout */
        !            49:                dup(i); /* stderr */
        !            50: 
        !            51:                umask(027);
        !            52:                chdir("/"); /* chdir to /tmp ? */                       
        !            53: 
        !            54:                return pid;
        !            55: 
        !            56:        /* parent process */
        !            57:        default:
        !            58:                exit(0);
        !            59:        }
        !            60: }
        !            61: #endif
        !            62: 
        !            63: int
        !            64: writepidfile(const char * fname, int pid)
        !            65: {
        !            66:        char pidstring[16];
        !            67:        int pidstringlen;
        !            68:        int pidfile;
        !            69: 
        !            70:        if(!fname || (strlen(fname) == 0))
        !            71:                return -1;
        !            72:        
        !            73:        if( (pidfile = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0)
        !            74:        {
        !            75:                syslog(LOG_ERR, "Unable to open pidfile for writing %s: %m", fname);
        !            76:                return -1;
        !            77:        }
        !            78: 
        !            79:        pidstringlen = snprintf(pidstring, sizeof(pidstring), "%d\n", pid);
        !            80:        if(pidstringlen <= 0)
        !            81:        {
        !            82:                syslog(LOG_ERR, 
        !            83:                        "Unable to write to pidfile %s: snprintf(): FAILED", fname);
        !            84:                close(pidfile);
        !            85:                return -1;
        !            86:        }
        !            87:        else
        !            88:        {
        !            89:                if(write(pidfile, pidstring, pidstringlen) < 0)
        !            90:                        syslog(LOG_ERR, "Unable to write to pidfile %s: %m", fname);
        !            91:        }
        !            92: 
        !            93:        close(pidfile);
        !            94: 
        !            95:        return 0;
        !            96: }
        !            97: 
        !            98: int
        !            99: checkforrunning(const char * fname)
        !           100: {
        !           101:        char buffer[64];
        !           102:        int pidfile;
        !           103:        pid_t pid;
        !           104: 
        !           105:        if(!fname || (strlen(fname) == 0))
        !           106:                return -1;
        !           107: 
        !           108:        if( (pidfile = open(fname, O_RDONLY)) < 0)
        !           109:                return 0;
        !           110:        
        !           111:        memset(buffer, 0, 64);
        !           112:        
        !           113:        if(read(pidfile, buffer, 63))
        !           114:        {
        !           115:                if( (pid = atol(buffer)) > 0)
        !           116:                {
        !           117:                        if(!kill(pid, 0))
        !           118:                        {
        !           119:                                close(pidfile);
        !           120:                                return -2;
        !           121:                        }
        !           122:                }
        !           123:        }
        !           124:        
        !           125:        close(pidfile);
        !           126:        
        !           127:        return 0;
        !           128: }
        !           129: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>