xref: /csrg-svn/lib/libc/gen/daemon.c (revision 45846)
143103Smarc /*-
243103Smarc  * Copyright (c) 1990 The Regents of the University of California.
343103Smarc  * All rights reserved.
443103Smarc  *
543103Smarc  * %sccs.include.redist.c%
643103Smarc  */
743103Smarc 
843103Smarc #if defined(LIBC_SCCS) && !defined(lint)
9*45846Sbostic static char sccsid[] = "@(#)daemon.c	5.3 (Berkeley) 12/28/90";
1043103Smarc #endif /* LIBC_SCCS and not lint */
1143103Smarc 
12*45846Sbostic #include <sys/fcntl.h>
13*45846Sbostic #include <unistd.h>
14*45846Sbostic #include <paths.h>
1543103Smarc 
1644570Smarc daemon(nochdir, noclose)
1744570Smarc 	int nochdir, noclose;
1843103Smarc {
1943103Smarc 	int cpid;
2043103Smarc 
2143103Smarc 	if ((cpid = fork()) == -1)
2243103Smarc 		return (-1);
2343103Smarc 	if (cpid)
2443103Smarc 		exit(0);
2544570Smarc 	(void) setsid();
2644570Smarc 	if (!nochdir)
2744570Smarc 		(void) chdir("/");
2844570Smarc 	if (!noclose) {
29*45846Sbostic 		int devnull = open(_PATH_DEVNULL, O_RDWR, 0);
3043103Smarc 
3144570Smarc 		if (devnull != -1) {
32*45846Sbostic 			(void) dup2(devnull, STDIN_FILENO);
33*45846Sbostic 			(void) dup2(devnull, STDOUT_FILENO);
34*45846Sbostic 			(void) dup2(devnull, STDERR_FILENO);
3544570Smarc 			if (devnull > 2)
3644570Smarc 				(void) close(devnull);
3744570Smarc 		}
3844570Smarc 	}
3943103Smarc }
40