[PATCH] CONFIG_PID_FILE_PATH: new configuration option for pidfile paths

Anthony G. Basile basile at opensource.dyc.edu
Sat Dec 8 15:03:06 UTC 2012


From: "Anthony G. Basile" <blueness at gentoo.org>

We set a default path for the directory where pidfiles are create
when FEATURE_PIDFILE is selected.  The default has no effect on
applets which must specify a pidfile path on the command line to
run, and it can be overridden by applets which optionally allow
the user to specify the pidfile path.

We also add pidfile write/remove support for klogd, ntpd and watchdog.
For syslogd, we add a missing remove_pidfile() for better cleanup
on daemon exit.

Signed-off-by: Anthony G. Basile <blueness at gentoo.org>
---
 Config.in            |   13 ++++++++++++-
 miscutils/crond.c    |    2 +-
 miscutils/watchdog.c |    3 +++
 networking/ifplugd.c |    2 +-
 networking/inetd.c   |    6 ++----
 networking/ntpd.c    |    3 +++
 sysklogd/klogd.c     |    3 +++
 sysklogd/syslogd.c   |    5 ++++-
 util-linux/acpid.c   |   13 ++++++++++---
 9 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/Config.in b/Config.in
index 17bdc89..322343e 100644
--- a/Config.in
+++ b/Config.in
@@ -310,7 +310,18 @@ config FEATURE_PIDFILE
 	default y
 	help
 	  This option makes some applets (e.g. crond, syslogd, inetd) write
-	  a pidfile in /var/run. Some applications rely on them.
+	  a pidfile at the configured PID_FILE_PATH.  It has no effect
+	  applets which require pidfiles to run.
+
+config PID_FILE_PATH
+	string "Path to directory for pidfile"
+	default "/var/run"
+	depends on FEATURE_PIDFILE
+	help
+	  This is the default path where pidfiles are created.  Applets which
+	  allow you to set the pidfile path on the command line will override
+	  this value.  The option has no effect on applets that require you to
+	  specify a pidfile path.
 
 config FEATURE_SUID
 	bool "Support for SUID/SGID handling"
diff --git a/miscutils/crond.c b/miscutils/crond.c
index a0b73c7..efa4f18 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -885,7 +885,7 @@ int crond_main(int argc UNUSED_PARAM, char **argv)
 	xsetenv("SHELL", DEFAULT_SHELL); /* once, for all future children */
 	crondlog(LVL8 "crond (busybox "BB_VER") started, log level %d", G.log_level);
 	rescan_crontab_dir();
-	write_pidfile("/var/run/crond.pid");
+	write_pidfile(CONFIG_PID_FILE_PATH"/crond.pid");
 
 	/* Main loop */
 	t2 = time(NULL);
diff --git a/miscutils/watchdog.c b/miscutils/watchdog.c
index ee28dc3..f126ab6 100644
--- a/miscutils/watchdog.c
+++ b/miscutils/watchdog.c
@@ -31,6 +31,7 @@ static void watchdog_shutdown(int sig UNUSED_PARAM)
 {
 	static const char V = 'V';
 
+	remove_pidfile(CONFIG_PID_FILE_PATH"/watchdog.pid");
 	write(3, &V, 1);  /* Magic, see watchdog-api.txt in kernel */
 	if (ENABLE_FEATURE_CLEAN_UP)
 		close(3);
@@ -95,6 +96,8 @@ int watchdog_main(int argc, char **argv)
 		stimer_duration, htimer_duration * 1000);
 #endif
 
+	write_pidfile(CONFIG_PID_FILE_PATH"/watchdog.pid");
+
 	while (1) {
 		/*
 		 * Make sure we clear the counter before sleeping,
diff --git a/networking/ifplugd.c b/networking/ifplugd.c
index 88bf448..36c3983 100644
--- a/networking/ifplugd.c
+++ b/networking/ifplugd.c
@@ -551,7 +551,7 @@ int ifplugd_main(int argc UNUSED_PARAM, char **argv)
 	applet_name = xasprintf("ifplugd(%s)", G.iface);
 
 #if ENABLE_FEATURE_PIDFILE
-	pidfile_name = xasprintf(_PATH_VARRUN"ifplugd.%s.pid", G.iface);
+	pidfile_name = xasprintf(CONFIG_PID_FILE_PATH"/ifplugd.%s.pid", G.iface);
 	pid_from_pidfile = read_pid(pidfile_name);
 
 	if (opts & FLAG_KILL) {
diff --git a/networking/inetd.c b/networking/inetd.c
index 00baf69..ef3e3af 100644
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -186,8 +186,6 @@
 #define ENABLE_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN 0
 #endif
 
-#define _PATH_INETDPID  "/var/run/inetd.pid"
-
 #define CNT_INTERVAL    60      /* servers in CNT_INTERVAL sec. */
 #define RETRYTIME       60      /* retry after bind or server fail */
 
@@ -1132,7 +1130,7 @@ static void clean_up_and_exit(int sig UNUSED_PARAM)
 		if (ENABLE_FEATURE_CLEAN_UP)
 			close(sep->se_fd);
 	}
