apply post 1.10.3 patches, release 1.10.4 1_10_stable
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 25 Jun 2008 11:01:42 +0000 (11:01 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 25 Jun 2008 11:01:42 +0000 (11:01 -0000)
Makefile
archival/libunarchive/get_header_tar.c
networking/tcpudp.c
networking/udhcp/clientsocket.c
shell/msh.c
util-linux/mount.c

index be843fc94de6b6cfa2e21440b84bf52570671e9c..de855fe36295d197f140787cd40446bc2cde900a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 10
-SUBLEVEL = 3
+SUBLEVEL = 4
 EXTRAVERSION =
 NAME = Unnamed
 
index b1a797a084f331d907a999f2c62c39620e7237ad..187552c28438e9d2a08973217f7f35aa29d6a8d8 100644 (file)
@@ -99,7 +99,7 @@ char get_header_tar(archive_handle_t *archive_handle)
         * "tar: A lone zero block at N", where N = kilobyte
         * where EOF was met (not EOF block, actual EOF!),
         * and tar will exit with error code 0.
-        * We will mimic exit(0), although we will not mimic
+        * We will mimic exit(EXIT_SUCCESS), although we will not mimic
         * the message and we don't check whether we indeed
         * saw zero block directly before this. */
        if (i == 0)
@@ -138,12 +138,12 @@ char get_header_tar(archive_handle_t *archive_handle)
                /* tar gz/bz autodetect: check for gz/bz2 magic.
                 * If it is the very first block, and we see the magic,
                 * we can switch to get_header_tar_gz/bz2/lzma().
-                * Needs seekable fd. I wish recv(MSG_PEEK) would work
+                * Needs seekable fd. I wish recv(MSG_PEEK) works
                 * on any fd... */
                if (not_first)
                        goto err;
 #if ENABLE_FEATURE_TAR_GZIP
-               if (tar.name[0] == 0x1f && tar.name[1] == 0x8b) { /* gzip */
+               if (tar.name[0] == 0x1f && tar.name[1] == (char)0x8b) { /* gzip */
                        get_header_ptr = get_header_tar_gz;
                } else
 #endif
@@ -220,9 +220,7 @@ char get_header_tar(archive_handle_t *archive_handle)
        }
        file_header->link_target = NULL;
        if (!linkname && parse_names && tar.linkname[0]) {
-               /* we trash magic[0] here, it's ok */
-               tar.linkname[sizeof(tar.linkname)] = '\0';
-               file_header->link_target = xstrdup(tar.linkname);
+               file_header->link_target = xstrndup(tar.linkname, sizeof(tar.linkname));
                /* FIXME: what if we have non-link object with link_target? */
                /* Will link_target be free()ed? */
        }
@@ -240,10 +238,12 @@ char get_header_tar(archive_handle_t *archive_handle)
        file_header->name = NULL;
        if (!longname && parse_names) {
                /* we trash mode[0] here, it's ok */
-               tar.name[sizeof(tar.name)] = '\0';
+               //tar.name[sizeof(tar.name)] = '\0'; - gcc 4.3.0 would complain
+               tar.mode[0] = '\0';
                if (tar.prefix[0]) {
                        /* and padding[0] */
-                       tar.prefix[sizeof(tar.prefix)] = '\0';
+                       //tar.prefix[sizeof(tar.prefix)] = '\0'; - gcc 4.3.0 would complain
+                       tar.padding[0] = '\0';
                        file_header->name = concat_path_file(tar.prefix, tar.name);
                } else
                        file_header->name = xstrdup(tar.name);
index 0b604af482c691e684a05b1c5f524699cba2fe77..07a87b8ede02a530c2ec1b5da263a6a884ad1a22 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "libbb.h"
 /* Wants <limits.h> etc, thus included after libbb.h: */
+#include <linux/types.h> /* for __be32 etc */
 #include <linux/netfilter_ipv4.h>
 
 // TODO: move into this file:
index 1142001921f6c8dc9eb466f3e3e55af222f032e6..6185610bedfed512795f0d9346f39da2edb82122 100644 (file)
@@ -76,7 +76,7 @@ int raw_socket(int ifindex)
                BPF_STMT(BPF_LD|BPF_W|BPF_IND, 0),
                BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, SERVER_AND_CLIENT_PORTS, 0, 1), /* L3, L4 */
                /* returns */
-               BPF_STMT(BPF_RET|BPF_K, (~(uint32_t)0) ),               /* L3: pass */
+               BPF_STMT(BPF_RET|BPF_K, 0x0fffffff),                    /* L3: pass */
                BPF_STMT(BPF_RET|BPF_K, 0),                             /* L4: reject */
        };
        static const struct sock_fprog filter_prog = {
index 63f365962e293ed744a97a57fd2923da46b5c4d0..2b6b3853f44b36cf2a40731e644ae56e72576d83 100644 (file)
@@ -92,17 +92,17 @@ static char *itoa(int n)
 #ifdef MSHDEBUG
 static int mshdbg = MSHDEBUG;
 
-#define DBGPRINTF(x)   if (mshdbg>0) printf x
-#define DBGPRINTF0(x)  if (mshdbg>0) printf x
-#define DBGPRINTF1(x)  if (mshdbg>1) printf x
-#define DBGPRINTF2(x)  if (mshdbg>2) printf x
-#define DBGPRINTF3(x)  if (mshdbg>3) printf x
-#define DBGPRINTF4(x)  if (mshdbg>4) printf x
-#define DBGPRINTF5(x)  if (mshdbg>5) printf x
-#define DBGPRINTF6(x)  if (mshdbg>6) printf x
-#define DBGPRINTF7(x)  if (mshdbg>7) printf x
-#define DBGPRINTF8(x)  if (mshdbg>8) printf x
-#define DBGPRINTF9(x)  if (mshdbg>9) printf x
+#define DBGPRINTF(x)   if (mshdbg > 0) printf x
+#define DBGPRINTF0(x)  if (mshdbg > 0) printf x
+#define DBGPRINTF1(x)  if (mshdbg > 1) printf x
+#define DBGPRINTF2(x)  if (mshdbg > 2) printf x
+#define DBGPRINTF3(x)  if (mshdbg > 3) printf x
+#define DBGPRINTF4(x)  if (mshdbg > 4) printf x
+#define DBGPRINTF5(x)  if (mshdbg > 5) printf x
+#define DBGPRINTF6(x)  if (mshdbg > 6) printf x
+#define DBGPRINTF7(x)  if (mshdbg > 7) printf x
+#define DBGPRINTF8(x)  if (mshdbg > 8) printf x
+#define DBGPRINTF9(x)  if (mshdbg > 9) printf x
 
 static int mshdbg_rc = 0;
 
@@ -124,7 +124,7 @@ static int mshdbg_rc = 0;
 
 #define RCPRINTF(x) ((void)0)
 
-#endif                                                 /* MSHDEBUG */
+#endif  /* MSHDEBUG */
 
 
 #if ENABLE_FEATURE_EDITING_FANCY_PROMPT
@@ -141,13 +141,13 @@ static int mshdbg_rc = 0;
  * shell
  */
 
-#define        LINELIM   2100
-#define        NPUSH     8                             /* limit to input nesting */
+#define LINELIM   2100
+#define NPUSH     8             /* limit to input nesting */
 
 #undef NOFILE
-#define        NOFILE    20                    /* Number of open files */
-#define        NUFILE    10                    /* Number of user-accessible files */
-#define        FDBASE    10                    /* First file usable by Shell */
+#define NOFILE    20            /* Number of open files */
+#define NUFILE    10            /* Number of user-accessible files */
+#define FDBASE    10            /* First file usable by Shell */
 
 /*
  * values returned by wait
@@ -159,7 +159,7 @@ static int mshdbg_rc = 0;
 /*
  * library and system definitions
  */
-typedef void xint;                             /* base type of jmp_buf, for not broken compilers */
+typedef void xint;              /* base type of jmp_buf, for not broken compilers */
 
 /*
  * shell components
@@ -588,14 +588,13 @@ static const struct builtincmd builtincmds[] = {
        { NULL      , NULL       },
 };
 
-static struct op *scantree(struct op *);
 static struct op *dowholefile(int /*, int*/);
 
 
 /* Globals */
 static char **dolv;
 static int dolc;
