xreadlink: code shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 8 Nov 2007 17:40:23 +0000 (17:40 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 8 Nov 2007 17:40:23 +0000 (17:40 -0000)
udhcp: add missing tryagain member to client_config

function                                             old     new   delta
xmalloc_readlink_follow                              169     154     -15
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-15)             Total: -15 bytes

libbb/xreadlink.c
loginutils/login.c
networking/udhcp/dhcpc.h

index 2f6b1e2..f7948cb 100644 (file)
@@ -41,14 +41,21 @@ char *xmalloc_readlink(const char *path)
  */
 char *xmalloc_readlink_follow(const char *path)
 {
-       char *buf = NULL, *lpc, *linkpath;
+       char *buf;
+       char *lpc;
+       char *linkpath;
        int bufsize;
-       smallint looping = 0;
+       int looping = MAXSYMLINKS + 1;
 
-       buf = strdup(path);
-       bufsize = strlen(path) + 1;
+       linkpath = xstrdup(path);
+       goto jump_in;
 
-       while(1) {
+       while (1) {
+               if (!--looping) {
+                       free(linkpath);
+                       free(buf);
+                       return NULL;
+               }
                linkpath = xmalloc_readlink(buf);
                if (!linkpath) {
                        if (errno == EINVAL) /* not a symlink */
@@ -56,25 +63,19 @@ char *xmalloc_readlink_follow(const char *path)
                        free(buf);
                        return NULL;
                } 
-
-               if (*linkpath == '/') {
-                       free(buf);
-                       buf = linkpath;
-                       bufsize = strlen(linkpath) + 1;
-               } else {
+               if (linkpath[0] != '/') {
                        bufsize += strlen(linkpath);
-                       if (looping++ > MAXSYMLINKS) {
-                               free(linkpath);
-                               free(buf);
-                               return NULL;
-                       }
                        buf = xrealloc(buf, bufsize);
                        lpc = bb_get_last_path_component_strip(buf);
                        strcpy(lpc, linkpath);
                        free(linkpath);
+               } else {
+                       free(buf);
+ jump_in:
+                       buf = linkpath;
+                       bufsize = strlen(buf) + 1;
                }
        }
-
 }
 
 char *xmalloc_readlink_or_warn(const char *path)
index c1e0c76..7e90446 100644 (file)
@@ -305,9 +305,8 @@ int login_main(int argc, char **argv)
        openlog(applet_name, LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
 
        while (1) {
-
                /* flush away any type-ahead (as getty does) */
-               (void) ioctl(0, TCFLSH, TCIFLUSH);
+               ioctl(0, TCFLSH, TCIFLUSH);
 
                if (!username[0])
                        get_username_or_die(username, sizeof(username));
index 8da1dd8..72a8bd9 100644 (file)
@@ -30,6 +30,7 @@ struct client_config_t {
        int ifindex;                    /* Index number of the interface to use */
        int retries;                    /* Max number of request packets */
        int timeout;                    /* Number of seconds to try to get a lease */
+       int tryagain;                   /* Number of seconds to try to get a lease */
        uint8_t arp[6];                 /* Our arp address */
 };