From: PHO Date: Sat, 27 Dec 2008 06:34:13 +0000 (+0900) Subject: The original daemon(8) source; copied from FreeBSD CVS Repository. X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=daemon.git;a=commitdiff_plain;h=0aa9138f10ceb0258291ce0945e207393c2fe4cc The original daemon(8) source; copied from FreeBSD CVS Repository. --- 0aa9138f10ceb0258291ce0945e207393c2fe4cc diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0b3d8db --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD: src/usr.sbin/daemon/Makefile,v 1.3 2005/08/24 17:24:39 pjd Exp $ + +PROG= daemon +MAN= daemon.8 + +DPADD= ${LIBUTIL} +LDADD= -lutil + +WARNS?= 2 + +.include diff --git a/daemon.8 b/daemon.8 new file mode 100644 index 0000000..803d727 --- /dev/null +++ b/daemon.8 @@ -0,0 +1,95 @@ +.\" Copyright (c) 1999 Berkeley Software Design, Inc. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Berkeley Software Design Inc's name may not be used to endorse or +.\" promote products derived from this software without specific prior +.\" written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/usr.sbin/daemon/daemon.8,v 1.9 2007/03/19 12:12:53 trhodes Exp $ +.\" +.Dd March 19, 2007 +.Dt DAEMON 8 +.Os +.Sh NAME +.Nm daemon +.Nd run detached from the controlling terminal +.Sh SYNOPSIS +.Nm +.Op Fl cf +.Op Fl p Ar pidfile +.Op Fl u Ar user +.Ar command arguments ... +.Sh DESCRIPTION +The +.Nm +utility detaches itself from the controlling terminal and +executes the program specified by its arguments. +Privileges may be lowered to the specified user. +.Pp +The options are as follows: +.Bl -tag -width indent +.It Fl c +Change the current working directory to the root +.Pq Dq Pa / . +.It Fl f +Redirect standard input, standard output and standard error to +.Pa /dev/null . +.It Fl p Ar file +Write the ID of the created process into the +.Ar file +using the +.Xr pidfile 3 +functionality. +Note, that the file will be created shortly before the process is +actually executed, and will remain after the process exits (although +it will be removed if the execution fails). +.It Fl u Ar user +Run the program with the rights of user specified, requires privilege. +.El +.Sh EXIT STATUS +The +.Nm +utility exits 1 if an error is returned by the +.Xr daemon 3 +library routine, 2 if the +.Ar pidfile +is requested, but cannot be opened, 3 if process is already running (pidfile +exists and is locked), +otherwise 0. +.Sh DIAGNOSTICS +If the command cannot be executed, an error message is displayed on +standard error unless the +.Fl f +flag is specified. +.Sh SEE ALSO +.Xr setregid 2 , +.Xr setreuid 2 , +.Xr daemon 3 , +.Xr exec 3 , +.Xr pidfile 3 , +.Xr termios 4 , +.Xr tty 4 +.Sh HISTORY +The +.Nm +utility first appeared in +.Fx 4.7 . diff --git a/daemon.c b/daemon.c new file mode 100644 index 0000000..7fccad0 --- /dev/null +++ b/daemon.c @@ -0,0 +1,141 @@ +/*- + * Copyright (c) 1999 Berkeley Software Design, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Berkeley Software Design Inc's name may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * From BSDI: daemon.c,v 1.2 1996/08/15 01:11:09 jch Exp + */ + +#include +__FBSDID("$FreeBSD: src/usr.sbin/daemon/daemon.c,v 1.8 2007/04/19 16:43:30 peter Exp $"); + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static void restrict_process(const char *); +static void usage(void); + +int +main(int argc, char *argv[]) +{ + struct pidfh *pfh = NULL; + int ch, nochdir, noclose, errcode; + const char *pidfile, *user; + pid_t otherpid; + + nochdir = noclose = 1; + pidfile = user = NULL; + while ((ch = getopt(argc, argv, "-cfp:u:")) != -1) { + switch (ch) { + case 'c': + nochdir = 0; + break; + case 'f': + noclose = 0; + break; + case 'p': + pidfile = optarg; + break; + case 'u': + user = optarg; + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc == 0) + usage(); + + if (user != NULL) + restrict_process(user); + + /* + * Try to open the pidfile before calling daemon(3), + * to be able to report the error intelligently + */ + if (pidfile) { + pfh = pidfile_open(pidfile, 0600, &otherpid); + if (pfh == NULL) { + if (errno == EEXIST) { + errx(3, "process already running, pid: %d", + otherpid); + } + err(2, "pidfile ``%s''", pidfile); + } + } + + if (daemon(nochdir, noclose) == -1) + err(1, NULL); + + /* Now that we are the child, write out the pid */ + if (pidfile) + pidfile_write(pfh); + + execvp(argv[0], argv); + + /* + * execvp() failed -- unlink pidfile if any, and + * report the error + */ + errcode = errno; /* Preserve errcode -- unlink may reset it */ + if (pidfile) + pidfile_remove(pfh); + + /* The child is now running, so the exit status doesn't matter. */ + errc(1, errcode, "%s", argv[0]); +} + +static void +restrict_process(const char *user) +{ + struct passwd *pw = NULL; + + pw = getpwnam(user); + if (pw == NULL) + errx(1, "unknown user: %s", user); + + if (setusercontext(NULL, pw, pw->pw_uid, LOGIN_SETALL) != 0) + errx(1, "failed to set user environment"); +} + +static void +usage(void) +{ + (void)fprintf(stderr, + "usage: daemon [-cf] [-p pidfile] [-u user] command " + "arguments ...\n"); + exit(1); +}