(root)/
glibc-2.38/
misc/
daemon.c
       1  /*-
       2   * Copyright (c) 1990, 1993
       3   *	The Regents of the University of California.  All rights reserved.
       4   *
       5   * Redistribution and use in source and binary forms, with or without
       6   * modification, are permitted provided that the following conditions
       7   * are met:
       8   * 1. Redistributions of source code must retain the above copyright
       9   *    notice, this list of conditions and the following disclaimer.
      10   * 2. Redistributions in binary form must reproduce the above copyright
      11   *    notice, this list of conditions and the following disclaimer in the
      12   *    documentation and/or other materials provided with the distribution.
      13   * 4. Neither the name of the University nor the names of its contributors
      14   *    may be used to endorse or promote products derived from this software
      15   *    without specific prior written permission.
      16   *
      17   * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      18   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      19   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      20   * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      21   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      22   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      23   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      24   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      25   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      26   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      27   * SUCH DAMAGE.
      28   */
      29  
      30  #if defined(LIBC_SCCS) && !defined(lint)
      31  static char sccsid[] = "@(#)daemon.c	8.1 (Berkeley) 6/4/93";
      32  #endif /* LIBC_SCCS and not lint */
      33  
      34  #include <errno.h>
      35  #include <fcntl.h>
      36  #include <paths.h>
      37  #include <unistd.h>
      38  #include <sys/stat.h>
      39  
      40  #include <device-nrs.h>
      41  #include <not-cancel.h>
      42  
      43  int
      44  daemon (int nochdir, int noclose)
      45  {
      46    int fd;
      47  
      48    switch (__fork ())
      49      {
      50      case -1:
      51        return -1;
      52  
      53      case 0:
      54        break;
      55  
      56      default:
      57        _exit (0);
      58      }
      59  
      60    if (__setsid () == -1)
      61      return -1;
      62  
      63    if (!nochdir)
      64      (void) __chdir ("/");
      65  
      66    if (!noclose)
      67      {
      68        struct __stat64_t64 st;
      69  
      70        fd = __open_nocancel (_PATH_DEVNULL, O_RDWR, 0);
      71        if (fd != -1 && __glibc_likely (__fstat64_time64 (fd, &st) == 0))
      72          {
      73            if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
      74  #if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
      75                && (st.st_rdev == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
      76  #endif
      77               )
      78              {
      79                (void) __dup2 (fd, STDIN_FILENO);
      80                (void) __dup2 (fd, STDOUT_FILENO);
      81                (void) __dup2 (fd, STDERR_FILENO);
      82                if (fd > 2)
      83                  (void) __close (fd);
      84              }
      85            else
      86              {
      87                /* We must set an errno value since no function call
      88                   actually failed.  */
      89                __close_nocancel_nostatus (fd);
      90                __set_errno (ENODEV);
      91                return -1;
      92              }
      93          }
      94        else
      95          {
      96            __close_nocancel_nostatus (fd);
      97            return -1;
      98          }
      99      }
     100  
     101    return 0;
     102  }