make pidfile writing configurable.
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 27 Mar 2007 22:01:31 +0000 (22:01 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 27 Mar 2007 22:01:31 +0000 (22:01 -0000)
[ui]toa_to_buf: change API. No users yet.

Config.in
include/libbb.h
libbb/Kbuild
libbb/xfuncs.c
miscutils/crond.c
networking/inetd.c
networking/udhcp/common.c
shell/msh.c
sysklogd/syslogd.c

index d15b2673abdbf5bb8b7609ed6dd65ba70a7c5054..650ea0878710a8c4cfdc5cffb515d3b21435c174 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -141,6 +141,13 @@ config FEATURE_CLEAN_UP
          Don't enable this unless you have a really good reason to clean
          things up manually.
 
+config FEATURE_PIDFILE
+       bool "Support writing pidfiles"
+       default n
+       help
+         This option makes some applets (crond, syslogd and inetd) write
+         a pidfile in /var/run. Some applications rely on them
+
 config FEATURE_SUID
        bool "Support for SUID/SGID handling"
        default n
index 67fd2af216f614c6a2fb87ca948d705e45d70634..d734abed67a72e4ecf835d6de4e7abc3b449713a 100644 (file)
@@ -408,10 +408,11 @@ extern FILE *fopen_or_warn(const char *filename, const char *mode);
 extern FILE *fopen_or_warn_stdin(const char *filename);
 
 
-extern void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
 extern char *utoa(unsigned n);
-extern void itoa_to_buf(int n, char *buf, unsigned buflen);
 extern char *itoa(int n);
+/* Returns a pointer past the formatted number, does NOT null-terminate */
+extern char *utoa_to_buf(unsigned n, char *buf, unsigned buflen);
+extern char *itoa_to_buf(int n, char *buf, unsigned buflen);
 extern void smart_ulltoa5(unsigned long long ul, char buf[5]);
 /* Put a string of hex bytes (ala "1b"), return advanced pointer */
 extern char *bin2hex(char *buf, const char *cp, int count);
@@ -542,6 +543,14 @@ extern void llist_unlink(llist_t **head, llist_t *elm);
 extern void llist_free(llist_t *elm, void (*freeit)(void *data));
 extern llist_t* llist_rev(llist_t *list);
 
+#if ENABLE_FEATURE_PIDFILE
+int write_pidfile(const char *path);
+#define remove_pidfile(f) ((void)unlink(f))
+#else
+#define write_pidfile(f)  1
+#define remove_pidfile(f) ((void)0)
+#endif
+
 enum {
        LOGMODE_NONE = 0,
        LOGMODE_STDIO = 1<<0,
index ffded6a687a777bd64d9a2a61a1a031db3cde836..a3b78ef2849c3f2f0afbc302c1c5a7d54fc40203 100644 (file)
@@ -61,6 +61,7 @@ lib-y += perror_msg.o
 lib-y += perror_msg_and_die.o
 lib-y += perror_nomsg.o
 lib-y += perror_nomsg_and_die.o
+lib-y += pidfile.o
 lib-y += process_escape_sequence.o
 lib-y += procps.o
 lib-y += read.o
index 7f870ac8b5ce65c9ce320e39991642fd6e8dd62e..e1632a4b64013a315d3dbbbaf86a475b45fbb207 100644 (file)
@@ -257,7 +257,7 @@ void smart_ulltoa5(unsigned long long ul, char buf[5])
 // truncated result is always null terminated (unless buflen is 0), and
 // contains the first few digits of the result ala strncpy.
 void BUG_sizeof_unsigned_not_4(void);
-void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
+char *utoa_to_buf(unsigned n, char *buf, unsigned buflen)
 {
        unsigned i, out, res;
        if (sizeof(unsigned) != 4)
@@ -273,19 +273,19 @@ void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
                                *buf++ = '0' + res;
                        }
                }
-               *buf = '\0';
        }
+       return buf;
 }
 
 // Convert signed integer to ascii, like utoa_to_buf()
-void itoa_to_buf(int n, char *buf, unsigned buflen)
+char *itoa_to_buf(int n, char *buf, unsigned buflen)
 {
        if (buflen && n<0) {
                n = -n;
                *buf++ = '-';
                buflen--;
        }
-       utoa_to_buf((unsigned)n, buf, buflen);
+       return utoa_to_buf((unsigned)n, buf, buflen);
 }
 
 // The following two functions use a static buffer, so calling either one a
@@ -300,7 +300,7 @@ static char local_buf[12];
 // Convert unsigned integer to ascii using a static buffer (returned).
 char *utoa(unsigned n)
 {
-       utoa_to_buf(n, local_buf, sizeof(local_buf));
+       *(utoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
 
        return local_buf;
 }
@@ -308,7 +308,7 @@ char *utoa(unsigned n)
 // Convert signed integer to ascii using a static buffer (returned).
 char *itoa(int n)
 {
-       itoa_to_buf(n, local_buf, sizeof(local_buf));
+       *(itoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
 
        return local_buf;
 }
index 9d511f960f3a370a4767b2fabe7fdb6e9c5d7a05..24aa3dcc3a7b124f7a25c6608cb333002d4716a5 100644 (file)
@@ -185,6 +185,7 @@ int crond_main(int ac, char **av)
                int rescan = 60;
                short sleep_time = 60;
 
+               write_pidfile("/var/run/crond.pid");
                for (;;) {
                        sleep((sleep_time + 1) - (short) (time(NULL) % sleep_time));
 
index 4faa4203a767f65320db189da8b9839202522ebe..fd72aa72668bb82940663caae96676860b8717f7 100644 (file)
@@ -1212,7 +1212,7 @@ static void goaway(int sig ATTRIBUTE_UNUSED)
                }
                (void) close(sep->se_fd);
        }
-       (void) unlink(_PATH_INETDPID);
+       remove_pidfile(_PATH_INETDPID);
        exit(0);
 }
 
