Portable build framework for OpenNTPD
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

159 lines
3.9 KiB

From 5c0b2ba4ef077a253a8ce0a11fb536b7f696ddbf 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/13] 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 | 35 +++++++++++++++++++++++++++++------
src/usr.sbin/ntpd/ntpd.h | 1 +
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/src/usr.sbin/ntpd/ntpd.8 b/src/usr.sbin/ntpd/ntpd.8
index dcfb6d2..1b885a1 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 43486f0..f8727f6 100644
--- a/src/usr.sbin/ntpd/ntpd.c
+++ b/src/usr.sbin/ntpd/ntpd.c
@@ -87,6 +87,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)
{
@@ -96,7 +108,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);
}
@@ -132,7 +144,7 @@ main(int argc, char *argv[])
memset(&lconf, 0, sizeof(lconf));
- while ((ch = getopt(argc, argv, "df:nsSv")) != -1) {
+ while ((ch = getopt(argc, argv, "df:np:sSv")) != -1) {
switch (ch) {
case 'd':
lconf.debug = 2;
@@ -144,6 +156,9 @@ main(int argc, char *argv[])
lconf.debug = 2;
lconf.noaction = 1;
break;
+ case 'p':
+ lconf.pid_file = optarg;
+ break;
case 's':
lconf.settime = 1;
break;
@@ -192,9 +207,11 @@ main(int argc, char *argv[])
if (!lconf.settime) {
log_init(lconf.debug, LOG_DAEMON);
log_verbose(lconf.verbose);
- if (!lconf.debug)
+ if (!lconf.debug) {
if (daemon(1, 0))
fatal("daemon");
+ }
+ writepid(&lconf);
} else
timeout = SETTIME_TIMEOUT * 1000;
@@ -230,7 +247,7 @@ main(int argc, char *argv[])
* Constraint processes are forked with certificates in memory,
* then privdrop into chroot before speaking to the outside world.
*/
-#if 0
+#if 0
if (pledge("stdio rpath inet settime proc id", NULL) == -1)
err(1, "pledge");
#endif
@@ -275,9 +292,11 @@ main(int argc, char *argv[])
log_verbose(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))
@@ -320,6 +339,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);
}
@@ -403,9 +424,11 @@ dispatch_imsg(struct ntpd_conf *lconf, const char *pw_dir,
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 9ee2e42..d39628c 100644
--- a/src/usr.sbin/ntpd/ntpd.h
+++ b/src/usr.sbin/ntpd/ntpd.h
@@ -237,6 +237,7 @@ struct ntpd_conf {
u_int constraint_errors;
u_int8_t *ca;
size_t ca_len;
+ char *pid_file;
};
struct ctl_show_status {
--
2.8.1