glibc/misc/daemon.c History
<<
>>
Prefs
   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)
  31static 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
  43int
  44daemon(nochdir, noclose)
  45        int nochdir, noclose;
  46{
  47        int fd;
  48
  49        switch (__fork()) {
  50        case -1:
  51                return (-1);
  52        case 0:
  53                break;
  54        default:
  55                _exit(0);
  56        }
  57
  58        if (__setsid() == -1)
  59                return (-1);
  60
  61        if (!nochdir)
  62                (void)__chdir("/");
  63
  64        if (!noclose) {
  65                struct stat64 st;
  66
  67                if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
  68                    && (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
  69                        == 0)) {
  70                        if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
  71#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
  72                            && (st.st_rdev
  73                                == makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
  74#endif
  75                            ) {
  76                                (void)__dup2(fd, STDIN_FILENO);
  77                                (void)__dup2(fd, STDOUT_FILENO);
  78                                (void)__dup2(fd, STDERR_FILENO);
  79                                if (fd > 2)
  80                                        (void)__close (fd);
  81                        } else {
  82                                /* We must set an errno value since no
  83                                   function call actually failed.  */
  84                                close_not_cancel_no_status (fd);
  85                                __set_errno (ENODEV);
  86                                return -1;
  87                        }
  88                } else {
  89                        close_not_cancel_no_status (fd);
  90                        return -1;
  91                }
  92        }
  93        return (0);
  94}
  95