diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/copy_file.c | 2 | ||||
-rw-r--r-- | libbb/dump.c | 41 | ||||
-rw-r--r-- | libbb/iterate_on_dir.c | 28 | ||||
-rw-r--r-- | libbb/remove_file.c | 6 |
4 files changed, 52 insertions, 25 deletions
diff --git a/libbb/copy_file.c b/libbb/copy_file.c index 9b10dda1f..c0928a5a8 100644 --- a/libbb/copy_file.c +++ b/libbb/copy_file.c | |||
@@ -117,6 +117,8 @@ int FAST_FUNC copy_file(const char *source, const char *dest, int flags) | |||
117 | return -1; | 117 | return -1; |
118 | } | 118 | } |
119 | #endif | 119 | #endif |
120 | if (flags & FILEUTILS_NO_OVERWRITE) /* cp -n */ | ||
121 | return 0; | ||
120 | dest_exists = 1; | 122 | dest_exists = 1; |
121 | } | 123 | } |
122 | 124 | ||
diff --git a/libbb/dump.c b/libbb/dump.c index 196ccfe65..ffae04786 100644 --- a/libbb/dump.c +++ b/libbb/dump.c | |||
@@ -34,7 +34,6 @@ typedef struct priv_dumper_t { | |||
34 | FU *endfu; | 34 | FU *endfu; |
35 | off_t savaddress; /* saved address/offset in stream */ | 35 | off_t savaddress; /* saved address/offset in stream */ |
36 | off_t eaddress; /* end address */ | 36 | off_t eaddress; /* end address */ |
37 | off_t address; /* address/offset in stream */ | ||
38 | int blocksize; | 37 | int blocksize; |
39 | smallint exitval; /* final exit value */ | 38 | smallint exitval; /* final exit value */ |
40 | #if ENABLE_PLATFORM_MINGW32 | 39 | #if ENABLE_PLATFORM_MINGW32 |
@@ -217,7 +216,7 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) | |||
217 | pr->bcnt = fu->bcnt; | 216 | pr->bcnt = fu->bcnt; |
218 | if (fu->bcnt == 0) { | 217 | if (fu->bcnt == 0) { |
219 | if (!prec) | 218 | if (!prec) |
220 | bb_simple_error_msg_and_die("%%s needs precision or byte count"); | 219 | bb_simple_error_msg_and_die("%s needs precision or byte count"); |
221 | pr->bcnt = atoi(prec); | 220 | pr->bcnt = atoi(prec); |
222 | } | 221 | } |
223 | } else | 222 | } else |
@@ -234,7 +233,8 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) | |||
234 | if ((p1[2] != 'd') && (p1[2] != 'o') && (p1[2] != 'x')) { | 233 | if ((p1[2] != 'd') && (p1[2] != 'o') && (p1[2] != 'x')) { |
235 | goto DO_BAD_CONV_CHAR; | 234 | goto DO_BAD_CONV_CHAR; |
236 | } | 235 | } |
237 | *p1 = p1[2]; | 236 | *p1++ = 'l'; |
237 | *p1++ = 'l'; | ||
238 | break; | 238 | break; |
239 | case 'c': /* %_c: chars, \ooo, \n \r \t etc */ | 239 | case 'c': /* %_c: chars, \ooo, \n \r \t etc */ |
240 | pr->flags = F_C; | 240 | pr->flags = F_C; |
@@ -344,7 +344,7 @@ static void do_skip(priv_dumper_t *dumper, const char *fname) | |||
344 | ) { | 344 | ) { |
345 | /* If st_size is valid and pub.dump_skip >= st_size */ | 345 | /* If st_size is valid and pub.dump_skip >= st_size */ |
346 | dumper->pub.dump_skip -= sbuf.st_size; | 346 | dumper->pub.dump_skip -= sbuf.st_size; |
347 | dumper->address += sbuf.st_size; | 347 | dumper->pub.address += sbuf.st_size; |
348 | return; | 348 | return; |
349 | } | 349 | } |
350 | #if ENABLE_PLATFORM_MINGW32 | 350 | #if ENABLE_PLATFORM_MINGW32 |
@@ -354,8 +354,8 @@ static void do_skip(priv_dumper_t *dumper, const char *fname) | |||
354 | #endif | 354 | #endif |
355 | bb_simple_perror_msg_and_die(fname); | 355 | bb_simple_perror_msg_and_die(fname); |
356 | } | 356 | } |
357 | dumper->address += dumper->pub.dump_skip; | 357 | dumper->pub.address += dumper->pub.dump_skip; |
358 | dumper->savaddress = dumper->address; | 358 | dumper->savaddress = dumper->pub.address; |
359 | dumper->pub.dump_skip = 0; | 359 | dumper->pub.dump_skip = 0; |
360 | } | 360 | } |
361 | 361 | ||
@@ -375,6 +375,7 @@ static NOINLINE int next(priv_dumper_t *dumper) | |||
375 | #endif | 375 | #endif |
376 | bb_simple_perror_msg(fname); | 376 | bb_simple_perror_msg(fname); |
377 | dumper->exitval = 1; | 377 | dumper->exitval = 1; |
378 | dumper->next__done = 1; | ||
378 | continue; | 379 | continue; |
379 | } | 380 | } |
380 | } | 381 | } |
@@ -403,7 +404,7 @@ static unsigned char *get(priv_dumper_t *dumper) | |||
403 | int blocksize = dumper->blocksize; | 404 | int blocksize = dumper->blocksize; |
404 | 405 | ||
405 | if (!dumper->get__curp) { | 406 | if (!dumper->get__curp) { |
406 | dumper->address = (off_t)0; /*DBU:[dave@cray.com] initialize,initialize..*/ | 407 | dumper->pub.address = (off_t)0; /*DBU:[dave@cray.com] initialize,initialize..*/ |
407 | dumper->get__curp = xmalloc(blocksize); | 408 | dumper->get__curp = xmalloc(blocksize); |
408 | dumper->get__savp = xzalloc(blocksize); /* need to be initialized */ | 409 | dumper->get__savp = xzalloc(blocksize); /* need to be initialized */ |
409 | } else { | 410 | } else { |
@@ -411,7 +412,7 @@ static unsigned char *get(priv_dumper_t *dumper) | |||
411 | dumper->get__curp = dumper->get__savp; | 412 | dumper->get__curp = dumper->get__savp; |
412 | dumper->get__savp = tmp; | 413 | dumper->get__savp = tmp; |
413 | dumper->savaddress += blocksize; | 414 | dumper->savaddress += blocksize; |
414 | dumper->address = dumper->savaddress; | 415 | dumper->pub.address = dumper->savaddress; |
415 | } | 416 | } |
416 | need = blocksize; | 417 | need = blocksize; |
417 | nread = 0; | 418 | nread = 0; |
@@ -434,7 +435,7 @@ static unsigned char *get(priv_dumper_t *dumper) | |||
434 | } | 435 | } |
435 | } | 436 | } |
436 | memset(dumper->get__curp + nread, 0, need); | 437 | memset(dumper->get__curp + nread, 0, need); |
437 | dumper->eaddress = dumper->address + nread; | 438 | dumper->eaddress = dumper->pub.address + nread; |
438 | return dumper->get__curp; | 439 | return dumper->get__curp; |
439 | } | 440 | } |
440 | #if ENABLE_PLATFORM_MINGW32 | 441 | #if ENABLE_PLATFORM_MINGW32 |
@@ -478,7 +479,7 @@ static unsigned char *get(priv_dumper_t *dumper) | |||
478 | } | 479 | } |
479 | dumper->pub.dump_vflag = DUP; | 480 | dumper->pub.dump_vflag = DUP; |
480 | dumper->savaddress += blocksize; | 481 | dumper->savaddress += blocksize; |
481 | dumper->address = dumper->savaddress; | 482 | dumper->pub.address = dumper->savaddress; |
482 | need = blocksize; | 483 | need = blocksize; |
483 | nread = 0; | 484 | nread = 0; |
484 | } else { | 485 | } else { |
@@ -579,8 +580,8 @@ static void display(priv_dumper_t* dumper) | |||
579 | 580 | ||
580 | fs = dumper->pub.fshead; | 581 | fs = dumper->pub.fshead; |
581 | savebp = bp; | 582 | savebp = bp; |
582 | saveaddress = dumper->address; | 583 | saveaddress = dumper->pub.address; |
583 | for (; fs; fs = fs->nextfs, bp = savebp, dumper->address = saveaddress) { | 584 | for (; fs; fs = fs->nextfs, bp = savebp, dumper->pub.address = saveaddress) { |
584 | FU *fu; | 585 | FU *fu; |
585 | for (fu = fs->nextfu; fu; fu = fu->nextfu) { | 586 | for (fu = fs->nextfu; fu; fu = fu->nextfu) { |
586 | int cnt; | 587 | int cnt; |
@@ -589,14 +590,14 @@ static void display(priv_dumper_t* dumper) | |||
589 | } | 590 | } |
590 | for (cnt = fu->reps; cnt; --cnt) { | 591 | for (cnt = fu->reps; cnt; --cnt) { |
591 | PR *pr; | 592 | PR *pr; |
592 | for (pr = fu->nextpr; pr; dumper->address += pr->bcnt, | 593 | for (pr = fu->nextpr; pr; dumper->pub.address += pr->bcnt, |
593 | bp += pr->bcnt, pr = pr->nextpr) { | 594 | bp += pr->bcnt, pr = pr->nextpr) { |
594 | if (dumper->eaddress | 595 | if (dumper->eaddress |
595 | && dumper->address >= dumper->eaddress | 596 | && dumper->pub.address >= dumper->eaddress |
596 | ) { | 597 | ) { |
597 | if (dumper->pub.eofstring) { | 598 | if (dumper->pub.xxd_eofstring) { |
598 | /* xxd support: requested to not pad incomplete blocks */ | 599 | /* xxd support: requested to not pad incomplete blocks */ |
599 | fputs_stdout(dumper->pub.eofstring); | 600 | fputs_stdout(dumper->pub.xxd_eofstring); |
600 | return; | 601 | return; |
601 | } | 602 | } |
602 | if (!(pr->flags & (F_TEXT | F_BPAD))) | 603 | if (!(pr->flags & (F_TEXT | F_BPAD))) |
@@ -608,7 +609,7 @@ static void display(priv_dumper_t* dumper) | |||
608 | } | 609 | } |
609 | switch (pr->flags) { | 610 | switch (pr->flags) { |
610 | case F_ADDRESS: | 611 | case F_ADDRESS: |
611 | printf(pr->fmt, (unsigned) dumper->address); | 612 | printf(pr->fmt, (unsigned long long) dumper->pub.address + dumper->pub.xxd_displayoff); |
612 | break; | 613 | break; |
613 | case F_BPAD: | 614 | case F_BPAD: |
614 | printf(pr->fmt, ""); | 615 | printf(pr->fmt, ""); |
@@ -702,15 +703,15 @@ static void display(priv_dumper_t* dumper) | |||
702 | * of blocksize, and no partial block ever found. | 703 | * of blocksize, and no partial block ever found. |
703 | */ | 704 | */ |
704 | if (!dumper->eaddress) { | 705 | if (!dumper->eaddress) { |
705 | if (!dumper->address) { | 706 | if (!dumper->pub.address) { |
706 | return; | 707 | return; |
707 | } | 708 | } |
708 | dumper->eaddress = dumper->address; | 709 | dumper->eaddress = dumper->pub.address; |
709 | } | 710 | } |
710 | for (pr = dumper->endfu->nextpr; pr; pr = pr->nextpr) { | 711 | for (pr = dumper->endfu->nextpr; pr; pr = pr->nextpr) { |
711 | switch (pr->flags) { | 712 | switch (pr->flags) { |
712 | case F_ADDRESS: | 713 | case F_ADDRESS: |
713 | printf(pr->fmt, (unsigned) dumper->eaddress); | 714 | printf(pr->fmt, (unsigned long long) dumper->eaddress + dumper->pub.xxd_displayoff); |
714 | break; | 715 | break; |
715 | case F_TEXT: | 716 | case F_TEXT: |
716 | printf(pr->fmt); | 717 | printf(pr->fmt); |
diff --git a/libbb/iterate_on_dir.c b/libbb/iterate_on_dir.c new file mode 100644 index 000000000..deef72ebf --- /dev/null +++ b/libbb/iterate_on_dir.c | |||
@@ -0,0 +1,28 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * See README for additional information | ||
4 | * | ||
5 | * Licensed under GPLv2, see file LICENSE in this source tree. | ||
6 | */ | ||
7 | //kbuild:lib-y += iterate_on_dir.o | ||
8 | |||
9 | #include "libbb.h" | ||
10 | |||
11 | /* Iterate a function on each entry of a directory */ | ||
12 | int FAST_FUNC iterate_on_dir(const char *dir_name, | ||
13 | int FAST_FUNC (*func)(const char *, struct dirent *, void *), | ||
14 | void *private) | ||
15 | { | ||
16 | DIR *dir; | ||
17 | struct dirent *de; | ||
18 | |||
19 | dir = opendir(dir_name); | ||
20 | if (dir == NULL) { | ||
21 | return -1; | ||
22 | } | ||
23 | while ((de = readdir(dir)) != NULL) { | ||
24 | func(dir_name, de, private); | ||
25 | } | ||
26 | closedir(dir); | ||
27 | return 0; | ||
28 | } | ||
diff --git a/libbb/remove_file.c b/libbb/remove_file.c index cea5d47e6..1505e6218 100644 --- a/libbb/remove_file.c +++ b/libbb/remove_file.c | |||
@@ -60,11 +60,7 @@ int FAST_FUNC remove_file(const char *path, int flags) | |||
60 | status = -1; | 60 | status = -1; |
61 | free(new_path); | 61 | free(new_path); |
62 | } | 62 | } |
63 | 63 | closedir(dp); | |
64 | if (closedir(dp) < 0) { | ||
65 | bb_perror_msg("can't close '%s'", path); | ||
66 | return -1; | ||
67 | } | ||
68 | 64 | ||
69 | if (flags & FILEUTILS_INTERACTIVE) { | 65 | if (flags & FILEUTILS_INTERACTIVE) { |
70 | fprintf(stderr, "%s: remove directory '%s'? ", | 66 | fprintf(stderr, "%s: remove directory '%s'? ", |