|
From a9008bf22c4f706cf2a4ce12dac9eb282f295933 Mon Sep 17 00:00:00 2001
|
|
From: Brent Cook <busterb@gmail.com>
|
|
Date: Wed, 31 Dec 2014 08:26:41 -0600
|
|
Subject: [PATCH 07/14] add -p option to create a pid file
|
|
|
|
This is used in both the Gentoo and Debian ports.
|
|
|
|
Origin: https://bugs.gentoo.org/show_bug.cgi?id=493082
|
|
---
|
|
src/usr.sbin/ntpd/ntpd.8 | 4 ++++
|
|
src/usr.sbin/ntpd/ntpd.c | 33 ++++++++++++++++++++++++++++-----
|
|
src/usr.sbin/ntpd/ntpd.h | 1 +
|
|
3 files changed, 33 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/usr.sbin/ntpd/ntpd.8 b/src/usr.sbin/ntpd/ntpd.8
|
|
index 0b74c2587f..63b027403c 100644
|
|
--- a/src/usr.sbin/ntpd/ntpd.8
|
|
+++ b/src/usr.sbin/ntpd/ntpd.8
|
|
@@ -25,6 +25,7 @@
|
|
.Bk -words
|
|
.Op Fl dnSsv
|
|
.Op Fl f Ar file
|
|
+.Op Fl p Ar file
|
|
.Ek
|
|
.Sh DESCRIPTION
|
|
The
|
|
@@ -59,6 +60,9 @@ instead of the default
|
|
.It Fl n
|
|
Configtest mode.
|
|
Only check the configuration file for validity.
|
|
+.It Fl p Ar file
|
|
+Write pid to
|
|
+.Ar file
|
|
.It Fl S
|
|
Do not set the time immediately at startup.
|
|
This is the default.
|
|
diff --git a/src/usr.sbin/ntpd/ntpd.c b/src/usr.sbin/ntpd/ntpd.c
|
|
index 44c4f72f3f..7c8eda5a1d 100644
|
|
--- a/src/usr.sbin/ntpd/ntpd.c
|
|
+++ b/src/usr.sbin/ntpd/ntpd.c
|
|
@@ -88,6 +88,18 @@ sighdlr(int sig)
|
|
}
|
|
}
|
|
|
|
+void
|
|
+writepid(struct ntpd_conf *lconf)
|
|
+{
|
|
+ if (lconf->pid_file != NULL) {
|
|
+ FILE *f = fopen(lconf->pid_file, "w");
|
|
+ if (f == NULL)
|
|
+ fatal("couldn't open pid file");
|
|
+ fprintf(f, "%ld\n", (long) getpid());
|
|
+ fclose(f);
|
|
+ }
|
|
+}
|
|
+
|
|
__dead void
|
|
usage(void)
|
|
{
|
|
@@ -97,7 +109,7 @@ usage(void)
|
|
fprintf(stderr,
|
|
"usage: ntpctl -s all | peers | Sensors | status\n");
|
|
else
|
|
- fprintf(stderr, "usage: %s [-dnSsv] [-f file]\n",
|
|
+ fprintf(stderr, "usage: %s [-dnSsv] [-f file] [-p file]\n",
|
|
__progname);
|
|
exit(1);
|
|
}
|
|
@@ -133,7 +145,7 @@ main(int argc, char *argv[])
|
|
|
|
memset(&lconf, 0, sizeof(lconf));
|
|
|
|
- while ((ch = getopt(argc, argv, "df:nP:sSv")) != -1) {
|
|
+ while ((ch = getopt(argc, argv, "df:np:P:sSv")) != -1) {
|
|
switch (ch) {
|
|
case 'd':
|
|
lconf.debug = 2;
|
|
@@ -148,6 +160,9 @@ main(int argc, char *argv[])
|
|
case 'P':
|
|
pname = optarg;
|
|
break;
|
|
+ case 'p':
|
|
+ lconf.pid_file = optarg;
|
|
+ break;
|
|
case 's':
|
|
lconf.settime = 1;
|
|
break;
|
|
@@ -214,9 +229,11 @@ main(int argc, char *argv[])
|
|
if (!lconf.settime) {
|
|
log_init(lconf.debug, LOG_DAEMON);
|
|
log_setverbose(lconf.verbose);
|
|
- if (!lconf.debug)
|
|
+ if (!lconf.debug) {
|
|
if (daemon(1, 0))
|
|
fatal("daemon");
|
|
+ writepid(&lconf);
|
|
+ }
|
|
} else
|
|
timeout = SETTIME_TIMEOUT * 1000;
|
|
|
|
@@ -298,9 +315,11 @@ main(int argc, char *argv[])
|
|
log_setverbose(lconf.verbose);
|
|
log_warnx("no reply received in time, skipping initial "
|
|
"time setting");
|
|
- if (!lconf.debug)
|
|
+ if (!lconf.debug) {
|
|
if (daemon(1, 0))
|
|
fatal("daemon");
|
|
+ writepid(&lconf);
|
|
+ }
|
|
}
|
|
|
|
if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT))
|
|
@@ -339,6 +358,8 @@ main(int argc, char *argv[])
|
|
msgbuf_clear(&ibuf->w);
|
|
free(ibuf);
|
|
log_info("Terminating");
|
|
+ if (lconf.pid_file != NULL)
|
|
+ unlink(lconf.pid_file);
|
|
return (0);
|
|
}
|
|
|
|
@@ -399,9 +420,11 @@ dispatch_imsg(struct ntpd_conf *lconf, int argc, char **argv)
|
|
memcpy(&d, imsg.data, sizeof(d));
|
|
ntpd_settime(d);
|
|
/* daemonize now */
|
|
- if (!lconf->debug)
|
|
+ if (!lconf->debug) {
|
|
if (daemon(1, 0))
|
|
fatal("daemon");
|
|
+ writepid(lconf);
|
|
+ }
|
|
lconf->settime = 0;
|
|
timeout = INFTIM;
|
|
break;
|
|
diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h
|
|
index 0f7313c78e..7ee919dd09 100644
|
|
--- a/src/usr.sbin/ntpd/ntpd.h
|
|
+++ b/src/usr.sbin/ntpd/ntpd.h
|
|
@@ -250,6 +250,7 @@ struct ntpd_conf {
|
|
u_int constraint_errors;
|
|
u_int8_t *ca;
|
|
size_t ca_len;
|
|
+ char *pid_file;
|
|
};
|
|
|
|
struct ctl_show_status {
|
|
--
|
|
2.20.1
|
|
|