libbb/dump: allow skipping over stdin too

function                                             old     new   delta
next                                                 294     265     -29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-14 16:18:16 +02:00
parent 5f7904b6d1
commit 63214a68f1

View File

@ -311,20 +311,18 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
} }
} }
static void do_skip(priv_dumper_t *dumper, const char *fname, int statok) static void do_skip(priv_dumper_t *dumper, const char *fname)
{ {
struct stat sbuf; struct stat sbuf;
if (statok) { xfstat(STDIN_FILENO, &sbuf, fname);
xfstat(STDIN_FILENO, &sbuf, fname); if (S_ISREG(sbuf.st_mode)
if (!(S_ISCHR(sbuf.st_mode) || S_ISBLK(sbuf.st_mode) || S_ISFIFO(sbuf.st_mode)) && dumper->pub.dump_skip >= sbuf.st_size
&& dumper->pub.dump_skip >= sbuf.st_size ) {
) { /* If st_size is valid and pub.dump_skip >= st_size */
/* If st_size is valid and pub.dump_skip >= st_size */ dumper->pub.dump_skip -= sbuf.st_size;
dumper->pub.dump_skip -= sbuf.st_size; dumper->address += sbuf.st_size;
dumper->address += sbuf.st_size; return;
return;
}
} }
if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) { if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) {
bb_simple_perror_msg_and_die(fname); bb_simple_perror_msg_and_die(fname);
@ -336,14 +334,11 @@ static void do_skip(priv_dumper_t *dumper, const char *fname, int statok)
static NOINLINE int next(priv_dumper_t *dumper) static NOINLINE int next(priv_dumper_t *dumper)
{ {
int statok;
for (;;) { for (;;) {
char *fname = *dumper->argv; const char *fname = *dumper->argv;
if (fname) { if (fname) {
dumper->argv++; dumper->argv++;
dumper->next__done = statok = 1;
if (!freopen(fname, "r", stdin)) { if (!freopen(fname, "r", stdin)) {
bb_simple_perror_msg(fname); bb_simple_perror_msg(fname);
dumper->exitval = 1; dumper->exitval = 1;
@ -352,13 +347,11 @@ static NOINLINE int next(priv_dumper_t *dumper)
} else { } else {
if (dumper->next__done) if (dumper->next__done)
return 0; /* no next file */ return 0; /* no next file */
dumper->next__done = 1;
//why stat of stdin is specially prohibited?
statok = 0;
} }
dumper->next__done = 1;
if (dumper->pub.dump_skip) if (dumper->pub.dump_skip)
do_skip(dumper, statok ? fname : "stdin", statok); do_skip(dumper, fname ? fname : "stdin");
if (!dumper->pub.dump_skip) if (dumper->pub.dump_skip == 0)
return 1; return 1;
} }
/* NOTREACHED */ /* NOTREACHED */