small fixes: using fd-based io instead of FILE*-based,
authorDenis Vlasenko <vda.linux@googlemail.com>
Sat, 18 Nov 2006 22:03:26 +0000 (22:03 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sat, 18 Nov 2006 22:03:26 +0000 (22:03 -0000)
missed O_TRUNC, etc

debianutils/start_stop_daemon.c
networking/udhcp/common.c
networking/udhcp/dumpleases.c
networking/udhcp/files.c
networking/udhcp/pidfile.c

index a9f82c5cc24965313b49b761e37f9d0db520c55f..6d3877a7c31c586f031f0d14c9a7000502f8e5c8 100644 (file)
@@ -40,7 +40,8 @@ static inline void push(pid_t pid)
 
 static int pid_is_exec(pid_t pid, const char *name)
 {
-       char buf[32], *execbuf;
+       char buf[sizeof("/proc//exe") + sizeof(int)*3];
+       char *execbuf;
        int equal;
 
        sprintf(buf, "/proc/%d/exe", pid);
@@ -56,7 +57,7 @@ static int pid_is_exec(pid_t pid, const char *name)
 static int pid_is_user(int pid, int uid)
 {
        struct stat sb;
-       char buf[32];
+       char buf[sizeof("/proc/") + sizeof(int)*3];
 
        sprintf(buf, "/proc/%d", pid);
        if (stat(buf, &sb) != 0)
@@ -66,7 +67,7 @@ static int pid_is_user(int pid, int uid)
 
 static int pid_is_cmd(pid_t pid, const char *name)
 {
-       char buf[32];
+       char buf[sizeof("/proc//stat") + sizeof(int)*3];
        FILE *f;
        int c;
 
@@ -115,7 +116,6 @@ static void do_pidfile(void)
                fclose(f);
        } else if (errno != ENOENT)
                bb_perror_msg_and_die("open pidfile %s", pidfile);
-
 }
 
 static void do_procinit(void)
@@ -146,28 +146,28 @@ static void do_procinit(void)
 
 static int do_stop(void)
 {
-       RESERVE_CONFIG_BUFFER(what, 1024);
+       char *what;
        struct pid_list *p;
        int killed = 0;
 
        do_procinit();
 
        if (cmdname)
-               strcpy(what, cmdname);
+               what = xstrdup(cmdname);
        else if (execname)
-               strcpy(what, execname);
+               what = xstrdup(execname);
        else if (pidfile)
-               sprintf(what, "process in pidfile `%.200s'", pidfile);
+               what = xasprintf("process in pidfile '%s'", pidfile);
        else if (userspec)
-               sprintf(what, "process(es) owned by `%s'", userspec);
+               what = xasprintf("process(es) owned by '%s'", userspec);
        else
-               bb_error_msg_and_die ("internal error, please report");
+               bb_error_msg_and_die("internal error, please report");
 
        if (!found) {
                if (!quiet)
-                       printf("no %s found; none killed.\n", what);
+                       printf("no %s found; none killed\n", what);
                if (ENABLE_FEATURE_CLEAN_UP)
-                       RELEASE_CONFIG_BUFFER(what);
+                       free(what);
                return -1;
        }
        for (p = found; p; p = p->next) {
@@ -183,10 +183,10 @@ static int do_stop(void)
                for (p = found; p; p = p->next)
                        if(p->pid < 0)
                                printf(" %d", -p->pid);
-               printf(").\n");
+               puts(")");
        }
        if (ENABLE_FEATURE_CLEAN_UP)
-               RELEASE_CONFIG_BUFFER(what);
+               free(what);
        return killed;
 }
 
index 4c18e5d5134bb8d150ff088f7331de3205698a0b..3e916f42286add69b472838ade134d726892f4a9 100644 (file)
@@ -29,9 +29,7 @@ long uptime(void)
  */
 static inline void sanitize_fds(void)
 {
-       int fd = open(bb_dev_null, O_RDWR, 0);
-       if (fd < 0)
-               return;
+       int fd = xopen(bb_dev_null, O_RDWR);
        while (fd < 3)
                fd = dup(fd);
        close(fd);
index 4422d309925e9697998717fcb1d07a57bb75e1e0..a0e81bb1306038bed003dfc85f9c93acfe8ffad2 100644 (file)
@@ -13,9 +13,9 @@
 
 int dumpleases_main(int argc, char *argv[])
 {
-       FILE *fp;
+       int fp;
        int i, c, mode = REMAINING;
-       long expires;
+       unsigned long expires;
        const char *file = LEASES_FILE;
        struct dhcpOfferedAddr lease;
        struct in_addr addr;
@@ -43,11 +43,11 @@ int dumpleases_main(int argc, char *argv[])
                }
        }
 
-       fp = xfopen(file, "r");
+       fp = xopen(file, O_RDONLY);
 
        printf("Mac Address       IP-Address      Expires %s\n", mode == REMAINING ? "in" : "at");
        /*     "00:00:00:00:00:00 255.255.255.255 Wed Jun 30 21:49:08 1993" */
-       while (fread(&lease, sizeof(lease), 1, fp)) {
+       while (full_read(fp, &lease, sizeof(lease)) == sizeof(lease)) {
                printf(":%02x"+1, lease.chaddr[0]);
                for (i = 1; i < 6; i++) {
                        printf(":%02x", lease.chaddr[i]);
@@ -59,23 +59,16 @@ int dumpleases_main(int argc, char *argv[])
                        if (!expires)
                                printf("expired\n");
                        else {
-                               if (expires > 60*60*24) {
-                                       printf("%ld days, ", expires / (60*60*24));
-                                       expires %= 60*60*24;
-                               }
-                               if (expires > 60*60) {
-                                       printf("%ld hours, ", expires / (60*60));
-                                       expires %= 60*60;
-                               }
-                               if (expires > 60) {
-                                       printf("%ld minutes, ", expires / 60);
-                                       expires %= 60;
-                               }
-                               printf("%ld seconds\n", expires);
+                               unsigned d, h, m;
+                               d = expires / (24*60*60); expires %= (24*60*60);
+                               h = expires / (60*60); expires %= (60*60);
+                               m = expires / 60; expires %= 60;
+                               if (d) printf("%u days ", d);
+                               printf("%02u:%02u:%02u\n", h, m, (unsigned)expires);
                        }
-               } else printf("%s", ctime(&expires));
+               } else fputs(ctime(&expires), stdout);
        }
-       fclose(fp);
+       /* close(fp); */
 
        return 0;
 }
index 317e861c098f0f1d0ec7213a65f4e2f81c7c8cd7..2c2c5422c3e44dd8c071db8f4f2bc678ef8aef7c 100644 (file)
@@ -272,27 +272,32 @@ int read_config(const char *file)
                if (keywords[i].def[0])
                        keywords[i].handler(keywords[i].def, keywords[i].var);
 
-       if (!(in = fopen(file, "r"))) {
-               bb_error_msg("unable to open config file: %s", file);
+       in = fopen(file, "r");
+       if (!in) {
+               bb_error_msg("cannot open config file: %s", file);
                return 0;
        }
 
        while (fgets(buffer, READ_CONFIG_BUF_SIZE, in)) {
                char debug_orig[READ_CONFIG_BUF_SIZE];
+               char *p;
 
                lm++;
-               if (strchr(buffer, '\n')) *(strchr(buffer, '\n')) = '\0';
+               p = strchr(buffer, '\n');
+               if (p) *p = '\0';
                if (ENABLE_FEATURE_UDHCP_DEBUG) strcpy(debug_orig, buffer);
-               if (strchr(buffer, '#')) *(strchr(buffer, '#')) = '\0';
+               p = strchr(buffer, '#');
+               if (p) *p = '\0';
 
                if (!(token = strtok(buffer, " \t"))) continue;
                if (!(line = strtok(NULL, ""))) continue;
 
                /* eat leading whitespace */
-               line = line + strspn(line, " \t=");
+               line = skip_whitespace(line);
                /* eat trailing whitespace */
-               for (i = strlen(line); i > 0 && isspace(line[i - 1]); i--);
-               line[i] = '\0';
+               i = strlen(line) - 1;
+               while (i >= 0 && isspace(line[i]))
+                       line[i--] = '\0';
 
                for (i = 0; keywords[i].keyword[0]; i++)
                        if (!strcasecmp(token, keywords[i].keyword))
@@ -311,14 +316,14 @@ int read_config(const char *file)
 
 void write_leases(void)
 {
-       FILE *fp;
-       unsigned int i;
-       char buf[255];
+       int fp;
+       unsigned i;
        time_t curr = time(0);
        unsigned long tmp_time;
 
-       if (!(fp = fopen(server_config.lease_file, "w"))) {
-               bb_error_msg("unable to open %s for writing", server_config.lease_file);
+       fp = open(server_config.lease_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
+       if (fp < 0) {
+               bb_error_msg("cannot open %s for writing", server_config.lease_file);
                return;
        }
 
@@ -334,33 +339,38 @@ void write_leases(void)
                                else leases[i].expires -= curr;
                        } /* else stick with the time we got */
                        leases[i].expires = htonl(leases[i].expires);
-                       fwrite(&leases[i], sizeof(struct dhcpOfferedAddr), 1, fp);
+                       // FIXME: error check??
+                       full_write(fp, &leases[i], sizeof(leases[i]));
 
-                       /* Then restore it when done. */
+                       /* then restore it when done */
                        leases[i].expires = tmp_time;
                }
        }
-       fclose(fp);
+       close(fp);
 
        if (server_config.notify_file) {
-               sprintf(buf, "%s %s", server_config.notify_file, server_config.lease_file);
-               system(buf);
+               char *cmd = xasprintf("%s %s", server_config.notify_file, server_config.lease_file);
+               system(cmd);
+               free(cmd);
        }
 }
 
 
 void read_leases(const char *file)
 {
-       FILE *fp;
+       int fp;
        unsigned int i = 0;
        struct dhcpOfferedAddr lease;
 
-       if (!(fp = fopen(file, "r"))) {
-               bb_error_msg("unable to open %s for reading", file);
+       fp = open(file, O_RDONLY);
+       if (fp < 0) {
+               bb_error_msg("cannot open %s for reading", file);
                return;
        }
 
-       while (i < server_config.max_leases && (fread(&lease, sizeof lease, 1, fp) == 1)) {
+       while (i < server_config.max_leases
+        && full_read(fp, &lease, sizeof(lease)) == sizeof(lease)
+       ) {
                /* ADDME: is it a static lease */
                if (lease.yiaddr >= server_config.start && lease.yiaddr <= server_config.end) {
                        lease.expires = ntohl(lease.expires);
@@ -373,5 +383,5 @@ void read_leases(const char *file)
                }
        }
        DEBUG("Read %d leases", i);
-       fclose(fp);
+       close(fp);
 }
index 8d00490af1d7c987ea8413ad0c251cd93f69fce5..bcb2608c57e5ba98894ae633fd01b77e8a3f2d9a 100644 (file)
@@ -23,7 +23,7 @@
 #include "common.h"
 
 
-static char *saved_pidfile;
+static const char *saved_pidfile;
 
 static void pidfile_delete(void)
 {
@@ -36,14 +36,14 @@ int pidfile_acquire(const char *pidfile)
        int pid_fd;
        if (!pidfile) return -1;
 
-       pid_fd = open(pidfile, O_CREAT | O_WRONLY, 0644);
+       pid_fd = open(pidfile, O_CREAT|O_WRONLY|O_TRUNC, 0644);
        if (pid_fd < 0) {
-               bb_perror_msg("unable to open pidfile %s", pidfile);
+               bb_perror_msg("cannot open pidfile %s", pidfile);
        } else {
                lockf(pid_fd, F_LOCK, 0);
                if (!saved_pidfile)
                        atexit(pidfile_delete);
-               saved_pidfile = (char *) pidfile;
+               saved_pidfile = pidfile;
        }
 
        return pid_fd;