diff options
Diffstat (limited to '')
-rw-r--r-- | libbb/dump.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libbb/dump.c b/libbb/dump.c index 2ca9919da..aa57eca8c 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -36,6 +36,9 @@ typedef struct priv_dumper_t { | |||
36 | off_t eaddress; /* end address */ | 36 | off_t eaddress; /* end address */ |
37 | int blocksize; | 37 | int blocksize; |
38 | smallint exitval; /* final exit value */ | 38 | smallint exitval; /* final exit value */ |
39 | #if ENABLE_PLATFORM_MINGW32 | ||
40 | FILE *fd; | ||
41 | #endif | ||
39 | 42 | ||
40 | /* former statics */ | 43 | /* former statics */ |
41 | smallint next__done; | 44 | smallint next__done; |
@@ -59,6 +62,9 @@ dumper_t* FAST_FUNC alloc_dumper(void) | |||
59 | dumper->pub.dump_length = -1; | 62 | dumper->pub.dump_length = -1; |
60 | dumper->pub.dump_vflag = FIRST; | 63 | dumper->pub.dump_vflag = FIRST; |
61 | dumper->get__ateof = 1; | 64 | dumper->get__ateof = 1; |
65 | #if ENABLE_PLATFORM_MINGW32 | ||
66 | dumper->fd = stdin; | ||
67 | #endif | ||
62 | return &dumper->pub; | 68 | return &dumper->pub; |
63 | } | 69 | } |
64 | 70 | ||
@@ -335,7 +341,11 @@ static void do_skip(priv_dumper_t *dumper, const char *fname) | |||
335 | { | 341 | { |
336 | struct stat sbuf; | 342 | struct stat sbuf; |
337 | 343 | ||
344 | #if ENABLE_PLATFORM_MINGW32 | ||
345 | xfstat(fileno(dumper->fd), &sbuf, fname); | ||
346 | #else | ||
338 | xfstat(STDIN_FILENO, &sbuf, fname); | 347 | xfstat(STDIN_FILENO, &sbuf, fname); |
348 | #endif | ||
339 | if (S_ISREG(sbuf.st_mode) | 349 | if (S_ISREG(sbuf.st_mode) |
340 | && dumper->pub.dump_skip >= sbuf.st_size | 350 | && dumper->pub.dump_skip >= sbuf.st_size |
341 | ) { | 351 | ) { |
@@ -344,7 +354,11 @@ static void do_skip(priv_dumper_t *dumper, const char *fname) | |||
344 | dumper->pub.address += sbuf.st_size; | 354 | dumper->pub.address += sbuf.st_size; |
345 | return; | 355 | return; |
346 | } | 356 | } |
357 | #if ENABLE_PLATFORM_MINGW32 | ||
358 | if (fseeko(dumper->fd, dumper->pub.dump_skip, SEEK_SET)) { | ||
359 | #else | ||
347 | if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) { | 360 | if (fseeko(stdin, dumper->pub.dump_skip, SEEK_SET)) { |
361 | #endif | ||
348 | bb_simple_perror_msg_and_die(fname); | 362 | bb_simple_perror_msg_and_die(fname); |
349 | } | 363 | } |
350 | dumper->pub.address += dumper->pub.dump_skip; | 364 | dumper->pub.address += dumper->pub.dump_skip; |
@@ -360,13 +374,23 @@ static NOINLINE int next(priv_dumper_t *dumper) | |||
360 | if (fname) { | 374 | if (fname) { |
361 | dumper->argv++; | 375 | dumper->argv++; |
362 | if (NOT_LONE_DASH(fname)) { | 376 | if (NOT_LONE_DASH(fname)) { |
377 | #if ENABLE_PLATFORM_MINGW32 | ||
378 | dumper->fd = fopen(fname, "r"); | ||
379 | if (!dumper->fd) { | ||
380 | #else | ||
363 | if (!freopen(fname, "r", stdin)) { | 381 | if (!freopen(fname, "r", stdin)) { |
382 | #endif | ||
364 | bb_simple_perror_msg(fname); | 383 | bb_simple_perror_msg(fname); |
365 | dumper->exitval = 1; | 384 | dumper->exitval = 1; |
366 | dumper->next__done = 1; | 385 | dumper->next__done = 1; |
367 | continue; | 386 | continue; |
368 | } | 387 | } |
369 | } | 388 | } |
389 | #if ENABLE_PLATFORM_MINGW32 | ||
390 | else { | ||
391 | dumper->fd = stdin; | ||
392 | } | ||
393 | #endif | ||
370 | } else { | 394 | } else { |
371 | if (dumper->next__done) | 395 | if (dumper->next__done) |
372 | return 0; /* no next file */ | 396 | return 0; /* no next file */ |
@@ -421,13 +445,25 @@ static unsigned char *get(priv_dumper_t *dumper) | |||
421 | dumper->eaddress = dumper->pub.address + nread; | 445 | dumper->eaddress = dumper->pub.address + nread; |
422 | return dumper->get__curp; | 446 | return dumper->get__curp; |
423 | } | 447 | } |
448 | #if ENABLE_PLATFORM_MINGW32 | ||
449 | n = fread(dumper->get__curp + nread, sizeof(unsigned char), | ||
450 | dumper->pub.dump_length == -1 ? need : MIN(dumper->pub.dump_length, need), dumper->fd); | ||
451 | #else | ||
424 | n = fread(dumper->get__curp + nread, sizeof(unsigned char), | 452 | n = fread(dumper->get__curp + nread, sizeof(unsigned char), |
425 | dumper->pub.dump_length == -1 ? need : MIN(dumper->pub.dump_length, need), stdin); | 453 | dumper->pub.dump_length == -1 ? need : MIN(dumper->pub.dump_length, need), stdin); |
454 | #endif | ||
426 | if (n == 0) { | 455 | if (n == 0) { |
456 | #if ENABLE_PLATFORM_MINGW32 | ||
457 | if (ferror(dumper->fd)) { | ||
458 | #else | ||
427 | if (ferror(stdin)) { | 459 | if (ferror(stdin)) { |
460 | #endif | ||
428 | bb_simple_perror_msg(dumper->argv[-1]); | 461 | bb_simple_perror_msg(dumper->argv[-1]); |
429 | } | 462 | } |
430 | dumper->get__ateof = 1; | 463 | dumper->get__ateof = 1; |
464 | #if ENABLE_PLATFORM_MINGW32 | ||
465 | fclose(dumper->fd); | ||
466 | #endif | ||
431 | continue; | 467 | continue; |
432 | } | 468 | } |
433 | dumper->get__ateof = 0; | 469 | dumper->get__ateof = 0; |