Annotation of embedaddon/ntp/ntpsnmpd/netsnmp_daemonize.c, revision 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>