-static int exstat;
+static uint8_t exstat;
 static smallint gflg;                   /* (seems to be a parse error indicator) */
 static smallint interactive;            /* Is this an interactive shell */
 static smallint execflg;
@@ -726,7 +725,7 @@ static void print_tree(struct op *head)
                return;
        }
 
-       DBGPRINTF(("NODE: %p,  left %p, right %p\n", head, head->left,
+       DBGPRINTF(("NODE: %p, left %p, right %p\n", head, head->left,
                           head->right));
 
        if (head->left)
@@ -744,7 +743,7 @@ static void print_tree(struct op *head)
 static void prs(const char *s)
 {
        if (*s)
-               write(2, s, strlen(s));
+               write(STDERR_FILENO, s, strlen(s));
 }
 
 static void prn(unsigned u)
@@ -807,7 +806,8 @@ static void warn(const char *s)
 {
        if (*s) {
                prs(s);
-               exstat = -1;
+               if (!exstat)
+                       exstat = 255;
        }
        prs("\n");
        if (FLAG['e'])
@@ -1278,6 +1278,7 @@ static int newfile(char *s)
 }
 
 
+#ifdef UNUSED
 struct op *scantree(struct op *head)
 {
        struct op *dotnode;
@@ -1309,6 +1310,7 @@ struct op *scantree(struct op *head)
 
        return NULL;
 }
+#endif
 
 
 static void onecommand(void)
@@ -2740,7 +2742,7 @@ static int forkexec(struct op *t, int *pin, int *pout, int no_fork, char **wp)
        // longjmps away (at "Run builtin" below), leaving t->op_words clobbered!
        // See http://bugs.busybox.net/view.php?id=846.
        // Now we do not touch t->op_words, but separately pass wp as param list
-       // to builtins 
+       // to builtins
        DBGPRINTF(("FORKEXEC: bltin %p, no_fork %d, owp %p\n", bltin,
                        no_fork, owp));
        /* Don't fork if it is a lone builtin (not in pipe)
@@ -2854,7 +2856,7 @@ static int forkexec(struct op *t, int *pin, int *pout, int no_fork, char **wp)
        if (t->op_type == TPAREN)
                _exit(execute(t->left, NOPIPE, NOPIPE, /* no_fork: */ 1));
        if (wp[0] == NULL)
