detach.c revision 1.3.6.1 1 1.3.6.1 pgoyette /* $NetBSD: detach.c,v 1.3.6.1 2017/03/20 06:56:15 pgoyette Exp $ */
2 1.2 mrg
3 1.1 lukem /* detach.c -- routines to daemonize a process */
4 1.3 tron /* $OpenLDAP$ */
5 1.1 lukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6 1.1 lukem *
7 1.3.6.1 pgoyette * Copyright 1998-2016 The OpenLDAP Foundation.
8 1.1 lukem * All rights reserved.
9 1.1 lukem *
10 1.1 lukem * Redistribution and use in source and binary forms, with or without
11 1.1 lukem * modification, are permitted only as authorized by the OpenLDAP
12 1.1 lukem * Public License.
13 1.1 lukem *
14 1.1 lukem * A copy of this license is available in the file LICENSE in the
15 1.1 lukem * top-level directory of the distribution or, alternatively, at
16 1.1 lukem * <http://www.OpenLDAP.org/license.html>.
17 1.1 lukem */
18 1.1 lukem /*
19 1.1 lukem * Copyright (c) 1990, 1994 Regents of the University of Michigan.
20 1.1 lukem * All rights reserved.
21 1.1 lukem *
22 1.1 lukem * Redistribution and use in source and binary forms are permitted
23 1.1 lukem * provided that this notice is preserved and that due credit is given
24 1.1 lukem * to the University of Michigan at Ann Arbor. The name of the University
25 1.1 lukem * may not be used to endorse or promote products derived from this
26 1.1 lukem * software without specific prior written permission. This software
27 1.1 lukem * is provided ``as is'' without express or implied warranty.
28 1.1 lukem */
29 1.1 lukem /* This work was originally developed by the University of Michigan
30 1.1 lukem * and distributed as part of U-MICH LDAP.
31 1.1 lukem */
32 1.1 lukem
33 1.3.6.1 pgoyette #include <sys/cdefs.h>
34 1.3.6.1 pgoyette __RCSID("$NetBSD: detach.c,v 1.3.6.1 2017/03/20 06:56:15 pgoyette Exp $");
35 1.3.6.1 pgoyette
36 1.1 lukem #include "portable.h"
37 1.1 lukem
38 1.1 lukem #include <stdio.h>
39 1.1 lukem
40 1.1 lukem #include <ac/stdlib.h>
41 1.1 lukem #include <ac/signal.h>
42 1.1 lukem #include <ac/socket.h>
43 1.1 lukem #include <ac/unistd.h>
44 1.1 lukem
45 1.1 lukem #include <sys/stat.h>
46 1.1 lukem #include <fcntl.h>
47 1.1 lukem
48 1.1 lukem #ifdef HAVE_SYS_FILE_H
49 1.1 lukem #include <sys/file.h>
50 1.1 lukem #endif
51 1.1 lukem #ifdef HAVE_SYS_IOCTL_H
52 1.1 lukem #include <sys/ioctl.h>
53 1.1 lukem #endif
54 1.1 lukem
55 1.1 lukem #include "lutil.h"
56 1.1 lukem
57 1.3 tron int
58 1.1 lukem lutil_detach( int debug, int do_close )
59 1.1 lukem {
60 1.3 tron int i, sd, nbits, pid;
61 1.1 lukem
62 1.1 lukem #ifdef HAVE_SYSCONF
63 1.1 lukem nbits = sysconf( _SC_OPEN_MAX );
64 1.1 lukem #elif defined(HAVE_GETDTABLESIZE)
65 1.1 lukem nbits = getdtablesize();
66 1.1 lukem #else
67 1.1 lukem nbits = FD_SETSIZE;
68 1.1 lukem #endif
69 1.1 lukem
70 1.1 lukem #ifdef FD_SETSIZE
71 1.1 lukem if ( nbits > FD_SETSIZE ) {
72 1.1 lukem nbits = FD_SETSIZE;
73 1.1 lukem }
74 1.1 lukem #endif /* FD_SETSIZE */
75 1.1 lukem
76 1.1 lukem if ( debug == 0 ) {
77 1.1 lukem for ( i = 0; i < 5; i++ ) {
78 1.1 lukem #ifdef HAVE_THR
79 1.3 tron pid = fork1();
80 1.1 lukem #else
81 1.3 tron pid = fork();
82 1.1 lukem #endif
83 1.3 tron switch ( pid )
84 1.1 lukem {
85 1.1 lukem case -1:
86 1.1 lukem sleep( 5 );
87 1.1 lukem continue;
88 1.1 lukem
89 1.1 lukem case 0:
90 1.1 lukem break;
91 1.1 lukem
92 1.1 lukem default:
93 1.3 tron return pid;
94 1.1 lukem }
95 1.1 lukem break;
96 1.1 lukem }
97 1.1 lukem
98 1.1 lukem if ( (sd = open( "/dev/null", O_RDWR )) == -1 &&
99 1.1 lukem (sd = open( "/dev/null", O_RDONLY )) == -1 &&
100 1.1 lukem /* Panic -- open *something* */
101 1.1 lukem (sd = open( "/", O_RDONLY )) == -1 ) {
102 1.1 lukem perror("/dev/null");
103 1.1 lukem } else {
104 1.1 lukem /* redirect stdin, stdout, stderr to /dev/null */
105 1.1 lukem dup2( sd, STDIN_FILENO );
106 1.1 lukem dup2( sd, STDOUT_FILENO );
107 1.1 lukem dup2( sd, STDERR_FILENO );
108 1.1 lukem
109 1.1 lukem switch( sd ) {
110 1.1 lukem default:
111 1.1 lukem close( sd );
112 1.1 lukem case STDIN_FILENO:
113 1.1 lukem case STDOUT_FILENO:
114 1.1 lukem case STDERR_FILENO:
115 1.1 lukem break;
116 1.1 lukem }
117 1.1 lukem }
118 1.1 lukem
119 1.1 lukem if ( do_close ) {
120 1.1 lukem /* close everything else */
121 1.1 lukem for ( i = 0; i < nbits; i++ ) {
122 1.1 lukem if( i != STDIN_FILENO &&
123 1.1 lukem i != STDOUT_FILENO &&
124 1.1 lukem i != STDERR_FILENO )
125 1.1 lukem {
126 1.1 lukem close( i );
127 1.1 lukem }
128 1.1 lukem }
129 1.1 lukem }
130 1.1 lukem
131 1.1 lukem #ifdef CHDIR_TO_ROOT
132 1.1 lukem (void) chdir( "/" );
133 1.1 lukem #endif
134 1.1 lukem
135 1.1 lukem #ifdef HAVE_SETSID
136 1.1 lukem (void) setsid();
137 1.2 mrg #elif defined(TIOCNOTTY)
138 1.1 lukem if ( (sd = open( "/dev/tty", O_RDWR )) != -1 ) {
139 1.1 lukem (void) ioctl( sd, TIOCNOTTY, NULL );
140 1.1 lukem (void) close( sd );
141 1.1 lukem }
142 1.1 lukem #endif
143 1.1 lukem }
144 1.1 lukem
145 1.1 lukem #ifdef SIGPIPE
146 1.1 lukem (void) SIGNAL( SIGPIPE, SIG_IGN );
147 1.1 lukem #endif
148 1.3 tron return 0;
149 1.1 lukem }
150