diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-14 16:18:16 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-14 16:18:16 +0200 |
commit | 63214a68f1b553e09ae18956cd7e4ec9543535c5 (patch) | |
tree | 51654d9dfed26a578cf6090193c2cb0333740c8a /libbb | |
parent | 5f7904b6d11355a2010ebd10960d6a5d469301cc (diff) | |
download | busybox-w32-63214a68f1b553e09ae18956cd7e4ec9543535c5.tar.gz busybox-w32-63214a68f1b553e09ae18956cd7e4ec9543535c5.tar.bz2 busybox-w32-63214a68f1b553e09ae18956cd7e4ec9543535c5.zip |
libbb/dump: allow skipping over stdin too
function old new delta
next 294 265 -29
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/dump.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/libbb/dump.c b/libbb/dump.c index bc0c1ec80..189277297 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -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 st_size is valid and pub.dump_skip >= st_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,14 +334,11 @@ 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 | char *fname = *dumper->argv; | 338 | const char *fname = *dumper->argv; |
343 | 339 | ||
344 | if (fname) { | 340 | if (fname) { |
345 | dumper->argv++; | 341 | dumper->argv++; |
346 | dumper->next__done = statok = 1; | ||
347 | if (!freopen(fname, "r", stdin)) { | 342 | if (!freopen(fname, "r", stdin)) { |
348 | bb_simple_perror_msg(fname); | 343 | bb_simple_perror_msg(fname); |
349 | dumper->exitval = 1; | 344 | dumper->exitval = 1; |
@@ -352,13 +347,11 @@ static NOINLINE int next(priv_dumper_t *dumper) | |||
352 | } else { | 347 | } else { |
353 | if (dumper->next__done) | 348 | if (dumper->next__done) |
354 | return 0; /* no next file */ | 349 | return 0; /* no next file */ |
355 | dumper->next__done = 1; | ||
356 | //why stat of stdin is specially prohibited? | ||
357 | statok = 0; | ||
358 | } | 350 | } |
351 | dumper->next__done = 1; | ||
359 | if (dumper->pub.dump_skip) | 352 | if (dumper->pub.dump_skip) |
360 | do_skip(dumper, statok ? fname : "stdin", statok); | 353 | do_skip(dumper, fname ? fname : "stdin"); |
361 | if (!dumper->pub.dump_skip) | 354 | if (dumper->pub.dump_skip == 0) |
362 | return 1; | 355 | return 1; |
363 | } | 356 | } |
364 | /* NOTREACHED */ | 357 | /* NOTREACHED */ |