Annotation of embedaddon/ntp/ntpsnmpd/netsnmp_daemonize.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * system.c
                      3:  */
                      4: /* Portions of this file are subject to the following copyright(s).  See
                      5:  * the Net-SNMP's COPYING file for more details and other copyrights
                      6:  * that may apply:
                      7:  */
                      8: /***********************************************************
                      9:         Copyright 1992 by Carnegie Mellon University
                     10: 
                     11:                       All Rights Reserved
                     12: 
                     13: Permission to use, copy, modify, and distribute this software and its
                     14: documentation for any purpose and without fee is hereby granted,
                     15: provided that the above copyright notice appear in all copies and that
                     16: both that copyright notice and this permission notice appear in
                     17: supporting documentation, and that the name of CMU not be
                     18: used in advertising or publicity pertaining to distribution of the
                     19: software without specific, written prior permission.
                     20: 
                     21: CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     22: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     23: CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     24: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     25: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     26: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     27: SOFTWARE.
                     28: ******************************************************************/
                     29: /*
                     30:  * Portions of this file are copyrighted by:
                     31:  * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
                     32:  * Use is subject to license terms specified in the COPYING file
                     33:  * distributed with the Net-SNMP package.
                     34:  */
                     35: /*
                     36:  * System dependent routines go here
                     37:  */
                     38: #include <net-snmp/net-snmp-config.h>
                     39: #undef PACKAGE_BUGREPORT
                     40: #undef PACKAGE_NAME
                     41: #undef PACKAGE_STRING
                     42: #undef PACKAGE_TARNAME
                     43: #undef PACKAGE_VERSION
                     44: #include <config.h>
                     45: 
                     46: #ifdef NEED_NETSNMP_DAEMONIZE
                     47: 
                     48: #include <stdio.h>
                     49: #include <ctype.h>
                     50: #include <errno.h>
                     51: 
                     52: #if HAVE_UNISTD_H
                     53: #include <unistd.h>
                     54: #endif
                     55: #if HAVE_STDLIB_H
                     56: #include <stdlib.h>
                     57: #endif
                     58: 
                     59: #if TIME_WITH_SYS_TIME
                     60: # ifdef WIN32
                     61: #  include <sys/timeb.h>
                     62: # else
                     63: #  include <sys/time.h>
                     64: # endif
                     65: # include <time.h>
                     66: #else
                     67: # if HAVE_SYS_TIME_H
                     68: #  include <sys/time.h>
                     69: # else
                     70: #  include <time.h>
                     71: # endif
                     72: #endif
                     73: 
                     74: #include <sys/types.h>
                     75: 
                     76: #if HAVE_NETINET_IN_H
                     77: #include <netinet/in.h>
                     78: #endif
                     79: 
                     80: #if HAVE_WINSOCK_H
                     81: #include <winsock.h>
                     82: #endif
                     83: #if HAVE_SYS_SOCKET_H
                     84: #include <sys/socket.h>
                     85: #endif
                     86: #if HAVE_NET_IF_H
                     87: #include <net/if.h>
                     88: #endif
                     89: 
                     90: #if HAVE_SYS_SOCKIO_H
                     91: #include <sys/sockio.h>
                     92: #endif
                     93: 
                     94: #if HAVE_SYS_IOCTL_H
                     95: #include <sys/ioctl.h>
                     96: #endif
                     97: 
                     98: #ifdef HAVE_NLIST_H
                     99: #include <nlist.h>
                    100: #endif
                    101: 
                    102: #if HAVE_SYS_FILE_H
                    103: #include <sys/file.h>
                    104: #endif
                    105: 
                    106: #if HAVE_KSTAT_H
                    107: #include <kstat.h>
                    108: #endif
                    109: 
                    110: #if HAVE_SYS_PARAM_H
                    111: #include <sys/param.h>
                    112: #endif
                    113: #if HAVE_SYS_SYSCTL_H
                    114: #include <sys/sysctl.h>
                    115: #endif
                    116: 
                    117: #if HAVE_STRING_H
                    118: #include <string.h>
                    119: #else
                    120: #include <strings.h>
                    121: #endif
                    122: 
                    123: #if HAVE_DMALLOC_H
                    124: #include <dmalloc.h>
                    125: #endif
                    126: 
                    127: #ifdef HAVE_SYS_STAT_H
                    128: #include <sys/stat.h>
                    129: #endif
                    130: #if HAVE_FCNTL_H
                    131: #include <fcntl.h>
                    132: #endif
                    133: 
                    134: #if defined(hpux10) || defined(hpux11)
                    135: #include <sys/pstat.h>
                    136: #endif
                    137: 
                    138: #if HAVE_SYS_UTSNAME_H
                    139: #include <sys/utsname.h>
                    140: #endif
                    141: 
                    142: #if HAVE_SYS_SYSTEMCFG_H
                    143: #include <sys/systemcfg.h>
                    144: #endif
                    145: 
                    146: #if HAVE_SYS_SYSTEMINFO_H
                    147: #include <sys/systeminfo.h>
                    148: #endif
                    149: 
                    150: #include <net-snmp/types.h>
                    151: #include <net-snmp/output_api.h>
                    152: #include <net-snmp/utilities.h>
                    153: #include <net-snmp/library/system.h>    /* for "internal" definitions */
                    154: 
                    155: #include <net-snmp/library/snmp_api.h>
                    156: #include <net-snmp/library/read_config.h> /* for get_temp_file_pattern() */
                    157: 
                    158: #ifndef IFF_LOOPBACK
                    159: #      define IFF_LOOPBACK 0
                    160: #endif
                    161: 
                    162: #ifdef  INADDR_LOOPBACK
                    163: # define LOOPBACK    INADDR_LOOPBACK
                    164: #else
                    165: # define LOOPBACK    0x7f000001
                    166: #endif
                    167: 
                    168: /**
                    169:  * fork current process into the background.
                    170:  *
                    171:  * This function forks a process into the background, in order to
                    172:  * become a daemon process. It does a few things along the way:
                    173:  *
                    174:  * - becoming a process/session group leader, and  forking a second time so
                    175:  *   that process/session group leader can exit.
                    176:  *
                    177:  * - changing the working directory to /
                    178:  *
                    179:  * - closing stdin, stdout and stderr (unless stderr_log is set) and
                    180:  *   redirecting them to /dev/null
                    181:  *
                    182:  * @param quit_immediately : indicates if the parent process should
                    183:  *                           exit after a successful fork.
                    184:  * @param stderr_log       : indicates if stderr is being used for
                    185:  *                           logging and shouldn't be closed
                    186:  * @returns -1 : fork error
                    187:  *           0 : child process returning
                    188:  *          >0 : parent process returning. returned value is the child PID.
                    189:  */
                    190: int
                    191: netsnmp_daemonize(int quit_immediately, int stderr_log)
                    192: {
                    193:     int i = 0;
                    194:     DEBUGMSGT(("daemonize","deamonizing...\n"));
                    195: #if HAVE_WORKING_FORK
                    196:     /*
                    197:      * Fork to return control to the invoking process and to
                    198:      * guarantee that we aren't a process group leader.
                    199:      */
                    200:     i = fork();
                    201:     if (i != 0) {
                    202:         /* Parent. */
                    203:         DEBUGMSGT(("daemonize","first fork returned %d.\n", i));
                    204:         if(i == -1) {
                    205:             snmp_log(LOG_ERR,"first fork failed (errno %d) in "
                    206:                      "netsnmp_daemonize()\n", errno);
                    207:             return -1;
                    208:         }
                    209:         if (quit_immediately) {
                    210:             DEBUGMSGT(("daemonize","parent exiting\n"));
                    211:             exit(0);
                    212:         }
                    213:     } else {
                    214:         /* Child. */
                    215: #ifdef HAVE_SETSID
                    216:         /* Become a process/session group leader. */
                    217:         setsid();
                    218: #endif
                    219:         /*
                    220:          * Fork to let the process/session group leader exit.
                    221:          */
                    222:         if ((i = fork()) != 0) {
                    223:             DEBUGMSGT(("daemonize","second fork returned %d.\n", i));
                    224:             if(i == -1) {
                    225:                 snmp_log(LOG_ERR,"second fork failed (errno %d) in "
                    226:                          "netsnmp_daemonize()\n", errno);
                    227:             }
                    228:             /* Parent. */
                    229:             exit(0);
                    230:         }
                    231: #ifndef WIN32
                    232:         else {
                    233:             /* Child. */
                    234:             
                    235:             DEBUGMSGT(("daemonize","child continuing\n"));
                    236: 
                    237:             /* Avoid keeping any directory in use. */
                    238:             chdir("/");
                    239:             
                    240:             if (!stderr_log) {
                    241:                 /*
                    242:                  * Close inherited file descriptors to avoid
                    243:                  * keeping unnecessary references.
                    244:                  */
                    245:                 close(0);
                    246:                 close(1);
                    247:                 close(2);
                    248:                 
                    249:                 /*
                    250:                  * Redirect std{in,out,err} to /dev/null, just in
                    251:                  * case.
                    252:                  */
                    253:                 open("/dev/null", O_RDWR);
                    254:                 dup(0);
                    255:                 dup(0);
                    256:             }
                    257:         }
                    258: #endif /* !WIN32 */
                    259:     }
                    260: #endif /* HAVE_WORKING_FORK */
                    261:     return i;
                    262: }
                    263: 
                    264: #else /* !NEED_NETSNMP_DAEMONIZE */
                    265: int netsnp_daemonize_bs;
                    266: #endif

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