-               _exit(0);
+               _exit(EXIT_SUCCESS);
 
        cp = rexecve(wp[0], wp, makenv(0, NULL));
        prs(wp[0]);
@@ -3006,7 +3008,7 @@ static int waitfor(int lastpid, int canintr)
                                        prs(" - core dumped");
                                if (rv >= ARRAY_SIZE(signame) || signame[rv])
                                        prs("\n");
-                               rv = -1;
+                               rv |= 0x80;
                        } else
                                rv = WAITVAL(s);
                }
@@ -3070,8 +3072,6 @@ static const char *rexecve(char *c, char **v, char **envp)
                if (tp != global_env.linep)
                        *tp++ = '/';
                strcpy(tp, c);
-               //for (i = 0; (*tp++ = c[i++]) != '\0';)
-               //      continue;
 
                DBGPRINTF3(("REXECVE: global_env.linep is %s\n", global_env.linep));
 
@@ -3079,10 +3079,13 @@ static const char *rexecve(char *c, char **v, char **envp)
 
                switch (errno) {
                case ENOEXEC:
+                       /* File is executable but file format isnt recognized */
+                       /* Run it as a shell script */
+                       /* (execve above didnt do it itself, unlike execvp) */
                        *v = global_env.linep;
                        v--;
                        tp = *v;
-                       *v = global_env.linep;
+                       *v = (char*)DEFAULT_SHELL;
                        execve(DEFAULT_SHELL, v, envp);
                        *v = tp;
                        return "no shell";
@@ -3094,7 +3097,12 @@ static const char *rexecve(char *c, char **v, char **envp)
                        return "argument list too long";
                }
        }
