diff options
Diffstat (limited to 'libbb/dump.c')
-rw-r--r-- | libbb/dump.c | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/libbb/dump.c b/libbb/dump.c index 87c1dce13..211a1ed9e 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -58,7 +58,7 @@ static NOINLINE int bb_dump_size(FS *fs) | |||
58 | const char *p; | 58 | const char *p; |
59 | int prec; | 59 | int prec; |
60 | 60 | ||
61 | /* figure out the data block bb_dump_size needed for each format unit */ | 61 | /* figure out the data block size needed for each format unit */ |
62 | for (cur_size = 0, fu = fs->nextfu; fu; fu = fu->nextfu) { | 62 | for (cur_size = 0, fu = fs->nextfu; fu; fu = fu->nextfu) { |
63 | if (fu->bcnt) { | 63 | if (fu->bcnt) { |
64 | cur_size += fu->bcnt * fu->reps; | 64 | cur_size += fu->bcnt * fu->reps; |
@@ -311,20 +311,18 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) | |||
311 | } | 311 | } |
312 | } | 312 | } |
313 | 313 | ||
314 | static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) | 314 | static void do_skip(priv_dumper_t *dumper, const char *fname) |
315 | { | 315 | { |
316 | struct stat sbuf; | 316 | struct stat sbuf; |
317 | 317 | ||
318 | if (statok) { | 318 | xfstat(STDIN_FILENO, &sbuf, fname); |
319 | xfstat(STDIN_FILENO, &sbuf, fname); | 319 | if (S_ISREG(sbuf.st_mode) |
320 | if (!(S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode) || S_ISFIFO(sbuf.st_mode)) | 320 | && dumper->pub.dump_skip >= sbuf.st_size |
321 | && dumper->pub.dump_skip >= sbuf.st_size | 321 | ) { |
322 | ) { | 322 | /* If st_size is valid and pub.dump_skip >= st_size */ |
323 | /* If bb_dump_size valid and pub.dump_skip >= size */ | 323 | dumper->pub.dump_skip -= sbuf.st_size; |
324 | dumper->pub.dump_skip -= sbuf.st_size; | 324 | dumper->address += sbuf.st_size; |
325 | dumper->address += sbuf.st_size; | 325 | return; |
326 | return; | ||
327 | } | ||
328 | } | 326 | } |
329 | if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) { | 327 | if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) { |
330 | bb_simple_perror_msg_and_die(fname); | 328 | bb_simple_perror_msg_and_die(fname); |
@@ -336,29 +334,26 @@ static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) | |||
336 | 334 | ||
337 | static NOINLINE int next(priv_dumper_t *dumper) | 335 | static NOINLINE int next(priv_dumper_t *dumper) |
338 | { | 336 | { |
339 | int statok; | ||
340 | |||
341 | for (;;) { | 337 | for (;;) { |
342 | if (*dumper->argv) { | 338 | const char *fname = *dumper->argv; |
343 | dumper->next__done = statok = 1; | 339 | |
344 | if (!(freopen(*dumper->argv, "r", stdin))) { | 340 | if (fname) { |
345 | bb_simple_perror_msg(*dumper->argv); | 341 | dumper->argv++; |
346 | dumper->exitval = 1; | 342 | if (NOT_LONE_DASH(fname)) { |
347 | ++dumper->argv; | 343 | if (!freopen(fname, "r", stdin)) { |
348 | continue; | 344 | bb_simple_perror_msg(fname); |
345 | dumper->exitval = 1; | ||
346 | continue; | ||
347 | } | ||
349 | } | 348 | } |
350 | } else { | 349 | } else { |
351 | if (dumper->next__done) | 350 | if (dumper->next__done) |
352 | return 0; /* no next file */ | 351 | return 0; /* no next file */ |
353 | dumper->next__done = 1; | ||
354 | //why stat of stdin is specially prohibited? | ||
355 | statok = 0; | ||
356 | } | 352 | } |
353 | dumper->next__done = 1; | ||
357 | if (dumper->pub.dump_skip) | 354 | if (dumper->pub.dump_skip) |
358 | do_skip(dumper, statok ? *dumper->argv : "stdin", statok); | 355 | do_skip(dumper, fname ? fname : "stdin"); |
359 | if (*dumper->argv) | 356 | if (dumper->pub.dump_skip == 0) |
360 | ++dumper->argv; | ||
361 | if (!dumper->pub.dump_skip) | ||
362 | return 1; | 357 | return 1; |
363 | } | 358 | } |
364 | /* NOTREACHED */ | 359 | /* NOTREACHED */ |
@@ -670,7 +665,7 @@ int FAST_FUNC bb_dump_dump(dumper_t *pub_dumper, char **argv) | |||
670 | FS *tfs; | 665 | FS *tfs; |
671 | int blocksize; | 666 | int blocksize; |
672 | 667 | ||
673 | /* figure out the data block bb_dump_size */ | 668 | /* figure out the data block size */ |
674 | blocksize = 0; | 669 | blocksize = 0; |
675 | tfs = dumper->pub.fshead; | 670 | tfs = dumper->pub.fshead; |
676 | while (tfs) { | 671 | while (tfs) { |