Description: adding a -p option to openntpd to create a pidfile
Origin: https://bugs.gentoo.org/show_bug.cgi?id=493082
Reviewed-by: Sergey B Kirpichev <skirpichev@gmail.com>
Bug-Debian: http://bugs.debian.org/726650

Index: git/ntpd.8
===================================================================
--- git.orig/ntpd.8	2013-12-23 18:05:20.000000000 -0300
+++ git/ntpd.8	2013-12-23 18:05:20.000000000 -0300
@@ -25,6 +25,7 @@
 .Bk -words
 .Op Fl dnSsv
 .Op Fl f Ar file
+.Op Fl p Ar file
 .Ek
 .Sh DESCRIPTION
 The
@@ -63,13 +64,16 @@
 .Xr ntpd.conf 5 .
 .Pp
 The options are as follows:
-.Bl -tag -width "-f fileXXX"
+.Bl -tag -width "-p fileXXX"
 .It Fl d
 Do not daemonize.
 If this option is specified,
 .Nm
 will run in the foreground and log to
 .Em stderr .
+.It Fl p Ar file
+Write pid to
+.Ar file
 .It Fl f Ar file
 Use
 .Ar file
Index: git/ntpd.c
===================================================================
--- git.orig/ntpd.c	2013-12-23 18:05:20.000000000 -0300
+++ git/ntpd.c	2013-12-23 18:05:20.000000000 -0300
@@ -78,7 +78,7 @@
 {
 	extern char *__progname;
 
-	fprintf(stderr, "usage: %s [-dnSsv] [-f file]\n", __progname);
+	fprintf(stderr, "usage: %s [-dnSsv] [-f file] [-p file]\n", __progname);
 	exit(1);
 }
 
@@ -105,7 +105,7 @@
 	log_init(1);		/* log to stderr until daemonized */
 	res_init();		/* XXX */
 
-	while ((ch = getopt(argc, argv, "df:nsSv")) != -1) {
+	while ((ch = getopt(argc, argv, "df:np:sSv")) != -1) {
 		switch (ch) {
 		case 'd':
 			lconf.debug = 1;
@@ -116,6 +116,9 @@
 		case 'n':
 			lconf.noaction = 1;
 			break;
+		case 'p':
+			lconf.pid_file = optarg;
+			break;
 		case 's':
 			lconf.settime = 1;
 			break;
@@ -157,9 +160,17 @@
 	reset_adjtime();
 	if (!lconf.settime) {
 		log_init(lconf.debug);
-		if (!lconf.debug)
+		if (!lconf.debug) {
 			if (daemon(1, 0))
 				fatal("daemon");
+			else 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);
+			}
+		}
 	} else
 		timeout = SETTIME_TIMEOUT * 1000;
 
@@ -201,9 +212,17 @@
 			log_init(lconf.debug);
 			log_debug("no reply received in time, skipping initial "
 			    "time setting");
-			if (!lconf.debug)
+			if (!lconf.debug) {
 				if (daemon(1, 0))
 					fatal("daemon");
+				else 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);
+				}
+			}
 		}
 
 		if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT))
@@ -242,6 +261,8 @@
 	msgbuf_clear(&ibuf->w);
 	free(ibuf);
 	log_info("Terminating");
+	if (lconf.pid_file != NULL)
+		unlink(lconf.pid_file);
 	return (0);
 }
 
@@ -316,9 +337,17 @@
 			memcpy(&d, imsg.data, sizeof(d));
 			ntpd_settime(d);
 			/* daemonize now */
-			if (!lconf->debug)
+			if (!lconf->debug) {
 				if (daemon(1, 0))
 					fatal("daemon");
+				else 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);
+				}
+			}
 			lconf->settime = 0;
 			break;
 		case IMSG_HOST_DNS:
Index: git/ntpd.h
===================================================================
--- git.orig/ntpd.h	2013-12-23 18:05:20.000000000 -0300
+++ git/ntpd.h	2013-12-23 18:05:20.000000000 -0300
@@ -178,6 +178,7 @@
 	u_int8_t					debug;
 	u_int32_t					scale;
 	u_int8_t					noaction;
+	char						*pid_file;
 };
 
 struct buf {
