File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / ntpsnmpd / netsnmp_daemonize.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>