aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-09-13 05:52:46 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-09-13 05:52:46 +0200
commit7649bd024cbfcc12693ddd5c172cba93497aaed3 (patch)
treecea9d69640ac23956847412e7497f905a0957867
parent6683745bf78917562af843ecd17c4f3d04313a77 (diff)
downloadbusybox-w32-7649bd024cbfcc12693ddd5c172cba93497aaed3.tar.gz
busybox-w32-7649bd024cbfcc12693ddd5c172cba93497aaed3.tar.bz2
busybox-w32-7649bd024cbfcc12693ddd5c172cba93497aaed3.zip
fsck: more clever (->smaller) handling of parameters
function old new delta fsck_device 213 449 +236 new_args - 46 +46 fsck_main 1870 1815 -55 execute 289 - -289 ------------------------------------------------------------------------------ (add/remove: 1/1 grow/shrink: 1/1 up/down: 282/-344) Total: -62 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--e2fsprogs/fsck.c51
1 files changed, 25 insertions, 26 deletions
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c
index c4d0b03ef..21b2fdc0d 100644
--- a/e2fsprogs/fsck.c
+++ b/e2fsprogs/fsck.c
@@ -490,60 +490,55 @@ static int wait_many(int flags)
490static void execute(const char *type, const char *device, 490static void execute(const char *type, const char *device,
491 const char *mntpt /*, int interactive */) 491 const char *mntpt /*, int interactive */)
492{ 492{
493 char *argv[num_args + 4]; /* see count below: */
494 int argc;
495 int i; 493 int i;
496 struct fsck_instance *inst; 494 struct fsck_instance *inst;
497 pid_t pid; 495 pid_t pid;
498 496
499 argv[0] = xasprintf("fsck.%s", type); /* 1 */ 497 args[0] = xasprintf("fsck.%s", type);
500 for (i = 0; i < num_args; i++)
501 argv[i+1] = args[i]; /* num_args */
502 argc = num_args + 1;
503 498
504#if DO_PROGRESS_INDICATOR 499#if DO_PROGRESS_INDICATOR
505 if (progress && !progress_active()) { 500 if (progress && !progress_active()) {
506 if (strcmp(type, "ext2") == 0 501 if (strcmp(type, "ext2") == 0
507 || strcmp(type, "ext3") == 0 502 || strcmp(type, "ext3") == 0
508 ) { 503 ) {
509 argv[argc++] = xasprintf("-C%d", progress_fd); /* 1 */ 504 args[XXX] = xasprintf("-C%d", progress_fd); /* 1 */
510 inst->flags |= FLAG_PROGRESS; 505 inst->flags |= FLAG_PROGRESS;
511 } 506 }
512 } 507 }
513#endif 508#endif
514 509
515 argv[argc++] = (char*)device; /* 1 */ 510 args[num_args - 2] = (char*)device;
516 argv[argc] = NULL; /* 1 */ 511 /* args[num_args - 1] = NULL; - already is */
517 512
518 if (verbose || noexecute) { 513 if (verbose || noexecute) {
519 printf("[%s (%d) -- %s]", argv[0], num_running, 514 printf("[%s (%d) -- %s]", args[0], num_running,
520 mntpt ? mntpt : device); 515 mntpt ? mntpt : device);
521 for (i = 0; i < argc; i++) 516 for (i = 0; args[i]; i++)
522 printf(" %s", argv[i]); 517 printf(" %s", args[i]);
523 bb_putchar('\n'); 518 bb_putchar('\n');
524 } 519 }
525 520
526 /* Fork and execute the correct program. */ 521 /* Fork and execute the correct program. */
527 pid = -1; 522 pid = -1;
528 if (!noexecute) { 523 if (!noexecute) {
529 pid = spawn(argv); 524 pid = spawn(args);
530 if (pid < 0) 525 if (pid < 0)
531 bb_simple_perror_msg(argv[0]); 526 bb_simple_perror_msg(args[0]);
532 } 527 }
533 528
534#if DO_PROGRESS_INDICATOR 529#if DO_PROGRESS_INDICATOR
535 free(argv[num_args + 1]); 530 free(args[XXX]);
536#endif 531#endif
537 532
538 /* No child, so don't record an instance */ 533 /* No child, so don't record an instance */
539 if (pid <= 0) { 534 if (pid <= 0) {
540 free(argv[0]); 535 free(args[0]);
541 return; 536 return;
542 } 537 }
543 538
544 inst = xzalloc(sizeof(*inst)); 539 inst = xzalloc(sizeof(*inst));
545 inst->pid = pid; 540 inst->pid = pid;
546 inst->prog = argv[0]; 541 inst->prog = args[0];
547 inst->device = xstrdup(device); 542 inst->device = xstrdup(device);
548 inst->base_device = base_device(device); 543 inst->base_device = base_device(device);
549#if DO_PROGRESS_INDICATOR 544#if DO_PROGRESS_INDICATOR
@@ -899,6 +894,12 @@ static void compile_fs_type(char *fs_type)
899 } 894 }
900} 895}
901 896
897static char **new_args(void)
898{
899 args = xrealloc_vector(args, 2, num_args);
900 return &args[num_args++];
901}
902
902int fsck_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 903int fsck_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
903int fsck_main(int argc UNUSED_PARAM, char **argv) 904int fsck_main(int argc UNUSED_PARAM, char **argv)
904{ 905{
@@ -922,11 +923,9 @@ int fsck_main(int argc UNUSED_PARAM, char **argv)
922 opts_for_fsck = doall = notitle = 0; 923 opts_for_fsck = doall = notitle = 0;
923 devices = NULL; 924 devices = NULL;
924 num_devices = 0; 925 num_devices = 0;
925 /* in bss, so already zeroed 926 new_args(); /* args[0] = NULL, will be replaced by fsck.<type> */
926 args = NULL; 927 /* instance_list = NULL; - in bss, so already zeroed */
927 num_args = 0; 928
928 instance_list = NULL;
929 */
930 while (*++argv) { 929 while (*++argv) {
931 int j; 930 int j;
932 int optpos; 931 int optpos;
@@ -944,8 +943,7 @@ int fsck_main(int argc UNUSED_PARAM, char **argv)
944 } 943 }
945 944
946 if (arg[0] != '-' || opts_for_fsck) { 945 if (arg[0] != '-' || opts_for_fsck) {
947 args = xrealloc_vector(args, 2, num_args); 946 *new_args() = arg;
948 args[num_args++] = arg;
949 continue; 947 continue;
950 } 948 }
951 949
@@ -1022,8 +1020,7 @@ int fsck_main(int argc UNUSED_PARAM, char **argv)
1022 if (optpos) { 1020 if (optpos) {
1023 options[0] = '-'; 1021 options[0] = '-';
1024 options[optpos + 1] = '\0'; 1022 options[optpos + 1] = '\0';
1025 args = xrealloc_vector(args, 2, num_args); 1023 *new_args() = options;
1026 args[num_args++] = options;
1027 } 1024 }
1028 } 1025 }
1029 if (getenv("FSCK_FORCE_ALL_PARALLEL")) 1026 if (getenv("FSCK_FORCE_ALL_PARALLEL"))
@@ -1031,6 +1028,8 @@ int fsck_main(int argc UNUSED_PARAM, char **argv)
1031 tmp = getenv("FSCK_MAX_INST"); 1028 tmp = getenv("FSCK_MAX_INST");
1032 if (tmp) 1029 if (tmp)
1033 max_running = xatoi(tmp); 1030 max_running = xatoi(tmp);
1031 new_args(); /* args[num_args - 2] will be replaced by <device> */
1032 new_args(); /* args[num_args - 1] is the last, NULL element */
1034 1033
1035 if (!notitle) 1034 if (!notitle)
1036 puts("fsck (busybox "BB_VER", "BB_BT")"); 1035 puts("fsck (busybox "BB_VER", "BB_BT")");