-       return errno == ENOENT ? "not found" : "cannot execute";
+       if (errno == ENOENT) {
+               exstat = 127; /* standards require this */
+               return "not found";
+       }
+       exstat = 126; /* mimic bash */
+       return "cannot execute";
 }
 
 /*
@@ -3383,7 +3391,7 @@ static int doread(struct op *t ATTRIBUTE_UNUSED, char **args)
        }
        for (wp = args + 1; *wp; wp++) {
                for (cp = global_env.linep; !nl && cp < elinep - 1; cp++) {
-                       nb = nonblock_safe_read(0, cp, sizeof(*cp));
+                       nb = nonblock_safe_read(STDIN_FILENO, cp, sizeof(*cp));
                        if (nb != sizeof(*cp))
                                break;
                        nl = (*cp == '\n');
@@ -4206,7 +4214,7 @@ static int grave(int quoted)
        prs(argument_list[0]);
        prs(": ");
        err(cp);
-       _exit(1);
+       _exit(EXIT_FAILURE);
 }
 
 
@@ -4308,9 +4316,7 @@ static void globname(char *we, char *pp)
        dname[NAME_MAX] = '\0';
        while ((de = readdir(dirp)) != NULL) {
                /* XXX Hmmm... What this could be? (abial) */
-               /*
-                  if (ent[j].d_ino == 0)
-                     continue;
+               /* if (ent[j].d_ino == 0) continue;
                 */
                strncpy(dname, de->d_name, NAME_MAX);
                if (dname[0] == '.')
@@ -4521,7 +4527,7 @@ static int readc(void)
 static void ioecho(char c)
 {
        if (FLAG['v'])
-               write(2, &c, sizeof c);
+               write(STDERR_FILENO, &c, sizeof c);
 }
 
 static void pushio(struct ioarg *argp, int (*fn) (struct ioarg *))
@@ -4732,7 +4738,7 @@ static int filechar(struct ioarg *ap)
                while (size == 0 || position >= size) {
                        size = read_line_input(current_prompt, filechar_cmdbuf, BUFSIZ, line_input_state);
                        if (size < 0) /* Error/EOF */
-                               exit(0);
+                               exit(EXIT_SUCCESS);
                        position = 0;
                        /* if Ctrl-C, size == 0 and loop will repeat */
                }
@@ -4817,7 +4823,7 @@ static int linechar(struct ioarg *ap)
 }
 
 /*
- * remap fd into Shell's fd space
+ * Remap fd into shell's fd space
  */
 static int remap(int fd)
 {
@@ -5203,7 +5209,7 @@ int msh_main(int argc, char **argv)
 
 /* Shell is non-interactive, activate printf-based debug */
 #ifdef MSHDEBUG
-                       mshdbg = (int) (((char) (mshdbg_var->value[0])) - '0');
+                       mshdbg = mshdbg_var->value[0] - '0';
                        if (mshdbg < 0)
                                mshdbg = 0;
 #endif
@@ -5211,7 +5217,7 @@ int msh_main(int argc, char **argv)
 
                        name = *++argv;
                        if (newfile(name))
-                               exit(1);                /* Exit on error */
+                               exit(EXIT_FAILURE);  /* Exit on error */
                }
        }
 
