CONFIG_PID_FILE_PATH: new configuration option for pidfile paths
authorAnthony G. Basile <blueness@gentoo.org>
Mon, 10 Dec 2012 19:49:39 +0000 (14:49 -0500)
committerMike Frysinger <vapier@gentoo.org>
Wed, 19 Dec 2012 20:53:33 +0000 (15:53 -0500)
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>
Config.in
miscutils/crond.c
miscutils/watchdog.c
networking/ifplugd.c
networking/inetd.c
networking/ntpd.c
sysklogd/klogd.c
sysklogd/syslogd.c
util-linux/acpid.c

index 17bdc895acb9b8c92a1dfe175f39becd9f3078a6..b3fd65bd91e61de16311f4201ea72fd82b544a11 100644 (file)
--- 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
+         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"
index a0b73c77497018d1abed6c469bac6da8623150ab..582dc991a383ac449a0fb93e0ec6443b38a95344 100644 (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);
index ee28dc30d3d77dd22189a816f863917650cca2f2..d3a76edf07260bb30dae417d5299886db22f2e9c 100644 (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,
index 88bf448fa2abcf5032e75bba8ab5d1be464baa20..86586f0fe180f14dd3e318ff94dae813c6c54de3 100644 (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) {
index 00baf6971db579d67371de2e1dbc5af189786f3d..584c5e5e40dd3643a9e231e7c9290de7035bdd35 100644 (file)
 #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);
index 5b92db6f66a822d3cfff9a2d24e8f59dd257d5f8..7facf94840bd9403ec62a1a945855f6584ecefef 100644 (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);
 }
 
index efa0e537ad501e4a1c8f303b94308da2e978ae61..f59a155b40e0c919c0a3403a267eea9d532dd07d 100644 (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;
index fc380d9f91bcfabc697489c9f6144b931cd02a5c..5854bcd0f5f2f7e49be7d5f232bc295b4f000fcf 100644 (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; */
 }
index 5d27929483277ede682e9ad2ea23f0dddec65db2..38421c2d7f1cc15c621d2c2cff6384b97cf0f175 100644 (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();