diff options
Diffstat (limited to 'libbb/dump.c')
| -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 d34094576..3dc53d55f 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; |
