aboutsummaryrefslogtreecommitdiff
path: root/libbb/dump.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libbb/dump.c36
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;