-	remove_pidfile(_PATH_INETDPID);
+	remove_pidfile(CONFIG_PID_FILE_PATH"/inetd.pid");
 	exit(EXIT_SUCCESS);
 }
 
@@ -1181,7 +1179,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv)
 		setgroups(1, &gid);
 	}
 
-	write_pidfile(_PATH_INETDPID);
+	write_pidfile(CONFIG_PID_FILE_PATH"/inetd.pid");
 
 	/* never fails under Linux (except if you pass it bad arguments) */
 	getrlimit(RLIMIT_NOFILE, &rlim_ofile);
diff --git a/networking/ntpd.c b/networking/ntpd.c
index 5b92db6..726148d 100644
--- a/networking/ntpd.c
+++ b/networking/ntpd.c
@@ -2080,6 +2080,8 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
 	 */
 	cnt = G.peer_cnt * (INITIAL_SAMPLES + 1);
 
+	write_pidfile(CONFIG_PID_FILE_PATH"/ntpd.pid");
+
 	while (!bb_got_signal) {
 		llist_t *item;
 		unsigned i, j;
@@ -2195,6 +2197,7 @@ int ntpd_main(int argc UNUSED_PARAM, char **argv)
 		}
 	} /* while (!bb_got_signal) */
 
+	remove_pidfile(CONFIG_PID_FILE_PATH"/ntpd.pid");
 	kill_myself_with_sig(bb_got_signal);
 }
 
diff --git a/sysklogd/klogd.c b/sysklogd/klogd.c
index efa0e53..62445a4 100644
--- a/sysklogd/klogd.c
+++ b/sysklogd/klogd.c
@@ -195,6 +195,8 @@ int klogd_main(int argc UNUSED_PARAM, char **argv)
 
 	syslog(LOG_NOTICE, "klogd started: %s", bb_banner);
 
+	write_pidfile(CONFIG_PID_FILE_PATH"/klogd.pid");
+
 	used = 0;
 	while (!bb_got_signal) {
 		int n;
@@ -258,6 +260,7 @@ int klogd_main(int argc UNUSED_PARAM, char **argv)
 
 	klogd_close();
 	syslog(LOG_NOTICE, "klogd: exiting");
+	remove_pidfile(CONFIG_PID_FILE_PATH"/klogd.pid");
 	if (bb_got_signal)
 		kill_myself_with_sig(bb_got_signal);
 	return EXIT_FAILURE;
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index fc380d9..89217c1 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -916,6 +916,7 @@ static void do_syslogd(void)
 
 	timestamp_and_log_internal("syslogd exiting");
 	puts("syslogd exiting");
+	remove_pidfile(CONFIG_PID_FILE_PATH"/syslogd.pid");
 	if (ENABLE_FEATURE_IPC_SYSLOG)
 		ipcsyslog_cleanup();
 	kill_myself_with_sig(bb_got_signal);
@@ -979,8 +980,10 @@ int syslogd_main(int argc UNUSED_PARAM, char **argv)
 	if (!(opts & OPT_nofork)) {
 		bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
 	}
+
 	//umask(0); - why??
-	write_pidfile("/var/run/syslogd.pid");
+	write_pidfile(CONFIG_PID_FILE_PATH"/syslogd.pid");
+
 	do_syslogd();
 	/* return EXIT_SUCCESS; */
 }
diff --git a/util-linux/acpid.c b/util-linux/acpid.c
index 5d27929..d6216f4 100644
--- a/util-linux/acpid.c
+++ b/util-linux/acpid.c
@@ -235,7 +235,7 @@ int acpid_main(int argc UNUSED_PARAM, char **argv)
 	const char *opt_action = "/etc/acpid.conf";
 	const char *opt_map = "/etc/acpi.map";
 #if ENABLE_FEATURE_PIDFILE
-	const char *opt_pidfile = "/var/run/acpid.pid";
+	const char *opt_pidfile = NULL;
 #endif
 
 	INIT_G();
@@ -296,7 +296,10 @@ int acpid_main(int argc UNUSED_PARAM, char **argv)
 		nfd++;
 	}
 
-	write_pidfile(opt_pidfile);
+	if( opt_pidfile )
+		write_pidfile(opt_pidfile);
+	else
+		write_pidfile(CONFIG_PID_FILE_PATH"/acpid.pid");
 
 	while (safe_poll(pfd, nfd, -1) > 0) {
 		int i;
@@ -352,7 +355,11 @@ int acpid_main(int argc UNUSED_PARAM, char **argv)
 			close(pfd[nfd].fd);
 		free(pfd);
 	}
-	remove_pidfile(opt_pidfile);
+
+	if( opt_pidfile )
+		remove_pidfile(opt_pidfile);
+	else
+		remove_pidfile(CONFIG_PID_FILE_PATH"/acpid.pid");
 
 	return EXIT_SUCCESS;
 }
-- 
1.7.8.6



More information about the busybox mailing list