@@ -1301,13 +1301,7 @@ int inetd_main(int argc, char *argv[])
                setgroups(1, &gid);
        }
 
-       {
-               FILE *fp = fopen(_PATH_INETDPID, "w");
-               if (fp != NULL) {
-                       fprintf(fp, "%u\n", getpid());
-                       fclose(fp);
-               }
-       }
+       write_pidfile(_PATH_INETDPID);
 
        if (getrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0) {
                bb_perror_msg("getrlimit");
index 7b2e19c4248128c3c7aa37cc9107d5415b25063e..46cc0348ff42253b1de7c4880b6277251d887e2d 100644 (file)
@@ -22,47 +22,35 @@ long uptime(void)
        return info.uptime;
 }
 
-
+#if ENABLE_FEATURE_PIDFILE
 static const char *saved_pidfile;
 
 static void pidfile_delete(void)
 {
        if (saved_pidfile)
-               unlink(saved_pidfile);
+               remove_pidfile(saved_pidfile);
 }
+#endif
 
-static int pidfile_acquire(const char *pidfile)
+static void create_pidfile(const char *pidfile)
 {
-       int pid_fd;
-       if (!pidfile) return -1;
+       if (!pidfile)
+               return;
 
-       pid_fd = open(pidfile, O_CREAT|O_WRONLY|O_TRUNC, 0644);
-       if (pid_fd < 0) {
-               bb_perror_msg("cannot open pidfile %s", pidfile);
-       } else {
-               /* lockf(pid_fd, F_LOCK, 0); */
-               if (!saved_pidfile)
-                       atexit(pidfile_delete);
-               saved_pidfile = pidfile;
+       if (!write_pidfile(pidfile)) {
+               bb_perror_msg("cannot create pidfile %s", pidfile);
+               return;
        }
-
-       return pid_fd;
-}
-
-static void pidfile_write_release(int pid_fd)
-{
-       if (pid_fd < 0) return;
-
-       fdprintf(pid_fd, "%d\n", getpid());
-       /* lockf(pid_fd, F_UNLCK, 0); */
-       close(pid_fd);
+#if ENABLE_FEATURE_PIDFILE
+       /* lockf(pid_fd, F_LOCK, 0); */
+       if (!saved_pidfile)
+               atexit(pidfile_delete);
+       saved_pidfile = pidfile;
+#endif
 }
 
-
 void udhcp_make_pidfile(const char *pidfile)
 {
-       int pid_fd;
-
        /* Make sure fd 0,1,2 are open */
        bb_sanitize_stdio();
 
@@ -70,8 +58,7 @@ void udhcp_make_pidfile(const char *pidfile)
        setlinebuf(stdout);
 
        /* Create pidfile */
-       pid_fd = pidfile_acquire(pidfile);
-       pidfile_write_release(pid_fd);
+       create_pidfile(pidfile);
 
        bb_info_msg("%s (v%s) started", applet_name, BB_VER);
 }
index 66b10f346d4d0ac49012bcc59711efd023b138ea..50ec90b0b4a829d889dd31bf4c017423f16b7b1c 100644 (file)
@@ -49,7 +49,7 @@ static char *find_applet_by_name(const char *applet)
 {
        return NULL;
 }
-static void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
+static char *utoa_to_buf(unsigned n, char *buf, unsigned buflen)
 {
        unsigned i, out, res;
        assert(sizeof(unsigned) == 4);
@@ -64,22 +64,22 @@ static void utoa_to_buf(unsigned n, char *buf, unsigned buflen)
                                *buf++ = '0' + res;
                        }
                }
-               *buf = '\0';
        }
+       return buf;
 }
-static void itoa_to_buf(int n, char *buf, unsigned buflen)
+static char *itoa_to_buf(int n, char *buf, unsigned buflen)
 {
        if (buflen && n < 0) {
                n = -n;
                *buf++ = '-';
                buflen--;
        }
-       utoa_to_buf((unsigned)n, buf, buflen);
+       return utoa_to_buf((unsigned)n, buf, buflen);
 }
 static char local_buf[12];
 static char *itoa(int n)
 {
-       itoa_to_buf(n, local_buf, sizeof(local_buf));
+       *(itoa_to_buf(n, local_buf, sizeof(local_buf))) = '\0';
        return local_buf;
 }
 #else
index 51627bd823de1d46234562888bef87c7119686e5..76a446b6a8f7770fb9c4163dddcbfe71bc5852bb 100644 (file)
@@ -519,6 +519,7 @@ static void do_syslogd(void)
        signal(SIGALRM, do_mark);
        alarm(G.markInterval);
 #endif
+       remove_pidfile("/var/run/syslogd.pid");
 
        memset(&sunx, 0, sizeof(sunx));
        sunx.sun_family = AF_UNIX;
@@ -645,6 +646,7 @@ int syslogd_main(int argc, char **argv)
                bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
        }
        umask(0);
+       write_pidfile("/var/run/syslogd.pid");
        do_syslogd();
        /* return EXIT_SUCCESS; */
 }