index bd5f27b2e64e0d2690ef50cf9d7664829d46e69e..53d91f387486aedf84ab6bcbbe5c459d35f9a295 100644 (file)
@@ -1059,6 +1059,7 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts)
        if (filteropts) for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) {
                char *opteq = strchr(opt, '=');
                if (opteq) {
+                       int val, idx;
                        static const char options[] ALIGN1 =
                                /* 0 */ "rsize\0"
                                /* 1 */ "wsize\0"
@@ -1081,87 +1082,92 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts)
                                /* 18 */ "proto\0"
                                /* 19 */ "namlen\0"
                                /* 20 */ "addr\0";
-                       int val = xatoi_u(opteq + 1);
-                       *opteq = '\0';
-                       switch (index_in_strings(options, opt)) {
+
+                       *opteq++ = '\0';
+                       idx = index_in_strings(options, opt);
+                       switch (idx) {
+                       case 12: // "mounthost"
+                               mounthost = xstrndup(opteq,
+                                               strcspn(opteq, " \t\n\r,"));
+                               continue;
+                       case 18: // "proto"
+                               if (!strncmp(opteq, "tcp", 3))
+                                       tcp = 1;
+                               else if (!strncmp(opteq, "udp", 3))
+                                       tcp = 0;
+                               else
+                                       bb_error_msg("warning: unrecognized proto= option");
+                               continue;
+                       case 20: // "addr" - ignore
+                               continue;
+                       }
+
+                       val = xatoi_u(opteq);
+                       switch (idx) {
                        case 0: // "rsize"
                                data.rsize = val;
-                               break;
+                               continue;
                        case 1: // "wsize"
                                data.wsize = val;
-                               break;
+                               continue;
                        case 2: // "timeo"
                                data.timeo = val;
-                               break;
+                               continue;
                        case 3: // "retrans"
                                data.retrans = val;
-                               break;
+                               continue;
                        case 4: // "acregmin"
                                data.acregmin = val;
-                               break;
+                               continue;
                        case 5: // "acregmax"
                                data.acregmax = val;
-                               break;
+                               continue;
                        case 6: // "acdirmin"
                                data.acdirmin = val;
-                               break;
+                               continue;
                        case 7: // "acdirmax"
                                data.acdirmax = val;
-                               break;
+                               continue;
                        case 8: // "actimeo"
                                data.acregmin = val;
                                data.acregmax = val;
                                data.acdirmin = val;
                                data.acdirmax = val;
-                               break;
+                               continue;
                        case 9: // "retry"
                                retry = val;
-                               break;
+                               continue;
                        case 10: // "port"
                                port = val;
-                               break;
+                               continue;
                        case 11: // "mountport"
                                mountport = val;
-                               break;
-                       case 12: // "mounthost"
-                               mounthost = xstrndup(opteq+1,
-                                               strcspn(opteq+1," \t\n\r,"));
-                               break;
+                               continue;
                        case 13: // "mountprog"
                                mountprog = val;
-                               break;
+                               continue;
                        case 14: // "mountvers"
                                mountvers = val;
-                               break;
+                               continue;
                        case 15: // "nfsprog"
                                nfsprog = val;
-                               break;
+                               continue;
                        case 16: // "nfsvers"
                        case 17: // "vers"
                                nfsvers = val;
-                               break;
-                       case 18: // "proto"
-                               if (!strncmp(opteq+1, "tcp", 3))
-                                       tcp = 1;
-                               else if (!strncmp(opteq+1, "udp", 3))
-                                       tcp = 0;
-                               else
-                                       bb_error_msg("warning: unrecognized proto= option");
-                               break;
+                               continue;
                        case 19: // "namlen"
-                               if (nfs_mount_version >= 2)
+                               //if (nfs_mount_version >= 2)
                                        data.namlen = val;
-                               else
-                                       bb_error_msg("warning: option namlen is not supported\n");
-                               break;
-                       case 20: // "addr" - ignore
-                               break;
+                               //else
+                               //      bb_error_msg("warning: option namlen is not supported\n");
+                               continue;
                        default:
                                bb_error_msg("unknown nfs mount parameter: %s=%d", opt, val);
                                goto fail;
                        }
                }
-               else {
+               else { /* not of the form opt=val */
                        static const char options[] ALIGN1 =
                                "bg\0"
                                "fg\0"