start_stop_daemon: stop using data/bss
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 26 Feb 2008 16:08:02 +0000 (16:08 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 26 Feb 2008 16:08:02 +0000 (16:08 -0000)
function                                             old     new   delta
start_stop_daemon_main                               749     770     +21
do_procinit                                          184     185      +1
quiet                                                  1       -      -1
userspec                                               4       -      -4
user_id                                                4       -      -4
signal_nr                                              4       -      -4
pidfile                                                4       -      -4
found                                                  4       -      -4
execname                                               4       -      -4
cmdname                                                4       -      -4
------------------------------------------------------------------------------
(add/remove: 0/8 grow/shrink: 2/0 up/down: 22/-29)             Total: -7 bytes

debianutils/start_stop_daemon.c

index 6860bab6b9605b0b3185741fd59078258df733d7..6f4b6b2bb5a1a47c4746e2a3ce2df7416c82a0fe 100644 (file)
 #define WANT_PIDFILE 1
 #include "libbb.h"
 
-static int signal_nr = 15;
-static int user_id = -1;
-static char *userspec;
-static char *cmdname;
-static char *execname;
-static char *pidfile;
-static smallint quiet;
-
 struct pid_list {
        struct pid_list *next;
        pid_t pid;
 };
 
-static struct pid_list *found;
+
+struct globals {
+       struct pid_list *found;
+       char *userspec;
+       char *cmdname;
+       char *execname;
+       char *pidfile;
+       int user_id;
+       smallint quiet;
+       smallint signal_nr;
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
+#define found             (G.found               )
+#define userspec          (G.userspec            )
+#define cmdname           (G.cmdname             )
+#define execname          (G.execname            )
+#define pidfile           (G.pidfile             )
+#define user_id           (G.user_id             )
+#define quiet             (G.quiet               )
+#define signal_nr         (G.signal_nr           )
+#define INIT_G() \
+        do { \
+               user_id = -1; \
+               signal_nr = 15; \
+        } while (0)
+
 
 static int pid_is_exec(pid_t pid, const char *name)
 {
@@ -43,8 +60,8 @@ static int pid_is_exec(pid_t pid, const char *name)
        n = strlen(name) + 1;
        execbuf = xzalloc(n + 1);
        readlink(buf, execbuf, n);
-
-       /* if readlink fails, execbuf still contains "" */
+       /* if readlink fails because link target is longer than strlen(name),
+        * execbuf still contains "", and strcmp will return !0. */
        n = strcmp(execbuf, name);
        if (ENABLE_FEATURE_CLEAN_UP)
                free(execbuf);
@@ -121,7 +138,7 @@ static void do_procinit(void)
 {
        DIR *procdir;
        struct dirent *entry;
-       int foundany, pid;
+       int pid;
 
        if (pidfile) {
                do_pidfile();
@@ -130,16 +147,15 @@ static void do_procinit(void)
 
        procdir = xopendir("/proc");
 
-       foundany = 0;
+       pid = 0;
        while ((entry = readdir(procdir)) != NULL) {
                pid = bb_strtou(entry->d_name, NULL, 10);
                if (errno)
                        continue;
-               foundany++;
                check(pid);
        }
        closedir(procdir);
-       if (!foundany)
+       if (!pid)
                bb_error_msg_and_die("nothing in /proc - not mounted?");
 }
 
@@ -246,6 +262,9 @@ int start_stop_daemon_main(int argc, char **argv)
 //     int retries = -1;
        char *opt_N;
 #endif
+
+       INIT_G();
+
 #if ENABLE_FEATURE_START_STOP_DAEMON_LONG_OPTIONS
        applet_long_options = start_stop_daemon_longopts;
 #endif