Annotation of embedaddon/miniupnpd/daemonize.c, revision 1.1.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>