summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-07-11 12:19:14 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-07-11 12:19:14 +0000
commitdee8587d9208e4ea5ba8f8bb73b555007529372e (patch)
tree303d21aeec9e3922e296ecc9041598a87a79b554
parentf941306199d7cb00be68483169f202432a9a9a7d (diff)
downloadbusybox-w32-dee8587d9208e4ea5ba8f8bb73b555007529372e.tar.gz
busybox-w32-dee8587d9208e4ea5ba8f8bb73b555007529372e.tar.bz2
busybox-w32-dee8587d9208e4ea5ba8f8bb73b555007529372e.zip
Apply post-1.11.0 patches. Bump version to 1.11.1.
-rw-r--r--Config.in2
-rw-r--r--Makefile2
-rw-r--r--applets/individual.c4
-rw-r--r--archival/libunarchive/decompress_bunzip2.c86
-rw-r--r--coreutils/uname.c41
-rw-r--r--coreutils/who.c6
-rw-r--r--debianutils/start_stop_daemon.c24
-rw-r--r--editors/awk.c48
-rw-r--r--editors/vi.c2
-rw-r--r--include/usage.h4
-rw-r--r--libbb/print_flags.c2
-rw-r--r--miscutils/last.c2
-rw-r--r--miscutils/last_fancy.c6
-rw-r--r--miscutils/man.c16
-rwxr-xr-xscripts/mkmakefile36
15 files changed, 130 insertions, 151 deletions
diff --git a/Config.in b/Config.in
index 416ffaad4..a7c3149cb 100644
--- a/Config.in
+++ b/Config.in
@@ -298,7 +298,7 @@ config NOMMU
298config BUILD_LIBBUSYBOX 298config BUILD_LIBBUSYBOX
299 bool "Build shared libbusybox" 299 bool "Build shared libbusybox"
300 default n 300 default n
301 depends on !FEATURE_PREFER_APPLETS && !PIE 301 depends on !FEATURE_PREFER_APPLETS && !PIE && !STATIC
302 help 302 help
303 Build a shared library libbusybox.so.N.N.N which contains all 303 Build a shared library libbusybox.so.N.N.N which contains all
304 busybox code. 304 busybox code.
diff --git a/Makefile b/Makefile
index 3a9630a4f..6d0cc3898 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
1VERSION = 1 1VERSION = 1
2PATCHLEVEL = 11 2PATCHLEVEL = 11
3SUBLEVEL = 0 3SUBLEVEL = 1
4EXTRAVERSION = 4EXTRAVERSION =
5NAME = Unnamed 5NAME = Unnamed
6 6
diff --git a/applets/individual.c b/applets/individual.c
index 414a11b05..341f4d1c2 100644
--- a/applets/individual.c
+++ b/applets/individual.c
@@ -14,13 +14,11 @@ const char *applet_name;
14int main(int argc, char **argv) 14int main(int argc, char **argv)
15{ 15{
16 applet_name = argv[0]; 16 applet_name = argv[0];
17
18 return APPLET_main(argc,argv); 17 return APPLET_main(argc,argv);
19} 18}
20 19
21void bb_show_usage(void) 20void bb_show_usage(void)
22{ 21{
23 printf(APPLET_full_usage "\n"); 22 fputs(APPLET_full_usage "\n", stdout);
24
25 exit(EXIT_FAILURE); 23 exit(EXIT_FAILURE);
26} 24}
diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c
index 8f35bc5f9..e034814c0 100644
--- a/archival/libunarchive/decompress_bunzip2.c
+++ b/archival/libunarchive/decompress_bunzip2.c
@@ -66,7 +66,6 @@ struct group_data {
66 * | grep 'bd->' | sed 's/^.*bd->/bd->/' | sort | $PAGER 66 * | grep 'bd->' | sed 's/^.*bd->/bd->/' | sort | $PAGER
67 * and moved it (inbufBitCount) to offset 0. 67 * and moved it (inbufBitCount) to offset 0.
68 */ 68 */
69
70struct bunzip_data { 69struct bunzip_data {
71 /* I/O tracking data (file handles, buffers, positions, etc.) */ 70 /* I/O tracking data (file handles, buffers, positions, etc.) */
72 unsigned inbufBitCount, inbufBits; 71 unsigned inbufBitCount, inbufBits;
@@ -102,11 +101,9 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
102 101
103 /* If we need to get more data from the byte buffer, do so. (Loop getting 102 /* If we need to get more data from the byte buffer, do so. (Loop getting
104 one byte at a time to enforce endianness and avoid unaligned access.) */ 103 one byte at a time to enforce endianness and avoid unaligned access.) */
105
106 while ((int)(bd->inbufBitCount) < bits_wanted) { 104 while ((int)(bd->inbufBitCount) < bits_wanted) {
107 105
108 /* If we need to read more data from file into byte buffer, do so */ 106 /* If we need to read more data from file into byte buffer, do so */
109
110 if (bd->inbufPos == bd->inbufCount) { 107 if (bd->inbufPos == bd->inbufCount) {
111 /* if "no input fd" case: in_fd == -1, read fails, we jump */ 108 /* if "no input fd" case: in_fd == -1, read fails, we jump */
112 bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE); 109 bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE);
@@ -116,7 +113,6 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
116 } 113 }
117 114
118 /* Avoid 32-bit overflow (dump bit buffer to top of output) */ 115 /* Avoid 32-bit overflow (dump bit buffer to top of output) */
119
120 if (bd->inbufBitCount >= 24) { 116 if (bd->inbufBitCount >= 24) {
121 bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1); 117 bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1);
122 bits_wanted -= bd->inbufBitCount; 118 bits_wanted -= bd->inbufBitCount;
@@ -125,13 +121,11 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
125 } 121 }
126 122
127 /* Grab next 8 bits of input from buffer. */ 123 /* Grab next 8 bits of input from buffer. */
128
129 bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++]; 124 bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++];
130 bd->inbufBitCount += 8; 125 bd->inbufBitCount += 8;
131 } 126 }
132 127
133 /* Calculate result */ 128 /* Calculate result */
134
135 bd->inbufBitCount -= bits_wanted; 129 bd->inbufBitCount -= bits_wanted;
136 bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1); 130 bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1);
137 131
@@ -139,7 +133,6 @@ static unsigned get_bits(bunzip_data *bd, int bits_wanted)
139} 133}
140 134
141/* Unpacks the next block and sets up for the inverse burrows-wheeler step. */ 135/* Unpacks the next block and sets up for the inverse burrows-wheeler step. */
142
143static int get_next_block(bunzip_data *bd) 136static int get_next_block(bunzip_data *bd)
144{ 137{
145 struct group_data *hufGroup; 138 struct group_data *hufGroup;
@@ -153,13 +146,11 @@ static int get_next_block(bunzip_data *bd)
153 selectors = bd->selectors; 146 selectors = bd->selectors;
154 147
155 /* Reset longjmp I/O error handling */ 148 /* Reset longjmp I/O error handling */
156
157 i = setjmp(bd->jmpbuf); 149 i = setjmp(bd->jmpbuf);
158 if (i) return i; 150 if (i) return i;
159 151
160 /* Read in header signature and CRC, then validate signature. 152 /* Read in header signature and CRC, then validate signature.
161 (last block signature means CRC is for whole file, return now) */ 153 (last block signature means CRC is for whole file, return now) */
162
163 i = get_bits(bd, 24); 154 i = get_bits(bd, 24);
164 j = get_bits(bd, 24); 155 j = get_bits(bd, 24);
165 bd->headerCRC = get_bits(bd, 32); 156 bd->headerCRC = get_bits(bd, 32);
@@ -169,7 +160,6 @@ static int get_next_block(bunzip_data *bd)
169 /* We can add support for blockRandomised if anybody complains. There was 160 /* We can add support for blockRandomised if anybody complains. There was
170 some code for this in busybox 1.0.0-pre3, but nobody ever noticed that 161 some code for this in busybox 1.0.0-pre3, but nobody ever noticed that
171 it didn't actually work. */ 162 it didn't actually work. */
172
173 if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT; 163 if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT;
174 origPtr = get_bits(bd, 24); 164 origPtr = get_bits(bd, 24);
175 if ((int)origPtr > dbufSize) return RETVAL_DATA_ERROR; 165 if ((int)origPtr > dbufSize) return RETVAL_DATA_ERROR;
@@ -179,7 +169,6 @@ static int get_next_block(bunzip_data *bd)
179 symbols to deal with, and writes a sparse bitfield indicating which 169 symbols to deal with, and writes a sparse bitfield indicating which
180 values were present. We make a translation table to convert the symbols 170 values were present. We make a translation table to convert the symbols
181 back to the corresponding bytes. */ 171 back to the corresponding bytes. */
182
183 t = get_bits(bd, 16); 172 t = get_bits(bd, 16);
184 symTotal = 0; 173 symTotal = 0;
185 for (i = 0; i < 16; i++) { 174 for (i = 0; i < 16; i++) {
@@ -192,7 +181,6 @@ static int get_next_block(bunzip_data *bd)
192 } 181 }
193 182
194 /* How many different Huffman coding groups does this block use? */ 183 /* How many different Huffman coding groups does this block use? */
195
196 groupCount = get_bits(bd, 3); 184 groupCount = get_bits(bd, 3);
197 if (groupCount < 2 || groupCount > MAX_GROUPS) 185 if (groupCount < 2 || groupCount > MAX_GROUPS)
198 return RETVAL_DATA_ERROR; 186 return RETVAL_DATA_ERROR;
@@ -201,19 +189,16 @@ static int get_next_block(bunzip_data *bd)
201 group. Read in the group selector list, which is stored as MTF encoded 189 group. Read in the group selector list, which is stored as MTF encoded
202 bit runs. (MTF=Move To Front, as each value is used it's moved to the 190 bit runs. (MTF=Move To Front, as each value is used it's moved to the
203 start of the list.) */ 191 start of the list.) */
204
205 nSelectors = get_bits(bd, 15); 192 nSelectors = get_bits(bd, 15);
206 if (!nSelectors) return RETVAL_DATA_ERROR; 193 if (!nSelectors) return RETVAL_DATA_ERROR;
207 for (i = 0; i < groupCount; i++) mtfSymbol[i] = i; 194 for (i = 0; i < groupCount; i++) mtfSymbol[i] = i;
208 for (i = 0; i < nSelectors; i++) { 195 for (i = 0; i < nSelectors; i++) {
209 196
210 /* Get next value */ 197 /* Get next value */
211
212 for (j = 0; get_bits(bd, 1); j++) 198 for (j = 0; get_bits(bd, 1); j++)
213 if (j >= groupCount) return RETVAL_DATA_ERROR; 199 if (j >= groupCount) return RETVAL_DATA_ERROR;
214 200
215 /* Decode MTF to get the next selector */ 201 /* Decode MTF to get the next selector */
216
217 uc = mtfSymbol[j]; 202 uc = mtfSymbol[j];
218 for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1]; 203 for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1];
219 mtfSymbol[0] = selectors[i] = uc; 204 mtfSymbol[0] = selectors[i] = uc;
@@ -221,10 +206,11 @@ static int get_next_block(bunzip_data *bd)
221 206
222 /* Read the Huffman coding tables for each group, which code for symTotal 207 /* Read the Huffman coding tables for each group, which code for symTotal
223 literal symbols, plus two run symbols (RUNA, RUNB) */ 208 literal symbols, plus two run symbols (RUNA, RUNB) */
224
225 symCount = symTotal + 2; 209 symCount = symTotal + 2;
226 for (j = 0; j < groupCount; j++) { 210 for (j = 0; j < groupCount; j++) {
227 unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1]; 211 unsigned char length[MAX_SYMBOLS];
212 /* 8 bits is ALMOST enough for temp[], see below */
213 unsigned temp[MAX_HUFCODE_BITS+1];
228 int minLen, maxLen, pp; 214 int minLen, maxLen, pp;
229 215
230 /* Read Huffman code lengths for each symbol. They're stored in 216 /* Read Huffman code lengths for each symbol. They're stored in
@@ -233,7 +219,6 @@ static int get_next_block(bunzip_data *bd)
233 (Subtracting 1 before the loop and then adding it back at the end is 219 (Subtracting 1 before the loop and then adding it back at the end is
234 an optimization that makes the test inside the loop simpler: symbol 220 an optimization that makes the test inside the loop simpler: symbol
235 length 0 becomes negative, so an unsigned inequality catches it.) */ 221 length 0 becomes negative, so an unsigned inequality catches it.) */
236
237 t = get_bits(bd, 5) - 1; 222 t = get_bits(bd, 5) - 1;
238 for (i = 0; i < symCount; i++) { 223 for (i = 0; i < symCount; i++) {
239 for (;;) { 224 for (;;) {
@@ -243,7 +228,6 @@ static int get_next_block(bunzip_data *bd)
243 /* If first bit is 0, stop. Else second bit indicates whether 228 /* If first bit is 0, stop. Else second bit indicates whether
244 to increment or decrement the value. Optimization: grab 2 229 to increment or decrement the value. Optimization: grab 2
245 bits and unget the second if the first was 0. */ 230 bits and unget the second if the first was 0. */
246
247 k = get_bits(bd, 2); 231 k = get_bits(bd, 2);
248 if (k < 2) { 232 if (k < 2) {
249 bd->inbufBitCount++; 233 bd->inbufBitCount++;
@@ -251,17 +235,14 @@ static int get_next_block(bunzip_data *bd)
251 } 235 }
252 236
253 /* Add one if second bit 1, else subtract 1. Avoids if/else */ 237 /* Add one if second bit 1, else subtract 1. Avoids if/else */
254
255 t += (((k+1) & 2) - 1); 238 t += (((k+1) & 2) - 1);
256 } 239 }
257 240
258 /* Correct for the initial -1, to get the final symbol length */ 241 /* Correct for the initial -1, to get the final symbol length */
259
260 length[i] = t + 1; 242 length[i] = t + 1;
261 } 243 }
262 244
263 /* Find largest and smallest lengths in this group */ 245 /* Find largest and smallest lengths in this group */
264
265 minLen = maxLen = length[0]; 246 minLen = maxLen = length[0];
266 for (i = 1; i < symCount; i++) { 247 for (i = 1; i < symCount; i++) {
267 if (length[i] > maxLen) maxLen = length[i]; 248 if (length[i] > maxLen) maxLen = length[i];
@@ -278,7 +259,6 @@ static int get_next_block(bunzip_data *bd)
278 * number of bits can have. This is how the Huffman codes can vary in 259 * number of bits can have. This is how the Huffman codes can vary in
279 * length: each code with a value>limit[length] needs another bit. 260 * length: each code with a value>limit[length] needs another bit.
280 */ 261 */
281
282 hufGroup = bd->groups + j; 262 hufGroup = bd->groups + j;
283 hufGroup->minLen = minLen; 263 hufGroup->minLen = minLen;
284 hufGroup->maxLen = maxLen; 264 hufGroup->maxLen = maxLen;
@@ -286,12 +266,10 @@ static int get_next_block(bunzip_data *bd)
286 /* Note that minLen can't be smaller than 1, so we adjust the base 266 /* Note that minLen can't be smaller than 1, so we adjust the base
287 and limit array pointers so we're not always wasting the first 267 and limit array pointers so we're not always wasting the first
288 entry. We do this again when using them (during symbol decoding).*/ 268 entry. We do this again when using them (during symbol decoding).*/
289
290 base = hufGroup->base - 1; 269 base = hufGroup->base - 1;
291 limit = hufGroup->limit - 1; 270 limit = hufGroup->limit - 1;
292 271
293 /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */ 272 /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */
294
295 pp = 0; 273 pp = 0;
296 for (i = minLen; i <= maxLen; i++) { 274 for (i = minLen; i <= maxLen; i++) {
297 temp[i] = limit[i] = 0; 275 temp[i] = limit[i] = 0;
@@ -301,14 +279,14 @@ static int get_next_block(bunzip_data *bd)
301 } 279 }
302 280
303 /* Count symbols coded for at each bit length */ 281 /* Count symbols coded for at each bit length */
304 282 /* NB: in pathological cases, temp[8] can end ip being 256.
283 * That's why uint8_t is too small for temp[]. */
305 for (i = 0; i < symCount; i++) temp[length[i]]++; 284 for (i = 0; i < symCount; i++) temp[length[i]]++;
306 285
307 /* Calculate limit[] (the largest symbol-coding value at each bit 286 /* Calculate limit[] (the largest symbol-coding value at each bit
308 * length, which is (previous limit<<1)+symbols at this level), and 287 * length, which is (previous limit<<1)+symbols at this level), and
309 * base[] (number of symbols to ignore at each bit length, which is 288 * base[] (number of symbols to ignore at each bit length, which is
310 * limit minus the cumulative count of symbols coded for already). */ 289 * limit minus the cumulative count of symbols coded for already). */
311
312 pp = t = 0; 290 pp = t = 0;
313 for (i = minLen; i < maxLen; i++) { 291 for (i = minLen; i < maxLen; i++) {
314 pp += temp[i]; 292 pp += temp[i];
@@ -319,7 +297,6 @@ static int get_next_block(bunzip_data *bd)
319 each level we're really only interested in the first few bits, 297 each level we're really only interested in the first few bits,
320 so here we set all the trailing to-be-ignored bits to 1 so they 298 so here we set all the trailing to-be-ignored bits to 1 so they
321 don't affect the value>limit[length] comparison. */ 299 don't affect the value>limit[length] comparison. */
322
323 limit[i] = (pp << (maxLen - i)) - 1; 300 limit[i] = (pp << (maxLen - i)) - 1;
324 pp <<= 1; 301 pp <<= 1;
325 t += temp[i]; 302 t += temp[i];
@@ -335,7 +312,6 @@ static int get_next_block(bunzip_data *bd)
335 and run length encoding, saving the result into dbuf[dbufCount++] = uc */ 312 and run length encoding, saving the result into dbuf[dbufCount++] = uc */
336 313
337 /* Initialize symbol occurrence counters and symbol Move To Front table */ 314 /* Initialize symbol occurrence counters and symbol Move To Front table */
338
339 memset(byteCount, 0, sizeof(byteCount)); /* smaller, maybe slower? */ 315 memset(byteCount, 0, sizeof(byteCount)); /* smaller, maybe slower? */
340 for (i = 0; i < 256; i++) { 316 for (i = 0; i < 256; i++) {
341 //byteCount[i] = 0; 317 //byteCount[i] = 0;
@@ -347,8 +323,7 @@ static int get_next_block(bunzip_data *bd)
347 runPos = dbufCount = selector = 0; 323 runPos = dbufCount = selector = 0;
348 for (;;) { 324 for (;;) {
349 325
350 /* fetch next Huffman coding group from list. */ 326 /* Fetch next Huffman coding group from list. */
351
352 symCount = GROUP_SIZE - 1; 327 symCount = GROUP_SIZE - 1;
353 if (selector >= nSelectors) return RETVAL_DATA_ERROR; 328 if (selector >= nSelectors) return RETVAL_DATA_ERROR;
354 hufGroup = bd->groups + selectors[selector++]; 329 hufGroup = bd->groups + selectors[selector++];
@@ -367,7 +342,6 @@ static int get_next_block(bunzip_data *bd)
367 dry). The following (up to got_huff_bits:) is equivalent to 342 dry). The following (up to got_huff_bits:) is equivalent to
368 j = get_bits(bd, hufGroup->maxLen); 343 j = get_bits(bd, hufGroup->maxLen);
369 */ 344 */
370
371 while ((int)(bd->inbufBitCount) < hufGroup->maxLen) { 345 while ((int)(bd->inbufBitCount) < hufGroup->maxLen) {
372 if (bd->inbufPos == bd->inbufCount) { 346 if (bd->inbufPos == bd->inbufCount) {
373 j = get_bits(bd, hufGroup->maxLen); 347 j = get_bits(bd, hufGroup->maxLen);
@@ -382,13 +356,11 @@ static int get_next_block(bunzip_data *bd)
382 got_huff_bits: 356 got_huff_bits:
383 357
384 /* Figure how how many bits are in next symbol and unget extras */ 358 /* Figure how how many bits are in next symbol and unget extras */
385
386 i = hufGroup->minLen; 359 i = hufGroup->minLen;
387 while (j > limit[i]) ++i; 360 while (j > limit[i]) ++i;
388 bd->inbufBitCount += (hufGroup->maxLen - i); 361 bd->inbufBitCount += (hufGroup->maxLen - i);
389 362
390 /* Huffman decode value to get nextSym (with bounds checking) */ 363 /* Huffman decode value to get nextSym (with bounds checking) */
391
392 if (i > hufGroup->maxLen) 364 if (i > hufGroup->maxLen)
393 return RETVAL_DATA_ERROR; 365 return RETVAL_DATA_ERROR;
394 j = (j >> (hufGroup->maxLen - i)) - base[i]; 366 j = (j >> (hufGroup->maxLen - i)) - base[i];
@@ -400,11 +372,9 @@ static int get_next_block(bunzip_data *bd)
400 byte, or a repeated run of the most recent literal byte. First, 372 byte, or a repeated run of the most recent literal byte. First,
401 check if nextSym indicates a repeated run, and if so loop collecting 373 check if nextSym indicates a repeated run, and if so loop collecting
402 how many times to repeat the last literal. */ 374 how many times to repeat the last literal. */
403
404 if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */ 375 if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */
405 376
406 /* If this is the start of a new run, zero out counter */ 377 /* If this is the start of a new run, zero out counter */
407
408 if (!runPos) { 378 if (!runPos) {
409 runPos = 1; 379 runPos = 1;
410 t = 0; 380 t = 0;
@@ -417,7 +387,6 @@ static int get_next_block(bunzip_data *bd)
417 the basic or 0/1 method (except all bits 0, which would use no 387 the basic or 0/1 method (except all bits 0, which would use no
418 symbols, but a run of length 0 doesn't mean anything in this 388 symbols, but a run of length 0 doesn't mean anything in this
419 context). Thus space is saved. */ 389 context). Thus space is saved. */
420
421 t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */ 390 t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */
422 if (runPos < dbufSize) runPos <<= 1; 391 if (runPos < dbufSize) runPos <<= 1;
423 goto end_of_huffman_loop; 392 goto end_of_huffman_loop;
@@ -427,7 +396,6 @@ static int get_next_block(bunzip_data *bd)
427 how many times to repeat the last literal, so append that many 396 how many times to repeat the last literal, so append that many
428 copies to our buffer of decoded symbols (dbuf) now. (The last 397 copies to our buffer of decoded symbols (dbuf) now. (The last
429 literal used is the one at the head of the mtfSymbol array.) */ 398 literal used is the one at the head of the mtfSymbol array.) */
430
431 if (runPos) { 399 if (runPos) {
432 runPos = 0; 400 runPos = 0;
433 if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR; 401 if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR;
@@ -438,7 +406,6 @@ static int get_next_block(bunzip_data *bd)
438 } 406 }
439 407
440 /* Is this the terminating symbol? */ 408 /* Is this the terminating symbol? */
441
442 if (nextSym > symTotal) break; 409 if (nextSym > symTotal) break;
443 410
444 /* At this point, nextSym indicates a new literal character. Subtract 411 /* At this point, nextSym indicates a new literal character. Subtract
@@ -448,7 +415,6 @@ static int get_next_block(bunzip_data *bd)
448 first symbol in the mtf array, position 0, would have been handled 415 first symbol in the mtf array, position 0, would have been handled
449 as part of a run above. Therefore 1 unused mtf position minus 416 as part of a run above. Therefore 1 unused mtf position minus
450 2 non-literal nextSym values equals -1.) */ 417 2 non-literal nextSym values equals -1.) */
451
452 if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR; 418 if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR;
453 i = nextSym - 1; 419 i = nextSym - 1;
454 uc = mtfSymbol[i]; 420 uc = mtfSymbol[i];
@@ -457,7 +423,6 @@ static int get_next_block(bunzip_data *bd)
457 * small number of symbols, and are bound by 256 in any case, using 423 * small number of symbols, and are bound by 256 in any case, using
458 * memmove here would typically be bigger and slower due to function 424 * memmove here would typically be bigger and slower due to function
459 * call overhead and other assorted setup costs. */ 425 * call overhead and other assorted setup costs. */
460
461 do { 426 do {
462 mtfSymbol[i] = mtfSymbol[i-1]; 427 mtfSymbol[i] = mtfSymbol[i-1];
463 } while (--i); 428 } while (--i);
@@ -465,13 +430,11 @@ static int get_next_block(bunzip_data *bd)
465 uc = symToByte[uc]; 430 uc = symToByte[uc];
466 431
467 /* We have our literal byte. Save it into dbuf. */ 432 /* We have our literal byte. Save it into dbuf. */
468
469 byteCount[uc]++; 433 byteCount[uc]++;
470 dbuf[dbufCount++] = (unsigned)uc; 434 dbuf[dbufCount++] = (unsigned)uc;
471 435
472 /* Skip group initialization if we're not done with this group. Done 436 /* Skip group initialization if we're not done with this group. Done
473 * this way to avoid compiler warning. */ 437 * this way to avoid compiler warning. */
474
475 end_of_huffman_loop: 438 end_of_huffman_loop:
476 if (symCount--) goto continue_this_group; 439 if (symCount--) goto continue_this_group;
477 } 440 }
@@ -484,7 +447,6 @@ static int get_next_block(bunzip_data *bd)
484 */ 447 */
485 448
486 /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */ 449 /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */
487
488 j = 0; 450 j = 0;
489 for (i = 0; i < 256; i++) { 451 for (i = 0; i < 256; i++) {
490 k = j + byteCount[i]; 452 k = j + byteCount[i];
@@ -493,7 +455,6 @@ static int get_next_block(bunzip_data *bd)
493 } 455 }
494 456
495 /* Figure out what order dbuf would be in if we sorted it. */ 457 /* Figure out what order dbuf would be in if we sorted it. */
496
497 for (i = 0; i < dbufCount; i++) { 458 for (i = 0; i < dbufCount; i++) {
498 uc = (unsigned char)(dbuf[i] & 0xff); 459 uc = (unsigned char)(dbuf[i] & 0xff);
499 dbuf[byteCount[uc]] |= (i << 8); 460 dbuf[byteCount[uc]] |= (i << 8);
@@ -503,11 +464,10 @@ static int get_next_block(bunzip_data *bd)
503 /* Decode first byte by hand to initialize "previous" byte. Note that it 464 /* Decode first byte by hand to initialize "previous" byte. Note that it
504 doesn't get output, and if the first three characters are identical 465 doesn't get output, and if the first three characters are identical
505 it doesn't qualify as a run (hence writeRunCountdown=5). */ 466 it doesn't qualify as a run (hence writeRunCountdown=5). */
506
507 if (dbufCount) { 467 if (dbufCount) {
508 if ((int)origPtr >= dbufCount) return RETVAL_DATA_ERROR; 468 if ((int)origPtr >= dbufCount) return RETVAL_DATA_ERROR;
509 bd->writePos = dbuf[origPtr]; 469 bd->writePos = dbuf[origPtr];
510 bd->writeCurrent = (unsigned char)(bd->writePos & 0xff); 470 bd->writeCurrent = (unsigned char)(bd->writePos & 0xff);
511 bd->writePos >>= 8; 471 bd->writePos >>= 8;
512 bd->writeRunCountdown = 5; 472 bd->writeRunCountdown = 5;
513 } 473 }
@@ -522,7 +482,6 @@ static int get_next_block(bunzip_data *bd)
522 error (all errors are negative numbers). If out_fd!=-1, outbuf and len 482 error (all errors are negative numbers). If out_fd!=-1, outbuf and len
523 are ignored, data is written to out_fd and return is RETVAL_OK or error. 483 are ignored, data is written to out_fd and return is RETVAL_OK or error.
524*/ 484*/
525
526int read_bunzip(bunzip_data *bd, char *outbuf, int len) 485int read_bunzip(bunzip_data *bd, char *outbuf, int len)
527{ 486{
528 const unsigned *dbuf; 487 const unsigned *dbuf;
@@ -539,19 +498,15 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
539 /* We will always have pending decoded data to write into the output 498 /* We will always have pending decoded data to write into the output
540 buffer unless this is the very first call (in which case we haven't 499 buffer unless this is the very first call (in which case we haven't
541 Huffman-decoded a block into the intermediate buffer yet). */ 500 Huffman-decoded a block into the intermediate buffer yet). */
542
543 if (bd->writeCopies) { 501 if (bd->writeCopies) {
544 502
545 /* Inside the loop, writeCopies means extra copies (beyond 1) */ 503 /* Inside the loop, writeCopies means extra copies (beyond 1) */
546
547 --bd->writeCopies; 504 --bd->writeCopies;
548 505
549 /* Loop outputting bytes */ 506 /* Loop outputting bytes */
550
551 for (;;) { 507 for (;;) {
552 508
553 /* If the output buffer is full, snapshot state and return */ 509 /* If the output buffer is full, snapshot state and return */
554
555 if (gotcount >= len) { 510 if (gotcount >= len) {
556 bd->writePos = pos; 511 bd->writePos = pos;
557 bd->writeCurrent = current; 512 bd->writeCurrent = current;
@@ -560,13 +515,11 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
560 } 515 }
561 516
562 /* Write next byte into output buffer, updating CRC */ 517 /* Write next byte into output buffer, updating CRC */
563
564 outbuf[gotcount++] = current; 518 outbuf[gotcount++] = current;
565 bd->writeCRC = (bd->writeCRC << 8) 519 bd->writeCRC = (bd->writeCRC << 8)
566 ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current]; 520 ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current];
567 521
568 /* Loop now if we're outputting multiple copies of this byte */ 522 /* Loop now if we're outputting multiple copies of this byte */
569
570 if (bd->writeCopies) { 523 if (bd->writeCopies) {
571 --bd->writeCopies; 524 --bd->writeCopies;
572 continue; 525 continue;
@@ -582,35 +535,29 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
582 /* After 3 consecutive copies of the same byte, the 4th 535 /* After 3 consecutive copies of the same byte, the 4th
583 * is a repeat count. We count down from 4 instead 536 * is a repeat count. We count down from 4 instead
584 * of counting up because testing for non-zero is faster */ 537 * of counting up because testing for non-zero is faster */
585
586 if (--bd->writeRunCountdown) { 538 if (--bd->writeRunCountdown) {
587 if (current != previous) 539 if (current != previous)
588 bd->writeRunCountdown = 4; 540 bd->writeRunCountdown = 4;
589 } else { 541 } else {
590 542
591 /* We have a repeated run, this byte indicates the count */ 543 /* We have a repeated run, this byte indicates the count */
592
593 bd->writeCopies = current; 544 bd->writeCopies = current;
594 current = previous; 545 current = previous;
595 bd->writeRunCountdown = 5; 546 bd->writeRunCountdown = 5;
596 547
597 /* Sometimes there are just 3 bytes (run length 0) */ 548 /* Sometimes there are just 3 bytes (run length 0) */
598
599 if (!bd->writeCopies) goto decode_next_byte; 549 if (!bd->writeCopies) goto decode_next_byte;
600 550
601 /* Subtract the 1 copy we'd output anyway to get extras */ 551 /* Subtract the 1 copy we'd output anyway to get extras */
602
603 --bd->writeCopies; 552 --bd->writeCopies;
604 } 553 }
605 } 554 }
606 555
607 /* Decompression of this block completed successfully */ 556 /* Decompression of this block completed successfully */
608
609 bd->writeCRC = ~bd->writeCRC; 557 bd->writeCRC = ~bd->writeCRC;
610 bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC; 558 bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC;
611 559
612 /* If this block had a CRC error, force file level CRC error. */ 560 /* If this block had a CRC error, force file level CRC error. */
613
614 if (bd->writeCRC != bd->headerCRC) { 561 if (bd->writeCRC != bd->headerCRC) {
615 bd->totalCRC = bd->headerCRC + 1; 562 bd->totalCRC = bd->headerCRC + 1;
616 return RETVAL_LAST_BLOCK; 563 return RETVAL_LAST_BLOCK;
@@ -619,7 +566,6 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
619 566
620 /* Refill the intermediate buffer by Huffman-decoding next block of input */ 567 /* Refill the intermediate buffer by Huffman-decoding next block of input */
621 /* (previous is just a convenient unused temp variable here) */ 568 /* (previous is just a convenient unused temp variable here) */
622
623 previous = get_next_block(bd); 569 previous = get_next_block(bd);
624 if (previous) { 570 if (previous) {
625 bd->writeCount = previous; 571 bd->writeCount = previous;
@@ -631,7 +577,6 @@ int read_bunzip(bunzip_data *bd, char *outbuf, int len)
631 goto decode_next_byte; 577 goto decode_next_byte;
632} 578}
633 579
634
635/* Allocate the structure, read file header. If in_fd==-1, inbuf must contain 580/* Allocate the structure, read file header. If in_fd==-1, inbuf must contain
636 a complete bunzip file (len bytes long). If in_fd!=-1, inbuf and len are 581 a complete bunzip file (len bytes long). If in_fd!=-1, inbuf and len are
637 ignored, and data is read from file handle into temporary buffer. */ 582 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)
639/* Because bunzip2 is used for help text unpacking, and because bb_show_usage() 584/* Because bunzip2 is used for help text unpacking, and because bb_show_usage()
640 should work for NOFORK applets too, we must be extremely careful to not leak 585 should work for NOFORK applets too, we must be extremely careful to not leak
641 any allocations! */ 586 any allocations! */
642
643int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, 587int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
644 int len) 588 int len)
645{ 589{
@@ -650,16 +594,13 @@ int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf,
650 }; 594 };
651 595
652 /* Figure out how much data to allocate */ 596 /* Figure out how much data to allocate */
653
654 i = sizeof(bunzip_data); 597 i = sizeof(bunzip_data);
655 if (in_fd != -1) i += IOBUF_SIZE; 598 if (in_fd != -1) i += IOBUF_SIZE;
656 599
657 /* Allocate bunzip_data. Most fields initialize to zero. */ 600 /* Allocate bunzip_data. Most fields initialize to zero. */
658
659 bd = *bdp = xzalloc(i); 601 bd = *bdp = xzalloc(i);
660 602
661 /* Setup input buffer */ 603 /* Setup input buffer */
662
663 bd->in_fd = in_fd; 604 bd->in_fd = in_fd;
664 if (-1 == in_fd) { 605 if (-1 == in_fd) {
665 /* in this case, bd->inbuf is read-only */ 606 /* 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,
669 bd->inbuf = (unsigned char *)(bd + 1); 610 bd->inbuf = (unsigned char *)(bd + 1);
670 611
671 /* Init the CRC32 table (big endian) */ 612 /* Init the CRC32 table (big endian) */
672
673 crc32_filltable(bd->crc32Table, 1); 613 crc32_filltable(bd->crc32Table, 1);
674 614
675 /* Setup for I/O error handling via longjmp */ 615 /* Setup for I/O error handling via longjmp */
676
677 i = setjmp(bd->jmpbuf); 616 i = setjmp(bd->jmpbuf);
678 if (i) return i; 617 if (i) return i;
679 618
680 /* Ensure that file starts with "BZh['1'-'9']." */ 619 /* Ensure that file starts with "BZh['1'-'9']." */
681
682 i = get_bits(bd, 32); 620 i = get_bits(bd, 32);
683 if ((unsigned)(i - BZh0 - 1) >= 9) return RETVAL_NOT_BZIP_DATA; 621 if ((unsigned)(i - BZh0 - 1) >= 9) return RETVAL_NOT_BZIP_DATA;
684 622
685 /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of 623 /* Fourth byte (ascii '1'-'9') indicates block size in units of 100k of
686 uncompressed data. Allocate intermediate buffer for block. */ 624 uncompressed data. Allocate intermediate buffer for block. */
687
688 bd->dbufSize = 100000 * (i - BZh0); 625 bd->dbufSize = 100000 * (i - BZh0);
689 626
690 /* Cannot use xmalloc - may leak bd in NOFORK case! */ 627 /* Cannot use xmalloc - may leak bd in NOFORK case! */
@@ -704,7 +641,6 @@ void dealloc_bunzip(bunzip_data *bd)
704 641
705 642
706/* Decompress src_fd to dst_fd. Stops at end of bzip data, not end of file. */ 643/* Decompress src_fd to dst_fd. Stops at end of bzip data, not end of file. */
707
708USE_DESKTOP(long long) int 644USE_DESKTOP(long long) int
709unpack_bz2_stream(int src_fd, int dst_fd) 645unpack_bz2_stream(int src_fd, int dst_fd)
710{ 646{
@@ -761,9 +697,9 @@ int main(int argc, char **argv)
761 char c; 697 char c;
762 698
763 if (i < 0) 699 if (i < 0)
764 fprintf(stderr,"%s\n", bunzip_errors[-i]); 700 fprintf(stderr, "%s\n", bunzip_errors[-i]);
765 else if (read(STDIN_FILENO, &c, 1)) 701 else if (read(STDIN_FILENO, &c, 1))
766 fprintf(stderr,"Trailing garbage ignored\n"); 702 fprintf(stderr, "Trailing garbage ignored\n");
767 return -i; 703 return -i;
768} 704}
769#endif 705#endif
diff --git a/coreutils/uname.c b/coreutils/uname.c
index 2eecb5d6d..76fd3ca8d 100644
--- a/coreutils/uname.c
+++ b/coreutils/uname.c
@@ -17,7 +17,7 @@
17 -m, --machine sun 17 -m, --machine sun
18 -a, --all SunOS rocky8 4.0 sun 18 -a, --all SunOS rocky8 4.0 sun
19 19
20 The default behavior is equivalent to `-s'. 20 The default behavior is equivalent to '-s'.
21 21
22 David MacKenzie <djm@gnu.ai.mit.edu> */ 22 David MacKenzie <djm@gnu.ai.mit.edu> */
23 23
@@ -39,47 +39,43 @@ typedef struct {
39} uname_info_t; 39} uname_info_t;
40 40
41static const char options[] ALIGN1 = "snrvmpa"; 41static const char options[] ALIGN1 = "snrvmpa";
42static const unsigned short utsname_offset[] ALIGN2 = { 42static const unsigned short utsname_offset[] = {
43 offsetof(uname_info_t,name.sysname), 43 offsetof(uname_info_t, name.sysname),
44 offsetof(uname_info_t,name.nodename), 44 offsetof(uname_info_t, name.nodename),
45 offsetof(uname_info_t,name.release), 45 offsetof(uname_info_t, name.release),
46 offsetof(uname_info_t,name.version), 46 offsetof(uname_info_t, name.version),
47 offsetof(uname_info_t,name.machine), 47 offsetof(uname_info_t, name.machine),
48 offsetof(uname_info_t,processor) 48 offsetof(uname_info_t, processor)
49}; 49};
50 50
51int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 51int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
52int uname_main(int argc, char **argv) 52int uname_main(int argc ATTRIBUTE_UNUSED, char **argv)
53{ 53{
54 uname_info_t uname_info; 54 uname_info_t uname_info;
55#if defined(__sparc__) && defined(__linux__) 55#if defined(__sparc__) && defined(__linux__)
56 char *fake_sparc = getenv("FAKE_SPARC"); 56 char *fake_sparc = getenv("FAKE_SPARC");
57#endif 57#endif
58 const unsigned short int *delta; 58 const unsigned short *delta;
59 char toprint; 59 char toprint;
60 60
61 toprint = getopt32(argv, options); 61 toprint = getopt32(argv, options);
62 62
63 if (argc != optind) { 63 if (argv[optind]) { /* coreutils-6.9 compat */
64 bb_show_usage(); 64 bb_show_usage();
65 } 65 }
66 66
67 if (toprint & (1 << 6)) { 67 if (toprint & (1 << 6)) { /* -a => all opts on */
68 toprint = 0x3f; 68 toprint = 0x3f;
69 } 69 }
70 70
71 if (toprint == 0) { 71 if (toprint == 0) { /* no opts => -s (sysname) */
72 toprint = 1; /* sysname */ 72 toprint = 1;
73 } 73 }
74 74
75 if (uname(&uname_info.name) == -1) { 75 uname(&uname_info.name); /* never fails */
76 bb_error_msg_and_die("cannot get system name");
77 }
78 76
79#if defined(__sparc__) && defined(__linux__) 77#if defined(__sparc__) && defined(__linux__)
80 if ((fake_sparc != NULL) 78 if (fake_sparc && (fake_sparc[0] | 0x20) == 'y') {
81 && ((fake_sparc[0] == 'y')
82 || (fake_sparc[0] == 'Y'))) {
83 strcpy(uname_info.name.machine, "sparc"); 79 strcpy(uname_info.name.machine, "sparc");
84 } 80 }
85#endif 81#endif
@@ -89,7 +85,8 @@ int uname_main(int argc, char **argv)
89 delta = utsname_offset; 85 delta = utsname_offset;
90 do { 86 do {
91 if (toprint & 1) { 87 if (toprint & 1) {
92 printf(((char *)(&uname_info)) + *delta); 88 /* printf would not be safe here */
89 fputs((char *)(&uname_info) + *delta, stdout);
93 if (toprint > 1) { 90 if (toprint > 1) {
94 bb_putchar(' '); 91 bb_putchar(' ');
95 } 92 }
@@ -98,5 +95,5 @@ int uname_main(int argc, char **argv)
98 } while (toprint >>= 1); 95 } while (toprint >>= 1);
99 bb_putchar('\n'); 96 bb_putchar('\n');
100 97
101 fflush_stdout_and_exit(EXIT_SUCCESS); 98 fflush_stdout_and_exit(EXIT_SUCCESS); /* coreutils-6.9 compat */
102} 99}
diff --git a/coreutils/who.c b/coreutils/who.c
index a206ec54b..72fc40453 100644
--- a/coreutils/who.c
+++ b/coreutils/who.c
@@ -56,16 +56,20 @@ int who_main(int argc ATTRIBUTE_UNUSED, char **argv)
56 printf("USER TTY IDLE TIME HOST\n"); 56 printf("USER TTY IDLE TIME HOST\n");
57 while ((ut = getutent()) != NULL) { 57 while ((ut = getutent()) != NULL) {
58 if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) { 58 if (ut->ut_user[0] && (opt || ut->ut_type == USER_PROCESS)) {
59 time_t tmp;
59 /* ut->ut_line is device name of tty - "/dev/" */ 60 /* ut->ut_line is device name of tty - "/dev/" */
60 name = concat_path_file("/dev", ut->ut_line); 61 name = concat_path_file("/dev", ut->ut_line);
61 str6[0] = '?'; 62 str6[0] = '?';
62 str6[1] = '\0'; 63 str6[1] = '\0';
63 if (stat(name, &st) == 0) 64 if (stat(name, &st) == 0)
64 idle_string(str6, st.st_atime); 65 idle_string(str6, st.st_atime);
66 /* manpages say ut_tv.tv_sec *is* time_t,
67 * but some systems have it wrong */
68 tmp = ut->ut_tv.tv_sec;
65 /* 15 chars for time: Nov 10 19:33:20 */ 69 /* 15 chars for time: Nov 10 19:33:20 */
66 printf("%-10s %-8s %-9s %-15.15s %s\n", 70 printf("%-10s %-8s %-9s %-15.15s %s\n",
67 ut->ut_user, ut->ut_line, str6, 71 ut->ut_user, ut->ut_line, str6,
68 ctime(&(ut->ut_tv.tv_sec)) + 4, ut->ut_host); 72 ctime(&tmp) + 4, ut->ut_host);
69 if (ENABLE_FEATURE_CLEAN_UP) 73 if (ENABLE_FEATURE_CLEAN_UP)
70 free(name); 74 free(name);
71 } 75 }
diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 86ec71016..459fb77e0 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -326,7 +326,9 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
326 char *signame; 326 char *signame;
327 char *startas; 327 char *startas;
328 char *chuid; 328 char *chuid;
329#ifdef OLDER_VERSION_OF_X
329 struct stat execstat; 330 struct stat execstat;
331#endif
330#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY 332#if ENABLE_FEATURE_START_STOP_DAEMON_FANCY
331// char *retry_arg = NULL; 333// char *retry_arg = NULL;
332// int retries = -1; 334// int retries = -1;
@@ -361,6 +363,8 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
361 363
362 if (!(opt & OPT_a)) 364 if (!(opt & OPT_a))
363 startas = execname; 365 startas = execname;
366 if (!execname) /* in case -a is given and -x is not */
367 execname = startas;
364 368
365// USE_FEATURE_START_STOP_DAEMON_FANCY( 369// USE_FEATURE_START_STOP_DAEMON_FANCY(
366// if (retry_arg) 370// if (retry_arg)
@@ -374,7 +378,8 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
374 if (errno) 378 if (errno)
375 user_id = xuname2uid(userspec); 379 user_id = xuname2uid(userspec);
376 } 380 }
377 do_procinit(); /* Both start and stop needs to know current processes */ 381 /* Both start and stop need to know current processes */
382 do_procinit();
378 383
379 if (opt & CTX_STOP) { 384 if (opt & CTX_STOP) {
380 int i = do_stop(); 385 int i = do_stop();
@@ -383,17 +388,21 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
383 388
384 if (found) { 389 if (found) {
385 if (!QUIET) 390 if (!QUIET)
386 printf("%s already running\n%d\n", execname, found->pid); 391 printf("%s is already running\n%u\n", execname, (unsigned)found->pid);
387 return !(opt & OPT_OKNODO); 392 return !(opt & OPT_OKNODO);
388 } 393 }
389 394
395#ifdef OLDER_VERSION_OF_X
390 if (execname) 396 if (execname)
391 xstat(execname, &execstat); 397 xstat(execname, &execstat);
398#endif
392 399
393 *--argv = startas; 400 *--argv = startas;
394 if (opt & OPT_BACKGROUND) { 401 if (opt & OPT_BACKGROUND) {
395#if BB_MMU 402#if BB_MMU
396 bb_daemonize(0); 403 bb_daemonize(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS);
404 /* DAEMON_DEVNULL_STDIO is superfluous -
405 * it's always done by bb_daemonize() */
397#else 406#else
398 pid_t pid = vfork(); 407 pid_t pid = vfork();
399 if (pid < 0) /* error */ 408 if (pid < 0) /* error */
@@ -404,19 +413,18 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
404 * so "return 0" may do bad things */ 413 * so "return 0" may do bad things */
405 _exit(EXIT_SUCCESS); 414 _exit(EXIT_SUCCESS);
406 } 415 }
407 /* child */ 416 /* Child */
408 setsid(); /* detach from controlling tty */ 417 setsid(); /* detach from controlling tty */
409 /* Redirect stdio to /dev/null, close extra FDs. 418 /* Redirect stdio to /dev/null, close extra FDs.
410 * We do not actually daemonize because of DAEMON_ONLY_SANITIZE */ 419 * We do not actually daemonize because of DAEMON_ONLY_SANITIZE */
411 bb_daemonize_or_rexec( 420 bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO
412 DAEMON_DEVNULL_STDIO
413 + DAEMON_CLOSE_EXTRA_FDS 421 + DAEMON_CLOSE_EXTRA_FDS
414 + DAEMON_ONLY_SANITIZE, 422 + DAEMON_ONLY_SANITIZE,
415 NULL /* argv, unused */ ); 423 NULL /* argv, unused */ );
416#endif 424#endif
417 } 425 }
418 if (opt & OPT_MAKEPID) { 426 if (opt & OPT_MAKEPID) {
419 /* user wants _us_ to make the pidfile */ 427 /* User wants _us_ to make the pidfile */
420 write_pidfile(pidfile); 428 write_pidfile(pidfile);
421 } 429 }
422 if (opt & OPT_c) { 430 if (opt & OPT_c) {
@@ -434,6 +442,6 @@ int start_stop_daemon_main(int argc ATTRIBUTE_UNUSED, char **argv)
434 } 442 }
435 } 443 }
436#endif 444#endif
437 execv(startas, argv); 445 execvp(startas, argv);
438 bb_perror_msg_and_die("cannot start %s", startas); 446 bb_perror_msg_and_die("cannot start %s", startas);
439} 447}
diff --git a/editors/awk.c b/editors/awk.c
index fef3246b8..cc5dc84b5 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -681,11 +681,6 @@ static ALWAYS_INLINE int isalnum_(int c)
681 return (isalnum(c) || c == '_'); 681 return (isalnum(c) || c == '_');
682} 682}
683 683
684static FILE *afopen(const char *path, const char *mode)
685{
686 return (*path == '-' && *(path+1) == '\0') ? stdin : xfopen(path, mode);
687}
688
689/* -------- working with variables (set/get/copy/etc) -------- */ 684/* -------- working with variables (set/get/copy/etc) -------- */
690 685
691static xhash *iamarray(var *v) 686static xhash *iamarray(var *v)
@@ -2740,7 +2735,7 @@ static rstream *next_input_file(void)
2740 ind = getvar_s(incvar(intvar[ARGIND])); 2735 ind = getvar_s(incvar(intvar[ARGIND]));
2741 fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind)); 2736 fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind));
2742 if (fname && *fname && !is_assignment(fname)) 2737 if (fname && *fname && !is_assignment(fname))
2743 F = afopen(fname, "r"); 2738 F = xfopen_stdin(fname);
2744 } 2739 }
2745 } while (!F); 2740 } while (!F);
2746 2741
@@ -2757,8 +2752,9 @@ int awk_main(int argc, char **argv)
2757{ 2752{
2758 unsigned opt; 2753 unsigned opt;
2759 char *opt_F, *opt_W; 2754 char *opt_F, *opt_W;
2760 llist_t *opt_v = NULL; 2755 llist_t *list_v = NULL;
2761 int i, j, flen; 2756 llist_t *list_f = NULL;
2757 int i, j;
2762 var *v; 2758 var *v;
2763 var tv; 2759 var tv;
2764 char **envp; 2760 char **envp;
@@ -2816,35 +2812,33 @@ int awk_main(int argc, char **argv)
2816 *s1 = '='; 2812 *s1 = '=';
2817 } 2813 }
2818 } 2814 }
2819 opt_complementary = "v::"; 2815 opt_complementary = "v::f::"; /* -v and -f can occur multiple times */
2820 opt = getopt32(argv, "F:v:f:W:", &opt_F, &opt_v, &g_progname, &opt_W); 2816 opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, &opt_W);
2821 argv += optind; 2817 argv += optind;
2822 argc -= optind; 2818 argc -= optind;
2823 if (opt & 0x1) 2819 if (opt & 0x1)
2824 setvar_s(intvar[FS], opt_F); // -F 2820 setvar_s(intvar[FS], opt_F); // -F
2825 while (opt_v) { /* -v */ 2821 while (list_v) { /* -v */
2826 if (!is_assignment(llist_pop(&opt_v))) 2822 if (!is_assignment(llist_pop(&list_v)))
2827 bb_show_usage(); 2823 bb_show_usage();
2828 } 2824 }
2829 if (opt & 0x4) { // -f 2825 if (list_f) { /* -f */
2830 char *s = s; /* die, gcc, die */ 2826 do {
2831 FILE *from_file = afopen(g_progname, "r"); 2827 char *s = NULL;
2832 /* one byte is reserved for some trick in next_token */ 2828 FILE *from_file;
2833 if (fseek(from_file, 0, SEEK_END) == 0) { 2829
2834 flen = ftell(from_file); 2830 g_progname = llist_pop(&list_f);
2835 s = xmalloc(flen + 4); 2831 from_file = xfopen_stdin(g_progname);
2836 fseek(from_file, 0, SEEK_SET); 2832 /* one byte is reserved for some trick in next_token */
2837 i = 1 + fread(s + 1, 1, flen, from_file);
2838 } else {
2839 for (i = j = 1; j > 0; i += j) { 2833 for (i = j = 1; j > 0; i += j) {
2840 s = xrealloc(s, i + 4096); 2834 s = xrealloc(s, i + 4096);
2841 j = fread(s + i, 1, 4094, from_file); 2835 j = fread(s + i, 1, 4094, from_file);
2842 } 2836 }
2843 } 2837 s[i] = '\0';
2844 s[i] = '\0'; 2838 fclose(from_file);
2845 fclose(from_file); 2839 parse_program(s + 1);
2846 parse_program(s + 1); 2840 free(s);
2847 free(s); 2841 } while (list_f);
2848 } else { // no -f: take program from 1st parameter 2842 } else { // no -f: take program from 1st parameter
2849 if (!argc) 2843 if (!argc)
2850 bb_show_usage(); 2844 bb_show_usage();
diff --git a/editors/vi.c b/editors/vi.c
index 1b335d9a1..81baa890f 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -1894,7 +1894,7 @@ static char *text_hole_make(char *p, int size) // at "p", make a 'size' byte hol
1894 p = new_text + (p - text); 1894 p = new_text + (p - text);
1895 text = new_text; 1895 text = new_text;
1896 } 1896 }
1897 memmove(p + size, p, end - p); 1897 memmove(p + size, p, end - size - p);
1898 memset(p, ' ', size); // clear new hole 1898 memset(p, ' ', size); // clear new hole
1899 file_modified++; 1899 file_modified++;
1900 return p; 1900 return p;
diff --git a/include/usage.h b/include/usage.h
index df8958060..ceac6d0af 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -3637,9 +3637,7 @@
3637 "$ cat TODO | split -a 2 -l 2 TODO_\n" 3637 "$ cat TODO | split -a 2 -l 2 TODO_\n"
3638 3638
3639#define start_stop_daemon_trivial_usage \ 3639#define start_stop_daemon_trivial_usage \
3640 "[OPTIONS] [" \ 3640 "[OPTIONS] [-S|-K] ... [-- arguments...]"
3641 USE_GETOPT_LONG("--start|--stop") SKIP_GETOPT_LONG("-S|-K") \
3642 "] ... [-- arguments...]"
3643#define start_stop_daemon_full_usage "\n\n" \ 3641#define start_stop_daemon_full_usage "\n\n" \
3644 "Search for matching processes, and then\n" \ 3642 "Search for matching processes, and then\n" \
3645 "-S: stop all matching processes.\n" \ 3643 "-S: stop all matching processes.\n" \
diff --git a/libbb/print_flags.c b/libbb/print_flags.c
index 413f51653..a1dcc01ec 100644
--- a/libbb/print_flags.c
+++ b/libbb/print_flags.c
@@ -19,8 +19,8 @@ int print_flags_separated(const int *masks, const char *labels, int flags, const
19 labels); 19 labels);
20 need_separator = separator; 20 need_separator = separator;
21 flags &= ~ *masks; 21 flags &= ~ *masks;
22 masks++;
23 } 22 }
23 masks++;
24 labels += strlen(labels) + 1; 24 labels += strlen(labels) + 1;
25 } 25 }
26 return flags; 26 return flags;
diff --git a/miscutils/last.c b/miscutils/last.c
index 612f50488..da353fbb1 100644
--- a/miscutils/last.c
+++ b/miscutils/last.c
@@ -117,6 +117,8 @@ int last_main(int argc, char **argv ATTRIBUTE_UNUSED)
117 strcpy(ut.ut_line, "system boot"); 117 strcpy(ut.ut_line, "system boot");
118 } 118 }
119 } 119 }
120 /* manpages say ut_tv.tv_sec *is* time_t,
121 * but some systems have it wrong */
120 t_tmp = (time_t)ut.ut_tv.tv_sec; 122 t_tmp = (time_t)ut.ut_tv.tv_sec;
121 printf("%-10s %-14s %-18s %-12.12s\n", 123 printf("%-10s %-14s %-18s %-12.12s\n",
122 ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t_tmp) + 4); 124 ut.ut_user, ut.ut_line, ut.ut_host, ctime(&t_tmp) + 4);
diff --git a/miscutils/last_fancy.c b/miscutils/last_fancy.c
index 2b7fee6e5..d4d35b19a 100644
--- a/miscutils/last_fancy.c
+++ b/miscutils/last_fancy.c
@@ -48,8 +48,12 @@ static void show_entry(struct utmp *ut, int state, time_t dur_secs)
48 char logout_time[8]; 48 char logout_time[8];
49 const char *logout_str; 49 const char *logout_str;
50 const char *duration_str; 50 const char *duration_str;
51 time_t tmp;
51 52
52 safe_strncpy(login_time, ctime(&(ut->ut_tv.tv_sec)), 17); 53 /* manpages say ut_tv.tv_sec *is* time_t,
54 * but some systems have it wrong */
55 tmp = ut->ut_tv.tv_sec;
56 safe_strncpy(login_time, ctime(&tmp), 17);
53 snprintf(logout_time, 8, "- %s", ctime(&dur_secs) + 11); 57 snprintf(logout_time, 8, "- %s", ctime(&dur_secs) + 11);
54 58
55 dur_secs = MAX(dur_secs - (time_t)ut->ut_tv.tv_sec, (time_t)0); 59 dur_secs = MAX(dur_secs - (time_t)ut->ut_tv.tv_sec, (time_t)0);
diff --git a/miscutils/man.c b/miscutils/man.c
index 278e5a336..dc8fa449d 100644
--- a/miscutils/man.c
+++ b/miscutils/man.c
@@ -73,7 +73,7 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
73 char *sec_list; 73 char *sec_list;
74 char *cur_path, *cur_sect; 74 char *cur_path, *cur_sect;
75 char *line, *value; 75 char *line, *value;
76 int count_mp, alloc_mp, cur_mp; 76 int count_mp, cur_mp;
77 int opt; 77 int opt;
78 78
79 opt_complementary = "-1"; /* at least one argument */ 79 opt_complementary = "-1"; /* at least one argument */
@@ -81,8 +81,8 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
81 argv += optind; 81 argv += optind;
82 82
83 sec_list = xstrdup("1:2:3:4:5:6:7:8:9"); 83 sec_list = xstrdup("1:2:3:4:5:6:7:8:9");
84 alloc_mp = 10; 84 /* Last valid man_path_list[] is [0x10] */
85 man_path_list = xmalloc(10 * sizeof(man_path_list[0])); 85 man_path_list = xzalloc(0x11 * sizeof(man_path_list[0]));
86 count_mp = 0; 86 count_mp = 0;
87 man_path_list[0] = xstrdup(getenv("MANPATH")); 87 man_path_list[0] = xstrdup(getenv("MANPATH"));
88 if (man_path_list[0]) 88 if (man_path_list[0])
@@ -107,11 +107,13 @@ int man_main(int argc ATTRIBUTE_UNUSED, char **argv)
107 if (strcmp("MANPATH", line) == 0) { 107 if (strcmp("MANPATH", line) == 0) {
108 man_path_list[count_mp] = xstrdup(value); 108 man_path_list[count_mp] = xstrdup(value);
109 count_mp++; 109 count_mp++;
110 if (alloc_mp == count_mp) { 110 /* man_path_list is NULL terminated */
111 alloc_mp += 10; 111 man_path_list[count_mp] = NULL;
112 man_path_list = xrealloc(man_path_list, alloc_mp * sizeof(man_path_list[0])); 112 if (!(count_mp & 0xf)) { /* 0x10, 0x20 etc */
113 /* so that last valid man_path_list[] is [count_mp + 0x10] */
114 man_path_list = xrealloc(man_path_list,
115 (count_mp + 0x11) * sizeof(man_path_list[0]));
113 } 116 }
114 /* thus man_path_list is always NULL terminated */
115 } 117 }
116 if (strcmp("MANSECT", line) == 0) { 118 if (strcmp("MANSECT", line) == 0) {
117 free(sec_list); 119 free(sec_list);
diff --git a/scripts/mkmakefile b/scripts/mkmakefile
new file mode 100755
index 000000000..7f9d544f9
--- /dev/null
+++ b/scripts/mkmakefile
@@ -0,0 +1,36 @@
1#!/bin/sh
2# Generates a small Makefile used in the root of the output
3# directory, to allow make to be started from there.
4# The Makefile also allow for more convinient build of external modules
5
6# Usage
7# $1 - Kernel src directory
8# $2 - Output directory
9# $3 - version
10# $4 - patchlevel
11
12
13test ! -r $2/Makefile -o -O $2/Makefile || exit 0
14echo " GEN $2/Makefile"
15
16cat << EOF > $2/Makefile
17# Automatically generated by $0: don't edit
18
19VERSION = $3
20PATCHLEVEL = $4
21
22KERNELSRC := $1
23KERNELOUTPUT := $2
24
25MAKEFLAGS += --no-print-directory
26
27.PHONY: all \$(MAKECMDGOALS)
28
29all:
30 \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT)
31
32Makefile:;
33
34\$(filter-out all Makefile,\$(MAKECMDGOALS)) %/:
35 \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@
36EOF