aboutsummaryrefslogtreecommitdiff
path: root/libbb/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/dump.c')
-rw-r--r--libbb/dump.c53
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
314static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) 314static 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
337static NOINLINE int next(priv_dumper_t *dumper) 335static 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) {