bin/56398: new option for daemon(8) -- pidfile [patch]
Mikhail Teterin
mi at aldan.algebra.com
Wed Sep 3 22:50:19 PDT 2003
>Number: 56398
>Category: bin
>Synopsis: new option for daemon(8) -- pidfile [patch]
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Wed Sep 03 22:50:14 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator: Mikhail Teterin
>Release: FreeBSD 5.1-CURRENT i386
>Organization:
Virtual Estates, Inc.
>Environment:
System: FreeBSD aldan.algebra.com 5.1-CURRENT FreeBSD 5.1-CURRENT #5: Sun Jul 13 20:28:24 EDT 2003 mi at aldan.algebra.com:/ccd/obj/ccd/src/sys/DEBUG i386
>Description:
The daemon(8) is a nifty utility. However, its usability
in rc.d/ scripts is limited, because there is no easy way
to get the process id of the started daemon.
Once added and MFCed, the feature can be exploited by the
port-maintainers and others.
>How-To-Repeat:
>Fix:
Index: daemon.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/daemon/daemon.8,v
retrieving revision 1.3
diff -U2 -r1.3 daemon.8
--- daemon.8 5 Feb 2003 19:16:18 -0000 1.3
+++ daemon.8 4 Sep 2003 05:41:40 -0000
@@ -36,4 +36,5 @@
.Nm
.Op Fl cf
+.Op Fl p Ar pidfile
.Ar command arguments ...
.Sh DESCRIPTION
@@ -51,4 +52,10 @@
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 .
+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).
.El
.Sh DIAGNOSTICS
@@ -57,5 +64,6 @@
utility exits 1 if an error is returned by the
.Xr daemon 3
-library routine, otherwise 0.
+library routine, 2 if the pid-file is requested, but can not be opened,
+otherwise 0.
If the command cannot be executed, an error message is displayed on
standard error unless the
Index: daemon.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/daemon/daemon.c,v
retrieving revision 1.2
diff -U2 -r1.2 daemon.c
--- daemon.c 6 Jul 2003 12:44:11 -0000 1.2
+++ daemon.c 4 Sep 2003 05:41:40 -0000
@@ -35,4 +35,5 @@
#include <err.h>
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
@@ -44,8 +45,11 @@
main(int argc, char *argv[])
{
- int ch, nochdir, noclose;
+ int ch, nochdir, noclose, errcode;
+ FILE *pidf;
+ const char *pidfile;
nochdir = noclose = 1;
- while ((ch = getopt(argc, argv, "-cf")) != -1) {
+ pidfile = NULL;
+ while ((ch = getopt(argc, argv, "-cfp:")) != -1) {
switch (ch) {
case 'c':
@@ -55,5 +59,7 @@
noclose = 0;
break;
- case '?':
+ case 'p':
+ pidfile = optarg;
+ break;
default:
usage();
@@ -65,10 +71,35 @@
if (argc == 0)
usage();
+ /*
+ * Try to open the pidfile before calling daemon(3),
+ * to be able to report the error intelligently
+ */
+ if (pidfile) {
+ pidf = fopen(pidfile, "w");
+ if (pidf == NULL)
+ 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) {
+ fprintf(pidf, "%lu\n", (unsigned long)getpid());
+ fclose(pidf);
+ }
+
execvp(argv[0], argv);
+ /*
+ * execvp() failed -- unlink pidfile if any, and
+ * report the error
+ */
+ errcode = errno; /* Preserve errcode -- unlink may reset it */
+ if (pidfile)
+ unlink(pidfile);
+
/* The child is now running, so the exit status doesn't matter. */
- err(1, "%s", argv[0]);
+ errc(1, errcode, "%s", argv[0]);
}
@@ -76,5 +107,6 @@
usage(void)
{
- (void)fprintf(stderr, "usage: daemon [-cf] command arguments ...\n");
+ (void)fprintf(stderr,
+ "usage: daemon [-cf] [-p pidfile] command arguments ...\n");
exit(1);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list