diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 08:59:19 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-03-17 08:59:19 +0000 |
| commit | a55bd05f3cea6c7cbfb45d15009cb70570c2a43b (patch) | |
| tree | f156fc43098bb02d6108c61534df3da407dd9959 | |
| parent | 397de617f38a58ca4659ee348faf1df574b3ec8d (diff) | |
| download | busybox-w32-a55bd05f3cea6c7cbfb45d15009cb70570c2a43b.tar.gz busybox-w32-a55bd05f3cea6c7cbfb45d15009cb70570c2a43b.tar.bz2 busybox-w32-a55bd05f3cea6c7cbfb45d15009cb70570c2a43b.zip | |
fsck: shrink (we were passing around some params which were unused)
function old new delta
fsck_main 1807 2256 +449
fsck_device 196 189 -7
create_fs_device 131 124 -7
wait_one 325 309 -16
wait_many 52 33 -19
free_instance 38 - -38
packed_usage 23698 23650 -48
execute 2508 2402 -106
check_all 609 - -609
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/6 up/down: 449/-850) Total: -401 bytes
text data bss dec hex filename
797604 658 7428 805690 c4b3a busybox_old
797195 658 7428 805281 c49a1 busybox_unstripped
| -rw-r--r-- | e2fsprogs/fsck.c | 237 |
1 files changed, 100 insertions, 137 deletions
diff --git a/e2fsprogs/fsck.c b/e2fsprogs/fsck.c index 037a563f4..6769a7237 100644 --- a/e2fsprogs/fsck.c +++ b/e2fsprogs/fsck.c | |||
| @@ -39,6 +39,11 @@ | |||
| 39 | 39 | ||
| 40 | #include "libbb.h" | 40 | #include "libbb.h" |
| 41 | 41 | ||
| 42 | /* "progress indicator" code is somewhat buggy and ext[23] specific. | ||
| 43 | * We should be filesystem agnostic. IOW: there should be a well-defined | ||
| 44 | * API for fsck.something, NOT ad-hoc hacks in generic fsck. */ | ||
| 45 | #define DO_PROGRESS_INDICATOR 0 | ||
| 46 | |||
| 42 | #define EXIT_OK 0 | 47 | #define EXIT_OK 0 |
| 43 | #define EXIT_NONDESTRUCT 1 | 48 | #define EXIT_NONDESTRUCT 1 |
| 44 | #define EXIT_DESTRUCT 2 | 49 | #define EXIT_DESTRUCT 2 |
| @@ -57,7 +62,6 @@ struct fs_info { | |||
| 57 | char *mountpt; | 62 | char *mountpt; |
| 58 | char *type; | 63 | char *type; |
| 59 | char *opts; | 64 | char *opts; |
| 60 | int freq; | ||
| 61 | int passno; | 65 | int passno; |
| 62 | int flags; | 66 | int flags; |
| 63 | }; | 67 | }; |
| @@ -71,10 +75,10 @@ struct fsck_instance { | |||
| 71 | struct fsck_instance *next; | 75 | struct fsck_instance *next; |
| 72 | int pid; | 76 | int pid; |
| 73 | int flags; | 77 | int flags; |
| 74 | int exit_status; | 78 | #if DO_PROGRESS_INDICATOR |
| 75 | time_t start_time; | 79 | time_t start_time; |
| 80 | #endif | ||
| 76 | char *prog; | 81 | char *prog; |
| 77 | char *type; | ||
| 78 | char *device; | 82 | char *device; |
| 79 | char *base_device; /* /dev/hda for /dev/hdaN etc */ | 83 | char *base_device; /* /dev/hda for /dev/hdaN etc */ |
| 80 | }; | 84 | }; |
| @@ -125,10 +129,6 @@ static smallint notitle; | |||
| 125 | static smallint parallel_root; | 129 | static smallint parallel_root; |
| 126 | static smallint force_all_parallel; | 130 | static smallint force_all_parallel; |
| 127 | 131 | ||
| 128 | /* "progress indicator" code is somewhat buggy and ext[23] specific. | ||
| 129 | * We should be filesystem agnostic. IOW: there should be a well-defined | ||
| 130 | * API for fsck.something, NOT ad-hoc hacks in generic fsck. */ | ||
| 131 | #define DO_PROGRESS_INDICATOR 0 | ||
| 132 | #if DO_PROGRESS_INDICATOR | 132 | #if DO_PROGRESS_INDICATOR |
| 133 | static smallint progress; | 133 | static smallint progress; |
| 134 | static int progress_fd; | 134 | static int progress_fd; |
| @@ -273,7 +273,7 @@ static void free_instance(struct fsck_instance *p) | |||
| 273 | 273 | ||
| 274 | static struct fs_info *create_fs_device(const char *device, const char *mntpnt, | 274 | static struct fs_info *create_fs_device(const char *device, const char *mntpnt, |
| 275 | const char *type, const char *opts, | 275 | const char *type, const char *opts, |
| 276 | int freq, int passno) | 276 | int passno) |
| 277 | { | 277 | { |
| 278 | struct fs_info *fs; | 278 | struct fs_info *fs; |
| 279 | 279 | ||
| @@ -282,7 +282,6 @@ static struct fs_info *create_fs_device(const char *device, const char *mntpnt, | |||
| 282 | fs->mountpt = xstrdup(mntpnt); | 282 | fs->mountpt = xstrdup(mntpnt); |
| 283 | fs->type = xstrdup(type); | 283 | fs->type = xstrdup(type); |
| 284 | fs->opts = xstrdup(opts ? opts : ""); | 284 | fs->opts = xstrdup(opts ? opts : ""); |
| 285 | fs->freq = freq; | ||
| 286 | fs->passno = passno; | 285 | fs->passno = passno; |
| 287 | /*fs->flags = 0; */ | 286 | /*fs->flags = 0; */ |
| 288 | /*fs->next = NULL; */ | 287 | /*fs->next = NULL; */ |
| @@ -344,10 +343,10 @@ static void parse_escape(char *word) | |||
| 344 | 343 | ||
| 345 | static int parse_fstab_line(char *line, struct fs_info **ret_fs) | 344 | static int parse_fstab_line(char *line, struct fs_info **ret_fs) |
| 346 | { | 345 | { |
| 347 | char *device, *mntpnt, *type, *opts, *freq, *passno, *cp; | 346 | char *device, *mntpnt, *type, *opts, *passno, *cp; |
| 348 | struct fs_info *fs; | 347 | struct fs_info *fs; |
| 349 | 348 | ||
| 350 | *ret_fs = 0; | 349 | *ret_fs = NULL; |
| 351 | strip_line(line); | 350 | strip_line(line); |
| 352 | *strchrnul(line, '#') = '\0'; /* Ignore everything after comment */ | 351 | *strchrnul(line, '#') = '\0'; /* Ignore everything after comment */ |
| 353 | cp = line; | 352 | cp = line; |
| @@ -357,7 +356,7 @@ static int parse_fstab_line(char *line, struct fs_info **ret_fs) | |||
| 357 | mntpnt = parse_word(&cp); | 356 | mntpnt = parse_word(&cp); |
| 358 | type = parse_word(&cp); | 357 | type = parse_word(&cp); |
| 359 | opts = parse_word(&cp); | 358 | opts = parse_word(&cp); |
| 360 | freq = parse_word(&cp); | 359 | /*freq =*/ parse_word(&cp); |
| 361 | passno = parse_word(&cp); | 360 | passno = parse_word(&cp); |
| 362 | 361 | ||
| 363 | if (!mntpnt || !type) | 362 | if (!mntpnt || !type) |
| @@ -367,15 +366,13 @@ static int parse_fstab_line(char *line, struct fs_info **ret_fs) | |||
| 367 | parse_escape(mntpnt); | 366 | parse_escape(mntpnt); |
| 368 | parse_escape(type); | 367 | parse_escape(type); |
| 369 | parse_escape(opts); | 368 | parse_escape(opts); |
| 370 | parse_escape(freq); | ||
| 371 | parse_escape(passno); | 369 | parse_escape(passno); |
| 372 | 370 | ||
| 373 | if (strchr(type, ',')) | 371 | if (strchr(type, ',')) |
| 374 | type = NULL; | 372 | type = NULL; |
| 375 | 373 | ||
| 376 | fs = create_fs_device(device, mntpnt, type ? type : "auto", opts, | 374 | fs = create_fs_device(device, mntpnt, type ? type : "auto", opts, |
| 377 | freq ? atoi(freq) : -1, | 375 | (passno ? atoi(passno) : -1)); |
| 378 | passno ? atoi(passno) : -1); | ||
| 379 | *ret_fs = fs; | 376 | *ret_fs = fs; |
| 380 | return 0; | 377 | return 0; |
| 381 | } | 378 | } |
| @@ -477,9 +474,10 @@ static void kill_all_if_cancel_requested(void) | |||
| 477 | 474 | ||
| 478 | /* | 475 | /* |
| 479 | * Wait for one child process to exit; when it does, unlink it from | 476 | * Wait for one child process to exit; when it does, unlink it from |
| 480 | * the list of executing child processes, and return it. | 477 | * the list of executing child processes, free, and return its exit status. |
| 478 | * If there is no exited child, return -1. | ||
| 481 | */ | 479 | */ |
| 482 | static struct fsck_instance *wait_one(int flags) | 480 | static int wait_one(int flags) |
| 483 | { | 481 | { |
| 484 | int status; | 482 | int status; |
| 485 | int sig; | 483 | int sig; |
| @@ -487,46 +485,34 @@ static struct fsck_instance *wait_one(int flags) | |||
| 487 | pid_t pid; | 485 | pid_t pid; |
| 488 | 486 | ||
| 489 | if (!instance_list) | 487 | if (!instance_list) |
| 490 | return NULL; | 488 | return -1; |
| 491 | 489 | /* if (noexecute) { already returned -1; } */ | |
| 492 | if (noexecute) { | ||
| 493 | inst = instance_list; | ||
| 494 | prev = NULL; | ||
| 495 | #ifdef RANDOM_DEBUG | ||
| 496 | while (inst->next && (random() & 1)) { | ||
| 497 | prev = inst; | ||
| 498 | inst = inst->next; | ||
| 499 | } | ||
| 500 | #endif | ||
| 501 | inst->exit_status = 0; | ||
| 502 | goto ret_inst; | ||
| 503 | } | ||
| 504 | 490 | ||
| 505 | inst = prev = NULL; /* for gcc */ | 491 | while (1) { |
| 506 | do { | ||
| 507 | pid = waitpid(-1, &status, flags); | 492 | pid = waitpid(-1, &status, flags); |
| 508 | kill_all_if_cancel_requested(); | 493 | kill_all_if_cancel_requested(); |
| 509 | if (pid == 0 && (flags & WNOHANG)) | 494 | if (pid == 0) /* flags == WNOHANG and no children exited */ |
| 510 | return NULL; | 495 | return -1; |
| 511 | if (pid < 0) { | 496 | if (pid < 0) { |
| 512 | if (errno == EINTR || errno == EAGAIN) | 497 | if (errno == EINTR) |
| 513 | continue; | 498 | continue; |
| 514 | if (errno == ECHILD) { | 499 | if (errno == ECHILD) { /* paranoia */ |
| 515 | bb_error_msg("wait: no more child process?!?"); | 500 | bb_error_msg("wait: no more children"); |
| 516 | return NULL; | 501 | return -1; |
| 517 | } | 502 | } |
| 518 | bb_perror_msg("wait"); | 503 | bb_perror_msg("wait"); |
| 519 | continue; | 504 | continue; |
| 520 | } | 505 | } |
| 521 | prev = NULL; | 506 | prev = NULL; |
| 522 | inst = instance_list; | 507 | inst = instance_list; |
| 523 | while (inst) { | 508 | do { |
| 524 | if (inst->pid == pid) | 509 | if (inst->pid == pid) |
| 525 | break; | 510 | goto child_died; |
| 526 | prev = inst; | 511 | prev = inst; |
| 527 | inst = inst->next; | 512 | inst = inst->next; |
| 528 | } | 513 | } while (inst); |
| 529 | } while (!inst); | 514 | } |
| 515 | child_died: | ||
| 530 | 516 | ||
| 531 | if (WIFEXITED(status)) | 517 | if (WIFEXITED(status)) |
| 532 | status = WEXITSTATUS(status); | 518 | status = WEXITSTATUS(status); |
| @@ -534,8 +520,8 @@ static struct fsck_instance *wait_one(int flags) | |||
| 534 | sig = WTERMSIG(status); | 520 | sig = WTERMSIG(status); |
| 535 | status = EXIT_UNCORRECTED; | 521 | status = EXIT_UNCORRECTED; |
| 536 | if (sig != SIGINT) { | 522 | if (sig != SIGINT) { |
| 537 | printf("Warning... %s %s exited " | 523 | printf("Warning: %s %s terminated " |
| 538 | "with signal %d\n", | 524 | "by signal %d\n", |
| 539 | inst->prog, inst->device, sig); | 525 | inst->prog, inst->device, sig); |
| 540 | status = EXIT_ERROR; | 526 | status = EXIT_ERROR; |
| 541 | } | 527 | } |
| @@ -544,7 +530,6 @@ static struct fsck_instance *wait_one(int flags) | |||
| 544 | inst->prog, inst->device, status); | 530 | inst->prog, inst->device, status); |
| 545 | status = EXIT_ERROR; | 531 | status = EXIT_ERROR; |
| 546 | } | 532 | } |
| 547 | inst->exit_status = status; | ||
| 548 | 533 | ||
| 549 | #if DO_PROGRESS_INDICATOR | 534 | #if DO_PROGRESS_INDICATOR |
| 550 | if (progress && (inst->flags & FLAG_PROGRESS) && !progress_active()) { | 535 | if (progress && (inst->flags & FLAG_PROGRESS) && !progress_active()) { |
| @@ -573,39 +558,34 @@ static struct fsck_instance *wait_one(int flags) | |||
| 573 | } | 558 | } |
| 574 | #endif | 559 | #endif |
| 575 | 560 | ||
| 576 | ret_inst: | ||
| 577 | if (prev) | 561 | if (prev) |
| 578 | prev->next = inst->next; | 562 | prev->next = inst->next; |
| 579 | else | 563 | else |
| 580 | instance_list = inst->next; | 564 | instance_list = inst->next; |
| 581 | if (verbose > 1) | 565 | if (verbose > 1) |
| 582 | printf("Finished with %s (exit status %d)\n", | 566 | printf("Finished with %s (exit status %d)\n", |
| 583 | inst->device, inst->exit_status); | 567 | inst->device, status); |
| 584 | num_running--; | 568 | num_running--; |
| 585 | return inst; | 569 | free_instance(inst); |
| 570 | |||
| 571 | return status; | ||
| 586 | } | 572 | } |
| 587 | 573 | ||
| 588 | #define FLAG_WAIT_ALL 0 | ||
| 589 | #define FLAG_WAIT_ATLEAST_ONE 1 | ||
| 590 | /* | 574 | /* |
| 591 | * Wait until all executing child processes have exited; return the | 575 | * Wait until all executing child processes have exited; return the |
| 592 | * logical OR of all of their exit code values. | 576 | * logical OR of all of their exit code values. |
| 593 | */ | 577 | */ |
| 578 | #define FLAG_WAIT_ALL 0 | ||
| 579 | #define FLAG_WAIT_ATLEAST_ONE WNOHANG | ||
| 594 | static int wait_many(int flags) | 580 | static int wait_many(int flags) |
| 595 | { | 581 | { |
| 596 | struct fsck_instance *inst; | 582 | int exit_status; |
| 597 | int global_status = 0; | 583 | int global_status = 0; |
| 598 | int wait_flags = 0; | 584 | int wait_flags = 0; |
| 599 | 585 | ||
| 600 | while ((inst = wait_one(wait_flags))) { | 586 | while ((exit_status = wait_one(wait_flags)) != -1) { |
| 601 | global_status |= inst->exit_status; | 587 | global_status |= exit_status; |
| 602 | free_instance(inst); | 588 | wait_flags |= flags; |
| 603 | #ifdef RANDOM_DEBUG | ||
| 604 | if (noexecute && (flags & WNOHANG) && !(random() % 3)) | ||
| 605 | break; | ||
| 606 | #endif | ||
| 607 | if (flags & FLAG_WAIT_ATLEAST_ONE) | ||
| 608 | wait_flags = WNOHANG; | ||
| 609 | } | 589 | } |
| 610 | return global_status; | 590 | return global_status; |
| 611 | } | 591 | } |
| @@ -614,8 +594,8 @@ static int wait_many(int flags) | |||
| 614 | * Execute a particular fsck program, and link it into the list of | 594 | * Execute a particular fsck program, and link it into the list of |
| 615 | * child processes we are waiting for. | 595 | * child processes we are waiting for. |
| 616 | */ | 596 | */ |
| 617 | static void execute(const char *type, const char *device, const char *mntpt, | 597 | static void execute(const char *type, const char *device, |
| 618 | int interactive) | 598 | const char *mntpt /*, int interactive */) |
| 619 | { | 599 | { |
| 620 | char *argv[num_args + 4]; /* see count below: */ | 600 | char *argv[num_args + 4]; /* see count below: */ |
| 621 | int argc; | 601 | int argc; |
| @@ -623,8 +603,6 @@ static void execute(const char *type, const char *device, const char *mntpt, | |||
| 623 | struct fsck_instance *inst; | 603 | struct fsck_instance *inst; |
| 624 | pid_t pid; | 604 | pid_t pid; |
| 625 | 605 | ||
| 626 | inst = xzalloc(sizeof(*inst)); | ||
| 627 | |||
| 628 | argv[0] = xasprintf("fsck.%s", type); /* 1 */ | 606 | argv[0] = xasprintf("fsck.%s", type); /* 1 */ |
| 629 | for (i = 0; i < num_args; i++) | 607 | for (i = 0; i < num_args; i++) |
| 630 | argv[i+1] = args[i]; /* num_args */ | 608 | argv[i+1] = args[i]; /* num_args */ |
| @@ -641,7 +619,7 @@ static void execute(const char *type, const char *device, const char *mntpt, | |||
| 641 | } | 619 | } |
| 642 | #endif | 620 | #endif |
| 643 | 621 | ||
| 644 | argv[argc++] = xstrdup(device); /* 1 */ | 622 | argv[argc++] = (char*)device; /* 1 */ |
| 645 | argv[argc] = NULL; /* 1 */ | 623 | argv[argc] = NULL; /* 1 */ |
| 646 | 624 | ||
| 647 | if (verbose || noexecute) { | 625 | if (verbose || noexecute) { |
| @@ -660,21 +638,24 @@ static void execute(const char *type, const char *device, const char *mntpt, | |||
| 660 | bb_simple_perror_msg(argv[0]); | 638 | bb_simple_perror_msg(argv[0]); |
| 661 | } | 639 | } |
| 662 | 640 | ||
| 663 | for (i = num_args+1; i < argc; i++) | 641 | #if DO_PROGRESS_INDICATOR |
| 664 | free(argv[i]); | 642 | free(argv[num_args + 1]); |
| 643 | #endif | ||
| 665 | 644 | ||
| 666 | /* No pid, so don't record an instance */ | 645 | /* No child, so don't record an instance */ |
| 667 | if (pid < 0) { | 646 | if (pid <= 0) { |
| 668 | free(inst); | 647 | free(argv[0]); |
| 669 | return; | 648 | return; |
| 670 | } | 649 | } |
| 671 | 650 | ||
| 651 | inst = xzalloc(sizeof(*inst)); | ||
| 672 | inst->pid = pid; | 652 | inst->pid = pid; |
| 673 | inst->prog = argv[0]; | 653 | inst->prog = argv[0]; |
| 674 | inst->type = xstrdup(type); | ||
| 675 | inst->device = xstrdup(device); | 654 | inst->device = xstrdup(device); |
| 676 | inst->base_device = base_device(device); | 655 | inst->base_device = base_device(device); |
| 656 | #if DO_PROGRESS_INDICATOR | ||
| 677 | inst->start_time = time(NULL); | 657 | inst->start_time = time(NULL); |
| 658 | #endif | ||
| 678 | 659 | ||
| 679 | /* Add to the list of running fsck's. | 660 | /* Add to the list of running fsck's. |
| 680 | * (was adding to the end, but adding to the front is simpler...) */ | 661 | * (was adding to the end, but adding to the front is simpler...) */ |
| @@ -692,7 +673,7 @@ static void execute(const char *type, const char *device, const char *mntpt, | |||
| 692 | * If the type isn't specified by the user, then use either the type | 673 | * If the type isn't specified by the user, then use either the type |
| 693 | * specified in /etc/fstab, or "auto". | 674 | * specified in /etc/fstab, or "auto". |
| 694 | */ | 675 | */ |
| 695 | static void fsck_device(struct fs_info *fs, int interactive) | 676 | static void fsck_device(struct fs_info *fs /*, int interactive */) |
| 696 | { | 677 | { |
| 697 | const char *type; | 678 | const char *type; |
| 698 | 679 | ||
| @@ -719,7 +700,7 @@ static void fsck_device(struct fs_info *fs, int interactive) | |||
| 719 | } | 700 | } |
| 720 | 701 | ||
| 721 | num_running++; | 702 | num_running++; |
| 722 | execute(type, fs->device, fs->mountpt, interactive); | 703 | execute(type, fs->device, fs->mountpt /*, interactive */); |
| 723 | } | 704 | } |
| 724 | 705 | ||
| 725 | /* | 706 | /* |
| @@ -871,32 +852,31 @@ static int check_all(void) | |||
| 871 | * which should be ignored as done, and resolve any "auto" | 852 | * which should be ignored as done, and resolve any "auto" |
| 872 | * filesystem types (done as a side-effect of calling ignore()). | 853 | * filesystem types (done as a side-effect of calling ignore()). |
| 873 | */ | 854 | */ |
| 874 | for (fs = filesys_info; fs; fs = fs->next) { | 855 | for (fs = filesys_info; fs; fs = fs->next) |
| 875 | if (ignore(fs)) | 856 | if (ignore(fs)) |
| 876 | fs->flags |= FLAG_DONE; | 857 | fs->flags |= FLAG_DONE; |
| 877 | } | ||
| 878 | 858 | ||
| 879 | /* | 859 | /* |
| 880 | * Find and check the root filesystem. | 860 | * Find and check the root filesystem. |
| 881 | */ | 861 | */ |
| 882 | if (!parallel_root) { | 862 | if (!parallel_root) { |
| 883 | for (fs = filesys_info; fs; fs = fs->next) { | 863 | for (fs = filesys_info; fs; fs = fs->next) { |
| 884 | if (LONE_CHAR(fs->mountpt, '/')) | 864 | if (LONE_CHAR(fs->mountpt, '/')) { |
| 865 | if (!skip_root && !ignore(fs)) { | ||
| 866 | fsck_device(fs /*, 1*/); | ||
| 867 | status |= wait_many(FLAG_WAIT_ALL); | ||
| 868 | if (status > EXIT_NONDESTRUCT) | ||
| 869 | return status; | ||
| 870 | } | ||
| 871 | fs->flags |= FLAG_DONE; | ||
| 885 | break; | 872 | break; |
| 886 | } | ||
| 887 | if (fs) { | ||
| 888 | if (!skip_root && !ignore(fs)) { | ||
| 889 | fsck_device(fs, 1); | ||
| 890 | status |= wait_many(FLAG_WAIT_ALL); | ||
| 891 | if (status > EXIT_NONDESTRUCT) | ||
| 892 | return status; | ||
| 893 | } | 873 | } |
| 894 | fs->flags |= FLAG_DONE; | ||
| 895 | } | 874 | } |
| 896 | } | 875 | } |
| 897 | /* | 876 | /* |
| 898 | * This is for the bone-headed user who enters the root | 877 | * This is for the bone-headed user who has root |
| 899 | * filesystem twice. Skip root will skip all root entries. | 878 | * filesystem listed twice. |
| 879 | * "Skip root" will skip _all_ root entries. | ||
| 900 | */ | 880 | */ |
| 901 | if (skip_root) | 881 | if (skip_root) |
| 902 | for (fs = filesys_info; fs; fs = fs->next) | 882 | for (fs = filesys_info; fs; fs = fs->next) |
| @@ -916,7 +896,7 @@ static int check_all(void) | |||
| 916 | continue; | 896 | continue; |
| 917 | /* | 897 | /* |
| 918 | * If the filesystem's pass number is higher | 898 | * If the filesystem's pass number is higher |
| 919 | * than the current pass number, then we don't | 899 | * than the current pass number, then we didn't |
| 920 | * do it yet. | 900 | * do it yet. |
| 921 | */ | 901 | */ |
| 922 | if (fs->passno > passno) { | 902 | if (fs->passno > passno) { |
| @@ -935,7 +915,7 @@ static int check_all(void) | |||
| 935 | /* | 915 | /* |
| 936 | * Spawn off the fsck process | 916 | * Spawn off the fsck process |
| 937 | */ | 917 | */ |
| 938 | fsck_device(fs, serialize); | 918 | fsck_device(fs /*, serialize*/); |
| 939 | fs->flags |= FLAG_DONE; | 919 | fs->flags |= FLAG_DONE; |
| 940 | 920 | ||
| 941 | /* | 921 | /* |
| @@ -979,21 +959,16 @@ static void compile_fs_type(char *fs_type) | |||
| 979 | int num = 2; | 959 | int num = 2; |
| 980 | smallint negate; | 960 | smallint negate; |
| 981 | 961 | ||
| 982 | if (fs_type) { | 962 | s = fs_type; |
| 983 | s = fs_type; | 963 | while ((s = strchr(s, ','))) { |
| 984 | while ((s = strchr(s, ','))) { | 964 | num++; |
| 985 | num++; | 965 | s++; |
| 986 | s++; | ||
| 987 | } | ||
| 988 | } | 966 | } |
| 989 | 967 | ||
| 990 | fs_type_list = xzalloc(num * sizeof(fs_type_list[0])); | 968 | fs_type_list = xzalloc(num * sizeof(fs_type_list[0])); |
| 991 | fs_type_flag = xzalloc(num * sizeof(fs_type_flag[0])); | 969 | fs_type_flag = xzalloc(num * sizeof(fs_type_flag[0])); |
| 992 | fs_type_negated = -1; /* not yet known is it negated or not */ | 970 | fs_type_negated = -1; /* not yet known is it negated or not */ |
| 993 | 971 | ||
| 994 | if (!fs_type) | ||
| 995 | return; | ||
| 996 | |||
| 997 | num = 0; | 972 | num = 0; |
| 998 | s = fs_type; | 973 | s = fs_type; |
| 999 | while (1) { | 974 | while (1) { |
| @@ -1031,12 +1006,12 @@ static void compile_fs_type(char *fs_type) | |||
| 1031 | } | 1006 | } |
| 1032 | } | 1007 | } |
| 1033 | 1008 | ||
| 1034 | static void parse_args(int argc, char **argv) | 1009 | static void parse_args(char **argv) |
| 1035 | { | 1010 | { |
| 1036 | int i, j; | 1011 | int i, j; |
| 1037 | char *arg, *tmp; | 1012 | char *arg, *tmp; |
| 1038 | char *options = NULL; | 1013 | char *options; |
| 1039 | int optpos = 0; | 1014 | int optpos; |
| 1040 | int opts_for_fsck = 0; | 1015 | int opts_for_fsck = 0; |
| 1041 | 1016 | ||
| 1042 | /* in bss, so already zeroed | 1017 | /* in bss, so already zeroed |
| @@ -1045,8 +1020,7 @@ static void parse_args(int argc, char **argv) | |||
| 1045 | instance_list = NULL; | 1020 | instance_list = NULL; |
| 1046 | */ | 1021 | */ |
| 1047 | 1022 | ||
| 1048 | /* TODO: getopt32 */ | 1023 | for (i = 1; argv[i]; i++) { |
| 1049 | for (i = 1; i < argc; i++) { | ||
| 1050 | arg = argv[i]; | 1024 | arg = argv[i]; |
| 1051 | 1025 | ||
| 1052 | /* "/dev/blk" or "/path" or "UUID=xxx" or "LABEL=xxx" */ | 1026 | /* "/dev/blk" or "/path" or "UUID=xxx" or "LABEL=xxx" */ |
| @@ -1065,14 +1039,14 @@ static void parse_args(int argc, char **argv) | |||
| 1065 | continue; | 1039 | continue; |
| 1066 | } | 1040 | } |
| 1067 | 1041 | ||
| 1042 | if (LONE_CHAR(arg + 1, '-')) { /* "--" ? */ | ||
| 1043 | opts_for_fsck = 1; | ||
| 1044 | continue; | ||
| 1045 | } | ||
| 1046 | |||
| 1047 | optpos = 0; | ||
| 1048 | options = NULL; | ||
| 1068 | for (j = 1; arg[j]; j++) { | 1049 | for (j = 1; arg[j]; j++) { |
| 1069 | if (opts_for_fsck) { | ||
| 1070 | optpos++; | ||
| 1071 | /* one extra for '\0' */ | ||
| 1072 | options = xrealloc(options, optpos + 2); | ||
| 1073 | options[optpos] = arg[j]; | ||
| 1074 | continue; | ||
| 1075 | } | ||
| 1076 | switch (arg[j]) { | 1050 | switch (arg[j]) { |
| 1077 | case 'A': | 1051 | case 'A': |
| 1078 | doall = 1; | 1052 | doall = 1; |
| @@ -1085,7 +1059,8 @@ static void parse_args(int argc, char **argv) | |||
| 1085 | goto next_arg; | 1059 | goto next_arg; |
| 1086 | } | 1060 | } |
| 1087 | /* -C n */ | 1061 | /* -C n */ |
| 1088 | progress_fd = xatoi_u(argv[++i]); | 1062 | if (!argv[++i]) bb_show_usage(); |
| 1063 | progress_fd = xatoi_u(argv[i]); | ||
| 1089 | goto next_arg; | 1064 | goto next_arg; |
| 1090 | #endif | 1065 | #endif |
| 1091 | case 'V': | 1066 | case 'V': |
| @@ -1114,16 +1089,13 @@ static void parse_args(int argc, char **argv) | |||
| 1114 | bb_show_usage(); | 1089 | bb_show_usage(); |
| 1115 | if (arg[++j]) | 1090 | if (arg[++j]) |
| 1116 | tmp = &arg[j]; | 1091 | tmp = &arg[j]; |
| 1117 | else if (++i < argc) | 1092 | else if (argv[++i]) |
| 1118 | tmp = argv[i]; | 1093 | tmp = argv[i]; |
| 1119 | else | 1094 | else |
| 1120 | bb_show_usage(); | 1095 | bb_show_usage(); |
| 1121 | fstype = xstrdup(tmp); | 1096 | fstype = xstrdup(tmp); |
| 1122 | compile_fs_type(fstype); | 1097 | compile_fs_type(fstype); |
| 1123 | goto next_arg; | 1098 | goto next_arg; |
| 1124 | case '-': | ||
| 1125 | opts_for_fsck++; | ||
| 1126 | break; | ||
| 1127 | case '?': | 1099 | case '?': |
| 1128 | bb_show_usage(); | 1100 | bb_show_usage(); |
| 1129 | break; | 1101 | break; |
| @@ -1141,8 +1113,6 @@ static void parse_args(int argc, char **argv) | |||
| 1141 | options[optpos + 1] = '\0'; | 1113 | options[optpos + 1] = '\0'; |
| 1142 | args = xrealloc(args, (num_args+1) * sizeof(args[0])); | 1114 | args = xrealloc(args, (num_args+1) * sizeof(args[0])); |
| 1143 | args[num_args++] = options; | 1115 | args[num_args++] = options; |
| 1144 | optpos = 0; | ||
| 1145 | options = NULL; | ||
| 1146 | } | 1116 | } |
| 1147 | } | 1117 | } |
| 1148 | if (getenv("FSCK_FORCE_ALL_PARALLEL")) | 1118 | if (getenv("FSCK_FORCE_ALL_PARALLEL")) |
| @@ -1160,17 +1130,18 @@ static void signal_cancel(int sig ATTRIBUTE_UNUSED) | |||
| 1160 | int fsck_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1130 | int fsck_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
| 1161 | int fsck_main(int argc, char **argv) | 1131 | int fsck_main(int argc, char **argv) |
| 1162 | { | 1132 | { |
| 1163 | int i, status = 0; | 1133 | int i, status; |
| 1164 | int interactive; | 1134 | /*int interactive;*/ |
| 1165 | const char *fstab; | 1135 | const char *fstab; |
| 1166 | struct fs_info *fs; | 1136 | struct fs_info *fs; |
| 1167 | 1137 | ||
| 1138 | /* we want wait() to be interruptible */ | ||
| 1168 | signal_no_SA_RESTART_empty_mask(SIGINT, signal_cancel); | 1139 | signal_no_SA_RESTART_empty_mask(SIGINT, signal_cancel); |
| 1169 | signal_no_SA_RESTART_empty_mask(SIGTERM, signal_cancel); | 1140 | signal_no_SA_RESTART_empty_mask(SIGTERM, signal_cancel); |
| 1170 | 1141 | ||
| 1171 | setbuf(stdout, NULL); | 1142 | setbuf(stdout, NULL); |
| 1172 | 1143 | ||
| 1173 | parse_args(argc, argv); | 1144 | parse_args(argv); |
| 1174 | 1145 | ||
| 1175 | if (!notitle) | 1146 | if (!notitle) |
| 1176 | puts("fsck (busybox "BB_VER", "BB_BT")"); | 1147 | puts("fsck (busybox "BB_VER", "BB_BT")"); |
| @@ -1182,18 +1153,14 @@ int fsck_main(int argc, char **argv) | |||
| 1182 | fstab = "/etc/fstab"; | 1153 | fstab = "/etc/fstab"; |
| 1183 | load_fs_info(fstab); | 1154 | load_fs_info(fstab); |
| 1184 | 1155 | ||
| 1185 | interactive = (num_devices == 1) | serialize; | 1156 | /*interactive = (num_devices == 1) | serialize;*/ |
| 1186 | 1157 | ||
| 1187 | /* If -A was specified ("check all"), do that! */ | 1158 | if (num_devices == 0) |
| 1159 | /*interactive =*/ serialize = doall = 1; | ||
| 1188 | if (doall) | 1160 | if (doall) |
| 1189 | return check_all(); | 1161 | return check_all(); |
| 1190 | 1162 | ||
| 1191 | if (num_devices == 0) { | 1163 | status = 0; |
| 1192 | serialize = 1; | ||
| 1193 | interactive = 1; | ||
| 1194 | return check_all(); | ||
| 1195 | } | ||
| 1196 | |||
| 1197 | for (i = 0; i < num_devices; i++) { | 1164 | for (i = 0; i < num_devices; i++) { |
| 1198 | if (cancel_requested) { | 1165 | if (cancel_requested) { |
| 1199 | kill_all_if_cancel_requested(); | 1166 | kill_all_if_cancel_requested(); |
| @@ -1202,19 +1169,15 @@ int fsck_main(int argc, char **argv) | |||
| 1202 | 1169 | ||
| 1203 | fs = lookup(devices[i]); | 1170 | fs = lookup(devices[i]); |
| 1204 | if (!fs) | 1171 | if (!fs) |
| 1205 | fs = create_fs_device(devices[i], 0, "auto", 0, -1, -1); | 1172 | fs = create_fs_device(devices[i], "", "auto", NULL, -1); |
| 1206 | fsck_device(fs, interactive); | 1173 | fsck_device(fs /*, interactive */); |
| 1207 | 1174 | ||
| 1208 | if (serialize | 1175 | if (serialize |
| 1209 | || (max_running && (num_running >= max_running)) | 1176 | || (max_running && (num_running >= max_running)) |
| 1210 | ) { | 1177 | ) { |
| 1211 | struct fsck_instance *inst; | 1178 | int exit_status = wait_one(0); |
| 1212 | 1179 | if (exit_status >= 0) | |
| 1213 | inst = wait_one(0); | 1180 | status |= exit_status; |
| 1214 | if (inst) { | ||
| 1215 | status |= inst->exit_status; | ||
| 1216 | free_instance(inst); | ||
| 1217 | } | ||
| 1218 | if (verbose > 1) | 1181 | if (verbose > 1) |
| 1219 | puts("----------------------------------"); | 1182 | puts("----------------------------------"); |
| 1220 | } | 1183 | } |
