aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-07-14 16:18:16 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-07-14 16:18:16 +0200
commit63214a68f1b553e09ae18956cd7e4ec9543535c5 (patch)
tree51654d9dfed26a578cf6090193c2cb0333740c8a /libbb
parent5f7904b6d11355a2010ebd10960d6a5d469301cc (diff)
downloadbusybox-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.c33
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
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 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
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 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 */