diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-11 12:19:14 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-07-11 12:19:14 +0000 |
commit | dee8587d9208e4ea5ba8f8bb73b555007529372e (patch) | |
tree | 303d21aeec9e3922e296ecc9041598a87a79b554 | |
parent | f941306199d7cb00be68483169f202432a9a9a7d (diff) | |
download | busybox-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.in | 2 | ||||
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | applets/individual.c | 4 | ||||
-rw-r--r-- | archival/libunarchive/decompress_bunzip2.c | 86 | ||||
-rw-r--r-- | coreutils/uname.c | 41 | ||||
-rw-r--r-- | coreutils/who.c | 6 | ||||
-rw-r--r-- | debianutils/start_stop_daemon.c | 24 | ||||
-rw-r--r-- | editors/awk.c | 48 | ||||
-rw-r--r-- | editors/vi.c | 2 | ||||
-rw-r--r-- | include/usage.h | 4 | ||||
-rw-r--r-- | libbb/print_flags.c | 2 | ||||
-rw-r--r-- | miscutils/last.c | 2 | ||||
-rw-r--r-- | miscutils/last_fancy.c | 6 | ||||
-rw-r--r-- | miscutils/man.c | 16 | ||||
-rwxr-xr-x | scripts/mkmakefile | 36 |
15 files changed, 130 insertions, 151 deletions
@@ -298,7 +298,7 @@ config NOMMU | |||
298 | config BUILD_LIBBUSYBOX | 298 | config 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. |
@@ -1,6 +1,6 @@ | |||
1 | VERSION = 1 | 1 | VERSION = 1 |
2 | PATCHLEVEL = 11 | 2 | PATCHLEVEL = 11 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 1 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = |
5 | NAME = Unnamed | 5 | NAME = 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; | |||
14 | int main(int argc, char **argv) | 14 | int 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 | ||
21 | void bb_show_usage(void) | 20 | void 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 | |||
70 | struct bunzip_data { | 69 | struct 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 | |||
143 | static int get_next_block(bunzip_data *bd) | 136 | static 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 | |||
526 | int read_bunzip(bunzip_data *bd, char *outbuf, int len) | 485 | int 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 | |||
643 | int start_bunzip(bunzip_data **bdp, int in_fd, const unsigned char *inbuf, | 587 | int 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 | |||
708 | USE_DESKTOP(long long) int | 644 | USE_DESKTOP(long long) int |
709 | unpack_bz2_stream(int src_fd, int dst_fd) | 645 | unpack_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 | ||
41 | static const char options[] ALIGN1 = "snrvmpa"; | 41 | static const char options[] ALIGN1 = "snrvmpa"; |
42 | static const unsigned short utsname_offset[] ALIGN2 = { | 42 | static 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 | ||
51 | int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 51 | int uname_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
52 | int uname_main(int argc, char **argv) | 52 | int 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 | ||
684 | static 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 | ||
691 | static xhash *iamarray(var *v) | 686 | static 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 | |||
13 | test ! -r $2/Makefile -o -O $2/Makefile || exit 0 | ||
14 | echo " GEN $2/Makefile" | ||
15 | |||
16 | cat << EOF > $2/Makefile | ||
17 | # Automatically generated by $0: don't edit | ||
18 | |||
19 | VERSION = $3 | ||
20 | PATCHLEVEL = $4 | ||
21 | |||
22 | KERNELSRC := $1 | ||
23 | KERNELOUTPUT := $2 | ||
24 | |||
25 | MAKEFLAGS += --no-print-directory | ||
26 | |||
27 | .PHONY: all \$(MAKECMDGOALS) | ||
28 | |||
29 | all: | ||
30 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) | ||
31 | |||
32 | Makefile:; | ||
33 | |||
34 | \$(filter-out all Makefile,\$(MAKECMDGOALS)) %/: | ||
35 | \$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@ | ||
36 | EOF | ||