modules/admin-full: simplify and fix progname change
[project/luci.git] / modules / admin-full / src / luci-bwc.c
index f173d44..acc07e0 100644 (file)
@@ -142,6 +142,10 @@ static void reset_countdown(int sig)
 }
 
 
+static char *progname;
+static int prognamelen;
+
+
 static int init_directory(char *path)
 {
        char *p = path;
@@ -336,7 +340,7 @@ static int update_ldstat(uint16_t load1, uint16_t load5, uint16_t load15)
        return update_file(path, &e, sizeof(struct load_entry));
 }
 
-static int run_daemon(char *progname)
+static int run_daemon(void)
 {
        FILE *info;
        uint64_t rxb, txb, rxp, txp;
@@ -390,7 +394,8 @@ static int run_daemon(char *progname)
        for (reset_countdown(0); countdown >= 0; countdown--)
        {
                /* alter progname for ps, top */
-               sprintf(progname, "luci-bwc %d", countdown);
+               memset(progname, 0, prognamelen);
+               snprintf(progname, prognamelen, "luci-bwc %d", countdown);
 
                if ((info = fopen("/proc/net/dev", "r")) != NULL)
                {
@@ -456,45 +461,39 @@ static int run_daemon(char *progname)
        return 0;
 }
 
-static int check_daemon(char *progname)
+static void check_daemon(void)
 {
        int pid;
 
        if ((pid = readpid()) < 0 || kill(pid, 0) < 0)
        {
                /* daemon ping failed, try to start it up */
-               if (run_daemon(progname))
+               if (run_daemon())
                {
                        fprintf(stderr,
                                "Failed to ping daemon and unable to start it up: %s\n",
                                strerror(errno));
 
-                       return 1;
+                       exit(1);
                }
        }
        else if (kill(pid, SIGUSR1))
        {
                fprintf(stderr, "Failed to send signal: %s\n", strerror(errno));
-               return 1;
+               exit(2);
        }
-
-       return 0;
 }
 
-static int run_dump_ifname(char *progname, const char *ifname)
+static int run_dump_ifname(const char *ifname)
 {
        int i;
        char path[1024];
        struct file_map m;
        struct traffic_entry *e;
 
+       check_daemon();
        snprintf(path, sizeof(path), DB_IF_FILE, ifname);
 
-       if (check_daemon(progname))
-       {
-               return 1;
-       }
-
        if (mmap_file(path, sizeof(struct traffic_entry), &m))
        {
                fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
@@ -521,20 +520,16 @@ static int run_dump_ifname(char *progname, const char *ifname)
        return 0;
 }
 
-static int run_dump_conns(char *progname)
+static int run_dump_conns(void)
 {
        int i;
        char path[1024];
        struct file_map m;
        struct conn_entry *e;
 
+       check_daemon();
        snprintf(path, sizeof(path), DB_CN_FILE);
 
-       if (check_daemon(progname))
-       {
-               return 1;
-       }
-
        if (mmap_file(path, sizeof(struct conn_entry), &m))
        {
                fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
@@ -559,20 +554,16 @@ static int run_dump_conns(char *progname)
        return 0;
 }
 
-static int run_dump_load(char *progname)
+static int run_dump_load(void)
 {
        int i;
        char path[1024];
        struct file_map m;
        struct load_entry *e;
 
+       check_daemon();
        snprintf(path, sizeof(path), DB_LD_FILE);
 
-       if (check_daemon(progname))
-       {
-               return 1;
-       }
-
        if (mmap_file(path, sizeof(struct load_entry), &m))
        {
                fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
@@ -602,6 +593,12 @@ int main(int argc, char *argv[])
 {
        int opt;
 
+       progname = argv[0];
+       prognamelen = -1;
+
+       for (opt = 0; opt < argc; opt++)
+               prognamelen += 1 + strlen(argv[opt]);
+
        while ((opt = getopt(argc, argv, "t:i:cl")) > -1)
        {
                switch (opt)
@@ -612,14 +609,14 @@ int main(int argc, char *argv[])
 
                        case 'i':
                                if (optarg)
-                                       return run_dump_ifname(argv[0], optarg);
+                                       return run_dump_ifname(optarg);
                                break;
 
                        case 'c':
-                               return run_dump_conns(argv[0]);
+                               return run_dump_conns();
 
                        case 'l':
-                               return run_dump_load(argv[0]);
+                               return run_dump_load();
 
                        default:
                                break;