xref: /csrg-svn/lib/libc/gen/daemon.c (revision 50716)
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*50716Sbostic static char sccsid[] = "@(#)daemon.c	5.4 (Berkeley) 07/31/91";
1043103Smarc #endif /* LIBC_SCCS and not lint */
1143103Smarc 
1245846Sbostic #include <sys/fcntl.h>
1345846Sbostic #include <unistd.h>
1445846Sbostic #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) {
2945846Sbostic 		int devnull = open(_PATH_DEVNULL, O_RDWR, 0);
3043103Smarc 
3144570Smarc 		if (devnull != -1) {
3245846Sbostic 			(void) dup2(devnull, STDIN_FILENO);
3345846Sbostic 			(void) dup2(devnull, STDOUT_FILENO);
3445846Sbostic 			(void) dup2(devnull, STDERR_FILENO);
3544570Smarc 			if (devnull > 2)
3644570Smarc 				(void) close(devnull);
3744570Smarc 		}
3844570Smarc 	}
39*50716Sbostic 	return (0);
4043103Smarc }
41