* From BSDI: daemon.c,v 1.2 1996/08/15 01:11:09 jch Exp
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.sbin/daemon/daemon.c,v 1.8 2007/04/19 16:43:30 peter Exp $");
+#include "config.h"
+#include "pidfile.h"
+#include "getprogname.h"
#include <sys/param.h>
-#include <err.h>
#include <errno.h>
#include <pwd.h>
-#include <libutil.h>
-#include <login_cap.h>
#include <stdio.h>
+#include <string.h>
#include <stdlib.h>
#include <unistd.h>
const char *pidfile, *user;
pid_t otherpid;
+ setprogname(argv[0]);
+
nochdir = noclose = 1;
pidfile = user = NULL;
- while ((ch = getopt(argc, argv, "-cfp:u:")) != -1) {
+ while ((ch = getopt(argc, argv, "cfp:u:")) != -1) {
switch (ch) {
case 'c':
nochdir = 0;
pfh = pidfile_open(pidfile, 0600, &otherpid);
if (pfh == NULL) {
if (errno == EEXIST) {
- errx(3, "process already running, pid: %d",
- otherpid);
+ fprintf(stderr, "process already running, pid: %d\n", otherpid);
+ exit(3);
}
- err(2, "pidfile ``%s''", pidfile);
+ else {
+ fprintf(stderr, "pidfile ``%s'': %s\n", pidfile, strerror(errno));
+ exit(2);
+ }
}
}
- if (daemon(nochdir, noclose) == -1)
- err(1, NULL);
+ if (daemon(nochdir, noclose) == -1) {
+ fprintf(stderr, "%s\n", strerror(errno));
+ exit(1);
+ }
/* Now that we are the child, write out the pid */
if (pidfile)
pidfile_remove(pfh);
/* The child is now running, so the exit status doesn't matter. */
- errc(1, errcode, "%s", argv[0]);
+ fprintf(stderr, "%s: %s\n", argv[0], strerror(errcode));
+ exit(1);
}
static void
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");
+ if (pw == NULL) {
+ fprintf(stderr, "unknown user: %s\n", user);
+ exit(1);
+ }
+
+ if (setuid(pw->pw_uid) != 0) {
+ fprintf(stderr, "failed to setuid to %s\n", user);
+ exit(1);
+ }
}
static void
usage(void)
{
- (void)fprintf(stderr,
- "usage: daemon [-cf] [-p pidfile] [-u user] command "
- "arguments ...\n");
+ fprintf(stderr,
+ "usage: daemon [-cf] [-p pidfile] [-u user] command "
+ "arguments ...\n");
exit(1);
}