CONFIG_PID_FILE_PATH: new configuration option for pidfile paths

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@gentoo.org>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
Anthony G. Basile 2012-12-10 14:49:39 -05:00 committed by Mike Frysinger
parent 393c395ca5
commit 12677acf0a
9 changed files with 30 additions and 9 deletions

View File

@ -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
on 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"

View File

@ -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);

View File

@ -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,

View File

@ -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) {

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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; */
}

View File

@ -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 = CONFIG_PID_FILE_PATH "/acpid.pid";
#endif
INIT_G();