chpst: fix "env directory" parsing to not strip everything
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Apr 2008 16:13:14 +0000 (16:13 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 1 Apr 2008 16:13:14 +0000 (16:13 -0000)
after 1st whitespace. -6 bytes.

runit/chpst.c

index fcac8ee..4de53f0 100644 (file)
@@ -114,6 +114,10 @@ static void edir(const char *directory_name)
        if (!dir)
                bb_perror_msg_and_die("opendir %s", directory_name);
        for (;;) {
+               char buf[256];
+               char *tail;
+               int size;
+
                errno = 0;
                d = readdir(dir);
                if (!d) {
@@ -135,31 +139,25 @@ static void edir(const char *directory_name)
                                bb_perror_msg_and_die("open %s/%s",
                                                directory_name, d->d_name);
                }
-               if (fd >= 0) {
-                       char buf[256];
-                       char *tail;
-                       int size;
-
-                       size = safe_read(fd, buf, sizeof(buf)-1);
-                       if (size < 0)
-                               bb_perror_msg_and_die("read %s/%s",
-                                               directory_name, d->d_name);
-                       if (size == 0) {
-                               unsetenv(d->d_name);
-                               continue;
-                       }
-                       buf[size] = '\n';
-                       tail = memchr(buf, '\n', sizeof(buf));
-                       /* skip trailing whitespace */;
-                       while (1) {
-                               if (tail[0] == ' ') tail[0] = '\0';
-                               if (tail[0] == '\t') tail[0] = '\0';
-                               if (tail[0] == '\n') tail[0] = '\0';
-                               if (tail == buf) break;
-                               tail--;
-                       }
-                       xsetenv(d->d_name, buf);
+               size = full_read(fd, buf, sizeof(buf)-1);
+               close(fd);
+               if (size < 0)
+                       bb_perror_msg_and_die("read %s/%s",
+                                       directory_name, d->d_name);
+               if (size == 0) {
+                       unsetenv(d->d_name);
+                       continue;
+               }
+               buf[size] = '\n';
+               tail = strchr(buf, '\n');
+               /* skip trailing whitespace */
+               while (1) {
+                       *tail = '\0';
+                       tail--;
+                       if (tail < buf || !isspace(*tail))
+                               break;
                }
+               xsetenv(d->d_name, buf);
        }
        closedir(dir);
        if (fchdir(wdir) == -1)