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:
parent
5f7904b6d1
commit
63214a68f1
33
libbb/dump.c
33
libbb/dump.c
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user