aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
Diffstat (limited to 'libbb')
-rw-r--r--libbb/copy_file.c2
-rw-r--r--libbb/dump.c41
-rw-r--r--libbb/iterate_on_dir.c28
-rw-r--r--libbb/remove_file.c6
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 */
12int 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'? ",