Apply post-1.11.0 patches. Bump version to 1.11.1.
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 11 Jul 2008 12:19:14 +0000 (12:19 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 11 Jul 2008 12:19:14 +0000 (12:19 -0000)
15 files changed:
Config.in
Makefile
applets/individual.c
archival/libunarchive/decompress_bunzip2.c
coreutils/uname.c
coreutils/who.c
debianutils/start_stop_daemon.c
editors/awk.c
editors/vi.c
include/usage.h
libbb/print_flags.c
miscutils/last.c
miscutils/last_fancy.c
miscutils/man.c
scripts/mkmakefile [new file with mode: 0755]

index 416ffaad47496c5663208a221d3b413a4433f0ca..a7c3149cbf19e807d4bc3a81323dfad641a48976 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -298,7 +298,7 @@ config NOMMU
 config BUILD_LIBBUSYBOX
        bool "Build shared libbusybox"
        default n
-       depends on !FEATURE_PREFER_APPLETS && !PIE
+       depends on !FEATURE_PREFER_APPLETS && !PIE && !STATIC
        help
          Build a shared library libbusybox.so.N.N.N which contains all
          busybox code.
index 3a9630a4fe576c484e894a6ddcbe66ed89caf14b..6d0cc3898dfba2f7635d9e16dbf4b7928e03befe 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 11
-SUBLEVEL = 0
+SUBLEVEL = 1
 EXTRAVERSION =
 NAME = Unnamed
 
index 414a11b05c940dc4c2a461ee018d2dea5cbb5ab4..341f4d1c2c8c26c09710abeea63e962e1faebfa7 100644 (file)
@@ -14,13 +14,11 @@ const char *applet_name;
 int main(int argc, char **argv)
 {
        applet_name = argv[0];
-
        return APPLET_main(argc,argv);
 }
 
 void bb_show_usage(void)
 {
-       printf(APPLET_full_usage "\n");
-
+       fputs(APPLET_full_usage "\n", stdout);
        exit(EXIT_FAILURE);
 }
index 8f35bc5f9a4839a01b814564debe1e7adaf7c959..e034814c09bf13bf78e48d5a7ad6a99c229dd6ac 100644 (file)
@@ -66,7 +66,6 @@ struct group_data {
  *  | grep 'bd->' | sed 's/^.*bd->/bd->/' | sort | $PAGER
  * and moved it (inbufBitCount) to offset 0.
  */
-
 struct bunzip_data {
        /* I/O tracking data (file handles, buffers, positions, etc.) */
        unsigned inbufBitCount, inbufBits;
@@ -102,11 +101,9 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
 
        /* If we need to get more data from the byte buffer, do so.  (Loop getting
           one byte at a time to enforce endianness and avoid unaligned access.) */
-
        while ((int)(bd->inbufBitCount) < bits_wanted) {
 
                /* If we need to read more data from file into byte buffer, do so */
-
                if (bd->inbufPos == bd->inbufCount) {
                        /* if "no input fd" case: in_fd == -1, read fails, we jump */
                        bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE);
@@ -116,7 +113,6 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
                }
 
                /* Avoid 32-bit overflow (dump bit buffer to top of output) */
-
                if (bd->inbufBitCount >= 24) {
                        bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1);
                        bits_wanted -= bd->inbufBitCount;
@@ -125,13 +121,11 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
                }
 
                /* Grab next 8 bits of input from buffer. */
-
                bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++];
                bd->inbufBitCount += 8;
        }
 
        /* Calculate result */
-
        bd->inbufBitCount -= bits_wanted;
        bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1);
 
@@ -139,7 +133,6 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
 }
 
 /* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
-
 static int get_next_block(bunzip_data *bd)
 {
        struct group_data *hufGroup;
@@ -153,13 +146,11 @@ static int get_next_block(bunzip_data *bd)
        selectors = bd->selectors;
 
        /* Reset longjmp I/O error handling */
-
        i = setjmp(bd->jmpbuf);
        if (i) return i;
 
        /* Read in header signature and CRC, then validate signature.
           (last block signature means CRC is for whole file, return now) */
-
        i = get_bits(bd, 24);
        j = get_bits(bd, 24);
        bd->headerCRC = get_bits(bd, 32);
@@ -169,7 +160,6 @@ static int get_next_block(bunzip_data *bd)
        /* We can add support for blockRandomised if anybody complains.  There was
           some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
           it didn't actually work. */
-
        if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT;
        origPtr = get_bits(bd, 24);
        if ((int)origPtr > dbufSize) return RETVAL_DATA_ERROR;
@@ -179,7 +169,6 @@ static int get_next_block(bunzip_data *bd)
           symbols to deal with, and writes a sparse bitfield indicating which
           values were present.  We make a translation table to convert the symbols
           back to the corresponding bytes. */
