xreadlink: code shrink udhcp: add missing tryagain member to client_config
No binary (build failed)
—
(log yok)
| @@ -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) | |
| @@ -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)); | |
| @@ -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 */ | |
| }; | |