11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*	$OpenBSD: daemon.c,v 1.6 2005/08/08 08:05:33 espie Exp $ */
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*-
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1990, 1993
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *	The Regents of the University of California.  All rights reserved.
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Redistribution and use in source and binary forms, with or without
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * modification, are permitted provided that the following conditions
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * are met:
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 1. Redistributions of source code must retain the above copyright
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer.
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 2. Redistributions in binary form must reproduce the above copyright
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    notice, this list of conditions and the following disclaimer in the
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    documentation and/or other materials provided with the distribution.
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 3. Neither the name of the University nor the names of its contributors
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    may be used to endorse or promote products derived from this software
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *    without specific prior written permission.
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood *
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * SUCH DAMAGE.
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* OPENBSD ORIGINAL: lib/libc/gen/daemon.c */
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h"
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_DAEMON
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h>
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_SYS_STAT_H
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# include <sys/stat.h>
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_FCNTL_H
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# include <fcntl.h>
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_UNISTD_H
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# include <unistd.h>
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwooddaemon(int nochdir, int noclose)
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	int fd;
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	switch (fork()) {
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case -1:
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case 0:
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		break;
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	default:
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		_exit(0);
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (setsid() == -1)
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		return (-1);
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (!nochdir)
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		(void)chdir("/");
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		(void)dup2(fd, STDIN_FILENO);
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		(void)dup2(fd, STDOUT_FILENO);
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		(void)dup2(fd, STDERR_FILENO);
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if (fd > 2)
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			(void)close (fd);
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	}
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return (0);
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_DAEMON */
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
83