-
        t = get_bits(bd, 16);
        symTotal = 0;
        for (i = 0; i < 16; i++) {
@@ -192,7 +181,6 @@ static int get_next_block(bunzip_data *bd)
        }
 
        /* How many different Huffman coding groups does this block use? */
-
        groupCount = get_bits(bd, 3);
        if (groupCount < 2 || groupCount > MAX_GROUPS)
                return RETVAL_DATA_ERROR;
@@ -201,19 +189,16 @@ static int get_next_block(bunzip_data *bd)
           group.  Read in the group selector list, which is stored as MTF encoded
           bit runs.  (MTF=Move To Front, as each value is used it's moved to the
           start of the list.) */
-
        nSelectors = get_bits(bd, 15);
        if (!nSelectors) return RETVAL_DATA_ERROR;
        for (i = 0; i < groupCount; i++) mtfSymbol[i] = i;
        for (i = 0; i < nSelectors; i++) {
 
                /* Get next value */
-
                for (j = 0; get_bits(bd, 1); j++)
                        if (j >= groupCount) return RETVAL_DATA_ERROR;
 
                /* Decode MTF to get the next selector */
-
                uc = mtfSymbol[j];
                for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1];
                mtfSymbol[0] = selectors[i] = uc;
@@ -221,10 +206,11 @@ static int get_next_block(bunzip_data *bd)
 
        /* Read the Huffman coding tables for each group, which code for symTotal
           literal symbols, plus two run symbols (RUNA, RUNB) */
-
        symCount = symTotal + 2;
        for (j = 0; j < groupCount; j++) {
-               unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1];
+               unsigned char length[MAX_SYMBOLS];
+               /* 8 bits is ALMOST enough for temp[], see below */
+               unsigned temp[MAX_HUFCODE_BITS+1];
                int minLen, maxLen, pp;
 
                /* Read Huffman code lengths for each symbol.  They're stored in
@@ -233,7 +219,6 @@ static int get_next_block(bunzip_data *bd)
                   (Subtracting 1 before the loop and then adding it back at the end is
                   an optimization that makes the test inside the loop simpler: symbol
                   length 0 becomes negative, so an unsigned inequality catches it.) */
-
                t = get_bits(bd, 5) - 1;
                for (i = 0; i < symCount; i++) {
                        for (;;) {
@@ -243,7 +228,6 @@ static int get_next_block(bunzip_data *bd)
                                /* If first bit is 0, stop.  Else second bit indicates whether
                                   to increment or decrement the value.  Optimization: grab 2
                                   bits and unget the second if the first was 0. */
-
                                k = get_bits(bd, 2);
                                if (k < 2) {
                                        bd->inbufBitCount++;
@@ -251,17 +235,14 @@ static int get_next_block(bunzip_data *bd)
                                }
 
                                /* Add one if second bit 1, else subtract 1.  Avoids if/else */
-
                                t += (((k+1) & 2) - 1);
                        }
 
                        /* Correct for the initial -1, to get the final symbol length */
-
                        length[i] = t + 1;
                }
 
                /* Find largest and smallest lengths in this group */
-
                minLen = maxLen = length[0];
                for (i = 1; i < symCount; i++) {
                        if (length[i] > maxLen) maxLen = length[i];
@@ -278,7 +259,6 @@ static int get_next_block(bunzip_data *bd)
                 * number of bits can have.  This is how the Huffman codes can vary in
                 * length: each code with a value>limit[length] needs another bit.
                 */
-
                hufGroup = bd->groups + j;
                hufGroup->minLen = minLen;
                hufGroup->maxLen = maxLen;
@@ -286,12 +266,10 @@ static int get_next_block(bunzip_data *bd)
                /* Note that minLen can't be smaller than 1, so we adjust the base
                   and limit array pointers so we're not always wasting the first
                   entry.  We do this again when using them (during symbol decoding).*/
-
                base = hufGroup->base - 1;
                limit = hufGroup->limit - 1;
 
                /* Calculate permute[].  Concurently, initialize temp[] and limit[]. */
-
                pp = 0;
                for (i = minLen; i <= maxLen; i++) {
                        temp[i] = limit[i] = 0;
@@ -301,14 +279,14 @@ static int get_next_block(bunzip_data *bd)
                }
 
                /* Count symbols coded for at each bit length */
-
+               /* NB: in pathological cases, temp[8] can end ip being 256.
+                * That's why uint8_t is too small for temp[]. */
                for (i = 0; i < symCount; i++) temp[length[i]]++;
 
                /* Calculate limit[] (the largest symbol-coding value at each bit
                 * length, which is (previous limit<<1)+symbols at this level), and
                 * base[] (number of symbols to ignore at each bit length, which is
                 * limit minus the cumulative count of symbols coded for already). */
-
                pp = t = 0;
                for (i = minLen; i < maxLen; i++) {
                        pp += temp[i];
@@ -319,7 +297,6 @@ static int get_next_block(bunzip_data *bd)
                           each level we're really only interested in the first few bits,
                           so here we set all the trailing to-be-ignored bits to 1 so they
                           don't affect the value>limit[length] comparison. */
-
                        limit[i] = (pp << (maxLen - i)) - 1;
                        pp <<= 1;
                        t += temp[i];
@@ -335,7 +312,6 @@ static int get_next_block(bunzip_data *bd)
           and run length encoding, saving the result into dbuf[dbufCount++] = uc */
 
        /* Initialize symbol occurrence counters and symbol Move To Front table */
-
        memset(byteCount, 0, sizeof(byteCount)); /* smaller, maybe slower? */
        for (i = 0; i < 256; i++) {
                //byteCount[i] = 0;
@@ -347,8 +323,7 @@ static int get_next_block(bunzip_data *bd)
        runPos = dbufCount = selector = 0;
        for (;;) {
 
-               /* fetch next Huffman coding group from list. */
-
+               /* Fetch next Huffman coding group from list. */
                symCount = GROUP_SIZE - 1;
                if (selector >= nSelectors) return RETVAL_DATA_ERROR;
                hufGroup = bd->groups + selectors[selector++];
@@ -367,7 +342,6 @@ static int get_next_block(bunzip_data *bd)
                   dry).  The following (up to got_huff_bits:) is equivalent to
                   j = get_bits(bd, hufGroup->maxLen);
                 */
-
                while ((int)(bd->inbufBitCount) < hufGroup->maxLen) {
                        if (bd->inbufPos == bd->inbufCount) {
                                j = get_bits(bd, hufGroup->maxLen);
@@ -382,13 +356,11 @@ static int get_next_block(bunzip_data *bd)
  got_huff_bits:
 
                /* Figure how how many bits are in next symbol and unget extras */
-
                i = hufGroup->minLen;
                while (j > limit[i]) ++i;
                bd->inbufBitCount += (hufGroup->maxLen - i);
 
                /* Huffman decode value to get nextSym (with bounds checking) */
-
                if (i > hufGroup->maxLen)
                        return RETVAL_DATA_ERROR;
                j = (j >> (hufGroup->maxLen - i)) - base[i];
@@ -400,11 +372,9 @@ static int get_next_block(bunzip_data *bd)
                   byte, or a repeated run of the most recent literal byte.  First,
                   check if nextSym indicates a repeated run, and if so loop collecting
                   how many times to repeat the last literal. */
-
                if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */
 
                        /* If this is the start of a new run, zero out counter */
-
                        if (!runPos) {
                                runPos = 1;
                                t = 0;
@@ -417,7 +387,6 @@ static int get_next_block(bunzip_data *bd)
                           the basic or 0/1 method (except all bits 0, which would use no
                           symbols, but a run of length 0 doesn't mean anything in this
                           context).  Thus space is saved. */
-
                        t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */
                        if (runPos < dbufSize) runPos <<= 1;
                        goto end_of_huffman_loop;
@@ -427,7 +396,6 @@ static int get_next_block(bunzip_data *bd)
                   how many times to repeat the last literal, so append that many
                   copies to our buffer of decoded symbols (dbuf) now.  (The last
                   literal used is the one at the head of the mtfSymbol array.) */
-
                if (runPos) {
                        runPos = 0;
                        if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR;
@@ -438,7 +406,6 @@ static int get_next_block(bunzip_data *bd)
                }
 
                /* Is this the terminating symbol? */
-
                if (nextSym > symTotal) break;
 
                /* At this point, nextSym indicates a new literal character.  Subtract
@@ -448,7 +415,6 @@ static int get_next_block(bunzip_data *bd)
                   first symbol in the mtf array, position 0, would have been handled
                   as part of a run above.  Therefore 1 unused mtf position minus
                   2 non-literal nextSym values equals -1.) */
-
                if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR;
                i = nextSym - 1;
                uc = mtfSymbol[i];
@@ -457,7 +423,6 @@ static int get_next_block(bunzip_data *bd)
                 * small number of symbols, and are bound by 256 in any case, using
                 * memmove here would typically be bigger and slower due to function
                 * call overhead and other assorted setup costs. */
-
                do {
                        mtfSymbol[i] = mtfSymbol[i-1];
                } while (--i);
@@ -465,13 +430,11 @@ static int get_next_block(bunzip_data *bd)
                uc = symToByte[uc];
 
                /* We have our literal byte.  Save it into dbuf. */
-
                byteCount[uc]++;
                dbuf[dbufCount++] = (unsigned)uc;
 
                /* Skip group initialization if we're not done with this group.  Done
                 * this way to avoid compiler warning. */
-
  end_of_huffman_loop:
                if (symCount--) goto continue_this_group;
        }
@@ -484,7 +447,6 @@ static int get_next_block(bunzip_data *bd)
         */
 
        /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
-
        j = 0;
        for (i = 0; i < 256; i++) {
                k = j + byteCount[i];
@@ -493,7 +455,6 @@ static int get_next_block(bunzip_data *bd)
        }
 
        /* Figure out what order dbuf would be in if we sorted it. */
-
        for (i = 0; i < dbufCount; i++) {
                uc = (unsigned char)(dbuf[i] & 0xff);
                dbuf[byteCount[uc]] |= (i << 8);
@@ -503,11 +464,10 @@ static int get_next_block(bunzip_data *bd)
        /* Decode first byte by hand to initialize "previous" byte.  Note that it
           doesn't get output, and if the first three characters are identical
           it doesn't qualify as a run (hence writeRunCountdown=5). */
-
        if (dbufCount) {
                if ((int)origPtr >= dbufCount) return RETVAL_DATA_ERROR;
                bd->writePos = dbuf[origPtr];
-           bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
+               bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
                bd->writePos >>= 8;
                bd->writeRunCountdown = 5;
        }
@@ -522,7 +482,6 @@ static int get_next_block(bunzip_data *bd)
    error (all errors are negative numbers).  If out_fd!=-1, outbuf and len
    are ignored, data is written to out_fd and return is RETVAL_OK or error.
 */
-
 int read_bunzip(bunzip_data *bd, char *outbuf, int len)
 {
        const unsigned *dbuf;
@@ -539,19 +498,15 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
        /* We will always have pending decoded data to write into the output
           buffer unless this is the very first call (in which case we haven't
           Huffman-decoded a block into the intermediate buffer yet). */
-
        if (bd->writeCopies) {
 
                /* Inside the loop, writeCopies means extra copies (beyond 1) */
-
                --bd->writeCopies;
 
                /* Loop outputting bytes */
-
                for (;;) {
 
                        /* If the output buffer is full, snapshot state and return */
-
                        if (gotcount >= len) {
                                bd->writePos = pos;
                                bd->writeCurrent = current;
@@ -560,13 +515,11 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
                        }
 
                        /* Write next byte into output buffer, updating CRC */
-
                        outbuf[gotcount++] = current;
                        bd->writeCRC = (bd->writeCRC << 8)
-                                                 ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
+                               ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
 
                        /* Loop now if we're outputting multiple copies of this byte */
-
                        if (bd->writeCopies) {
                                --bd->writeCopies;
                                continue;
@@ -582,35 +535,29 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
                        /* After 3 consecutive copies of the same byte, the 4th
                         * is a repeat count.  We count down from 4 instead
                         * of counting up because testing for non-zero is faster */
-
                        if (--bd->writeRunCountdown) {
                                if (current != previous)
                                        bd->writeRunCountdown = 4;
                        } else {
 
                                /* We have a repeated run, this byte indicates the count */
-
                                bd->writeCopies = current;
                                current = previous;
                                bd->writeRunCountdown = 5;
 
                                /* Sometimes there are just 3 bytes (run length 0) */
-
                                if (!bd->writeCopies) goto decode_next_byte;
 
                                /* Subtract the 1 copy we'd output anyway to get extras */
-
                                --bd->writeCopies;
                        }
                }
 
                /* Decompression of this block completed successfully */
-
                bd->writeCRC = ~bd->writeCRC;
                bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC;
 
                /* If this block had a CRC error, force file level CRC error. */
-
                if (bd->writeCRC != bd->headerCRC) {
                        bd->totalCRC = bd->headerCRC + 1;
                        return RETVAL_LAST_BLOCK;
@@ -619,7 +566,6 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
 
        /* Refill the intermediate buffer by Huffman-decoding next block of input */
        /* (previous is just a convenient unused temp variable here) */
-
        previous = get_next_block(bd);
        if (previous) {
                bd->writeCount = previous;
@@ -631,7 +577,6 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
        goto decode_next_byte;
 }
 
-
 /* Allocate the structure, read file header.  If in_fd==-1, inbuf must contain
    a complete bunzip file (len bytes long).  If in_fd!=-1, inbuf and len are
    ignored, and data is read from file handle into temporary buffer. */
@@ -639,7 +584,6 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
 /* Because bunzip2 is used for help text unpacking, and because bb_show_usage()
    should work for NOFORK applets too, we must be extremely careful to not leak
    any allocations! */
-
 int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
                                                int len)
 {
@@ -650,16 +594,13 @@ int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
        };
 
        /* Figure out how much data to allocate */
-
        i = sizeof(bunzip_data);
        if (in_fd != -1) i += IOBUF_SIZE;
 
        /* Allocate bunzip_data.  Most fields initialize to zero. */
-
        bd = *bdp = xzalloc(i);
 
        /* Setup input buffer */
-
        bd->in_fd = in_fd;
        if (-1 == in_fd) {
                /* in this case, bd->inbuf is read-only */
@@ -669,22 +610,18 @@ int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
                bd->inbuf = (unsigned char *)(bd + 1);
 
        /* Init the CRC32 table (big endian) */
-
        crc32_filltable(bd->crc32Table, 1);
 
        /* Setup for I/O error handling via longjmp */
-
        i = setjmp(bd->jmpbuf);
        if (i) return i;
 
        /* Ensure that file starts with "BZh['1'-'9']." */
-
        i = get_bits(bd, 32);
        if ((unsigned)(i - BZh0 - 1) >= 9) return RETVAL_NOT_BZIP_DATA;
 
-       /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of
+       /* Fourth byte (ascii '1'-'9') indicates block size in units of 100k of
           uncompressed data.  Allocate intermediate buffer for block. */
-
        bd->dbufSize = 100000 * (i - BZh0);
 
        /* Cannot use xmalloc - may leak bd in NOFORK case! */
@@ -704,7 +641,6 @@ void dealloc_bunzip(bunzip_data *bd)
 
 
 /* Decompress src_fd to dst_fd.  Stops at end of bzip data, not end of file. */
-
 USE_DESKTOP(long long) int
 unpack_bz2_stream(int src_fd, int dst_fd)
 {
@@ -761,9 +697,9 @@ int main(int argc, char **argv)
        char c;
 
        if (i < 0)
-               fprintf(stderr,"%s\n", bunzip_errors[-i]);
+               fprintf(stderr, "%s\n", bunzip_errors[-i]);
        else if (read(STDIN_FILENO, &c, 1))
-               fprintf(stderr,"Trailing garbage ignored\n");
+               fprintf(stderr, "Trailing garbage ignored\n");
        return -i;
 }
 #endif
index 2eecb5d6d1b40b4d0c038b6ebb0294a0c1800fda..76fd3ca8d18fa87ad488cfc62d7d65c7e78ac583 100644 (file)
@@ -17,7 +17,7 @@
    -m, --machine       sun
    -a, --all           SunOS rocky8 4.0  sun
 
-   The default behavior is equivalent to `-s'.
+   The default behavior is equivalent to '-s'.
 
    David MacKenzie <djm@gnu.ai.mit.edu> */
 
@@ -39,47 +39,43 @@ typedef struct {
 } uname_info_t;
 
 static const char options[] ALIGN1 = "snrvmpa";
-static const unsigned short utsname_offset[] ALIGN2 = {
-       offsetof(uname_info_t,name.sysname),
-       offsetof(uname_info_t,name.nodename),
-       offsetof(uname_info_t,name.release),
-       offsetof(uname_info_t,name.version),
-       offsetof(uname_info_t,name.machine),
-       offsetof(uname_info_t,processor)
+static const unsigned short utsname_offset[] = {
+       offsetof(uname_info_t, name.sysname),
+       offsetof(uname_info_t, name.nodename),
+       offsetof(uname_info_t, name.release),
+       offsetof(uname_info_t, name.version),
+       offsetof(uname_info_t, name.machine),
+       offsetof(uname_info_t, processor)
 };
 
 int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int uname_main(int argc, char **argv)
+int uname_main(int argc ATTRIBUTE_UNUSED, char **argv)
 {
        uname_info_t uname_info;
 #if defined(__sparc__) && defined(__linux__)
        char *fake_sparc = getenv("FAKE_SPARC");
 #endif
-       const unsigned short int *delta;
+       const unsigned short *delta;
        char toprint;
 
        toprint = getopt32(argv, options);
 
-       if (argc != optind) {
+       if (argv[optind]) { /* coreutils-6.9 compat */
                bb_show_usage();
        }
 
-       if (toprint & (1 << 6)) {
+       if (toprint & (1 << 6)) { /* -a => all opts on */
                toprint = 0x3f;
        }
 
-       if (toprint == 0) {
-               toprint = 1;                    /* sysname */
+       if (toprint == 0) { /* no opts => -s (sysname) */
+               toprint = 1;
        }
 
-       if (uname(&uname_info.name) == -1) {
-               bb_error_msg_and_die("cannot get system name");
-       }
+       uname(&uname_info.name); /* never fails */
 
 #if defined(__sparc__) && defined(__linux__)
-       if ((fake_sparc != NULL)
-               && ((fake_sparc[0] == 'y')
-                       || (fake_sparc[0] == 'Y'))) {
+       if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') {
                strcpy(uname_info.name.machine, "sparc");
        }
 #endif
@@ -89,7 +85,8 @@ int uname_main(int argc, char **argv)
        delta = utsname_offset;
        do {
                if (toprint & 1) {
-                       printf(((char *)(&uname_info)) + *delta);
+                       /* printf would not be safe here */
+                       fputs((char *)(&uname_info) + *delta, stdout);
                        if (toprint > 1) {
                                bb_putchar(' ');
                        }
@@ -98,5 +95,5 @@ int uname_main(int argc, char **argv)
        } while (toprint >>= 1);
        bb_putchar('\n');
 
-       fflush_stdout_and_exit(EXIT_SUCCESS);
+       fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */
 }
index a206ec54b580670a5d00f50339a11d12878da590..72fc40453121e0d9efe16bf7bca38d4dd677bf9d 100644 (file)
@@ -56,16 +56,20 @@ int who_main(int argc ATTRIBUTE_UNUSED, char **argv)
        printf("USER       TTY      IDLE      TIME            HOST\n");
        while ((ut = getutent()) != NULL) {
                if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) {
+                       time_t tmp;
                        /* ut->ut_line is device name of tty - "/dev/" */
                        name = concat_path_file("/dev", ut->ut_line);
                        str6[0] = '?';
                        str6[1] = '\0';
                        if (stat(name, &st) == 0)
                                idle_string(str6, st.st_atime);
+                       /* manpages say ut_tv.tv_sec *is* time_t,
+                        * but some systems have it wrong */
+                       tmp = ut->ut_tv.tv_sec;
                        /* 15 chars for time:   Nov 10 19:33:20 */
                        printf("%-10s %-8s %-9s %-15.15s %s\n",
                                        ut->ut_user, ut->ut_line, str6,
-                                       ctime(&(ut->ut_tv.tv_sec)) + 4, ut->ut_host);
+                                       ctime(&tmp) + 4, ut->ut_host);
                        if (ENABLE_FEATURE_CLEAN_UP)
                                free(name);
                }
index 86ec710167d37dc1f62f47c7d0feb0a70b183c22..459fb77e0fe98556a7c461aab2dc751ea8b241f7 100644 (file)
@@ -326,7 +326,9 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
        char *signame;
        char *startas;
        char *chuid;
+#ifdef OLDER_VERSION_OF_X
        struct stat execstat;
+#endif
 #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
 //     char *retry_arg = NULL;
 //     int retries = -1;
@@ -361,6 +363,8 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        if (!(opt & OPT_a))
                startas = execname;
+       if (!execname) /* in case -a is given and -x is not */
+               execname = startas;
 
 //     USE_FEATURE_START_STOP_DAEMON_FANCY(
 //             if (retry_arg)
@@ -374,7 +378,8 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
                if (errno)
                        user_id = xuname2uid(userspec);
        }
-       do_procinit(); /* Both start and stop needs to know current processes */
+       /* Both start and stop need to know current processes */
+       do_procinit();
 
        if (opt & CTX_STOP) {
                int i = do_stop();
@@ -383,17 +388,21 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        if (found) {
                if (!QUIET)
-                       printf("%s already running\n%d\n", execname, found->pid);
+                       printf("%s is already running\n%u\n", execname, (unsigned)found->pid);
                return !(opt & OPT_OKNODO);
        }
 
+#ifdef OLDER_VERSION_OF_X
        if (execname)
                xstat(execname, &execstat);
+#endif
 
        *--argv = startas;
        if (opt & OPT_BACKGROUND) {
 #if BB_MMU
-               bb_daemonize(0);
+               bb_daemonize(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS);
+               /* DAEMON_DEVNULL_STDIO is superfluous -
+                * it's always done by bb_daemonize() */
 #else
                pid_t pid = vfork();
                if (pid < 0) /* error */
@@ -404,19 +413,18 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
                         * so "return 0" may do bad things */
                        _exit(EXIT_SUCCESS);
                }
-               /* child */
+               /* Child */
                setsid(); /* detach from controlling tty */
                /* Redirect stdio to /dev/null, close extra FDs.
                 * We do not actually daemonize because of DAEMON_ONLY_SANITIZE */
-               bb_daemonize_or_rexec(
-                       DAEMON_DEVNULL_STDIO
+               bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO
                        + DAEMON_CLOSE_EXTRA_FDS
                        + DAEMON_ONLY_SANITIZE,
                        NULL /* argv, unused */ );
 #endif
        }
        if (opt & OPT_MAKEPID) {
-               /* user wants _us_ to make the pidfile */
+               /* User wants _us_ to make the pidfile */
                write_pidfile(pidfile);
        }
        if (opt & OPT_c) {
@@ -434,6 +442,6 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
                }
        }
 #endif
-       execv(startas, argv);
+       execvp(startas, argv);
        bb_perror_msg_and_die("cannot start %s", startas);
 }
index fef3246b87b02f6cba3b9f1740db73e935f26f0c..cc5dc84b53b794ff4b2bc6743e102aa280c1ba45 100644 (file)
@@ -681,11 +681,6 @@ static ALWAYS_INLINE int isalnum_(int c)
        return (isalnum(c) || c == '_');
 }
 
-static FILE *afopen(const char *path, const char *mode)
-{
-       return (*path == '-' && *(path+1) == '\0') ? stdin : xfopen(path, mode);
-}
-
 /* -------- working with variables (set/get/copy/etc) -------- */
 
 static xhash *iamarray(var *v)
@@ -2740,7 +2735,7 @@ static rstream *next_input_file(void)
                        ind = getvar_s(incvar(intvar[ARGIND]));
                        fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind));
                        if (fname && *fname && !is_assignment(fname))
-                               F = afopen(fname, "r");
+                               F = xfopen_stdin(fname);
                }
        } while (!F);
 
@@ -2757,8 +2752,9 @@ int awk_main(int argc, char **argv)
 {
        unsigned opt;
        char *opt_F, *opt_W;
-       llist_t *opt_v = NULL;
-       int i, j, flen;
+       llist_t *list_v = NULL;
+       llist_t *list_f = NULL;
+       int i, j;
        var *v;
        var tv;
        char **envp;
@@ -2816,35 +2812,33 @@ int awk_main(int argc, char **argv)
                        *s1 = '=';
                }
        }
-       opt_complementary = "v::";
-       opt = getopt32(argv, "F:v:f:W:", &opt_F, &opt_v, &g_progname, &opt_W);
+       opt_complementary = "v::f::"; /* -v and -f can occur multiple times */
+       opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, &opt_W);
        argv += optind;
        argc -= optind;
        if (opt & 0x1)
                setvar_s(intvar[FS], opt_F); // -F
-       while (opt_v) { /* -v */
-               if (!is_assignment(llist_pop(&opt_v)))
+       while (list_v) { /* -v */
+               if (!is_assignment(llist_pop(&list_v)))
                        bb_show_usage();
        }
-       if (opt & 0x4) { // -f
-               char *s = s; /* die, gcc, die */
-               FILE *from_file = afopen(g_progname, "r");
-               /* one byte is reserved for some trick in next_token */
-               if (fseek(from_file, 0, SEEK_END) == 0) {
-                       flen = ftell(from_file);
-                       s = xmalloc(flen + 4);
-                       fseek(from_file, 0, SEEK_SET);
-                       i = 1 + fread(s + 1, 1, flen, from_file);
-               } else {
+       if (list_f) { /* -f */
+               do {
+                       char *s = NULL;
+                       FILE *from_file;
+
+                       g_progname = llist_pop(&list_f);
+                       from_file = xfopen_stdin(g_progname);
+                       /* one byte is reserved for some trick in next_token */
                        for (i = j = 1; j > 0; i += j) {
                                s = xrealloc(s, i + 4096);
                                j = fread(s + i, 1, 4094, from_file);
                        }
-               }
-               s[i] = '\0';
-               fclose(from_file);
-               parse_program(s + 1);
-               free(s);
+                       s[i] = '\0';
+                       fclose(from_file);
+                       parse_program(s + 1);
+                       free(s);
+               } while (list_f);
        } else { // no -f: take program from 1st parameter
                if (!argc)
                        bb_show_usage();
index 1b335d9a1fa537f573486de243eedeb0a68048a5..81baa890f7e080463dbc166545095deb8c230b6e 100644 (file)
@@ -1894,7 +1894,7 @@ static char *text_hole_make(char *p, int size)    // at "p", make a 'size' byte hol
                p           = new_text + (p           - text);
                text = new_text;
        }
-       memmove(p + size, p, end - p);
+       memmove(p + size, p, end - size - p);
        memset(p, ' ', size);   // clear new hole
        file_modified++;
        return p;
index df8958060940cf6d53eaec7372f3126727ad2f1f..ceac6d0afbf10e33cb53e37f6bbaf9e4312ca870 100644 (file)
        "$ cat TODO | split -a 2 -l 2 TODO_\n"
 
 #define start_stop_daemon_trivial_usage \
-       "[OPTIONS] [" \
-       USE_GETOPT_LONG("--start|--stop") SKIP_GETOPT_LONG("-S|-K") \
-       "] ... [-- arguments...]"
+       "[OPTIONS] [-S|-K] ... [-- arguments...]"
 #define start_stop_daemon_full_usage "\n\n" \
        "Search for matching processes, and then\n" \
        "-S: stop all matching processes.\n" \
index 413f51653db79c0f70af802dd30f8e5bf24ebe94..a1dcc01eccf5d02c9f6193bef483902f3af898b6 100644 (file)
@@ -19,8 +19,8 @@ int print_flags_separated(const int *masks, const char *labels, int flags, const
                                labels);
                        need_separator = separator;
                        flags &= ~ *masks;
-                       masks++;
                }
+               masks++;
                labels += strlen(labels) + 1;
        }
        return flags;
index 612f50488228c7d04410221e1c4081ecda7b82a8..da353fbb11a695a220eda1ba50186e98eaf15761 100644 (file)
@@ -117,6 +117,8 @@ int last_main(int argc, char **argv ATTRIBUTE_UNUSED)
                                        strcpy(ut.ut_line, "system boot");
                        }
                }
+               /* manpages say ut_tv.tv_sec *is* time_t,
+                * but some systems have it wrong */
                t_tmp = (time_t)ut.ut_tv.tv_sec;
                printf("%-10s %-14s %-18s %-12.12s\n",
                       ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t_tmp) + 4);
index 2b7fee6e58430e4e76aba2c6a357d62937f160c6..d4d35b19a77a207c9395d6bc7795a7bb6e9ce1c4 100644 (file)
@@ -48,8 +48,12 @@ static void show_entry(struct utmp *ut, int state, time_t dur_secs)
        char logout_time[8];
        const char *logout_str;
        const char *duration_str;
+       time_t tmp;
 
-       safe_strncpy(login_time, ctime(&(ut->ut_tv.tv_sec)), 17);
+       /* manpages say ut_tv.tv_sec *is* time_t,
+        * but some systems have it wrong */
+       tmp = ut->ut_tv.tv_sec;
+       safe_strncpy(login_time, ctime(&tmp), 17);
        snprintf(logout_time, 8, "- %s", ctime(&dur_secs) + 11);
 
        dur_secs = MAX(dur_secs - (time_t)ut->ut_tv.tv_sec, (time_t)0);
index 278e5a336adbf7458f1daed9cce7e08eb665141e..dc8fa449dbd97db2ba3bdd63d25047ebbd2b2359 100644 (file)
@@ -73,7 +73,7 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
        char *sec_list;
        char *cur_path, *cur_sect;
        char *line, *value;
-       int count_mp, alloc_mp, cur_mp;
+       int count_mp, cur_mp;
        int opt;
 
        opt_complementary = "-1"; /* at least one argument */
@@ -81,8 +81,8 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
        argv += optind;
 
        sec_list = xstrdup("1:2:3:4:5:6:7:8:9");
-       alloc_mp = 10;
-       man_path_list = xmalloc(10 * sizeof(man_path_list[0]));
+       /* Last valid man_path_list[] is [0x10] */
+       man_path_list = xzalloc(0x11 * sizeof(man_path_list[0]));
        count_mp = 0;
        man_path_list[0] = xstrdup(getenv("MANPATH"));
        if (man_path_list[0])
@@ -107,11 +107,13 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
                                if (strcmp("MANPATH", line) == 0) {
                                        man_path_list[count_mp] = xstrdup(value);
                                        count_mp++;
-                                       if (alloc_mp == count_mp) {
-                                               alloc_mp += 10;
-                                               man_path_list = xrealloc(man_path_list, alloc_mp * sizeof(man_path_list[0]));
+                                       /* man_path_list is NULL terminated */
+                                       man_path_list[count_mp] = NULL;
+                                       if (!(count_mp & 0xf)) { /* 0x10, 0x20 etc */
+                                               /* so that last valid man_path_list[] is [count_mp + 0x10] */
+                                               man_path_list = xrealloc(man_path_list,
+                                                       (count_mp + 0x11) * sizeof(man_path_list[0]));
                                        }
-                                       /* thus man_path_list is always NULL terminated */
                                }
                                if (strcmp("MANSECT", line) == 0) {
                                        free(sec_list);
diff --git a/scripts/mkmakefile b/scripts/mkmakefile
new file mode 100755 (executable)
index 0000000..7f9d544
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Generates a small Makefile used in the root of the output
+# directory, to allow make to be started from there.
+# The Makefile also allow for more convinient build of external modules
+
+# Usage
+# $1 - Kernel src directory
+# $2 - Output directory
+# $3 - version
+# $4 - patchlevel
+
+
+test ! -r $2/Makefile -o -O $2/Makefile || exit 0
+echo "  GEN     $2/Makefile"
+
+cat << EOF > $2/Makefile
+# Automatically generated by $0: don't edit
+
+VERSION = $3
+PATCHLEVEL = $4
+
+KERNELSRC    := $1
+KERNELOUTPUT := $2
+
+MAKEFLAGS += --no-print-directory
+
+.PHONY: all \$(MAKECMDGOALS)
+
+all:
+       \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT)
+
+Makefile:;
+
+\$(filter-out all Makefile,\$(MAKECMDGOALS)) %/:
+       \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@
+EOF