/* * Returns TRUE if a partition on the same disk is already being * checked. */ static int device_already_active(char *device) { struct fsck_instance *inst; char *base; if (force_all_parallel) return 0; #ifdef BASE_MD /* Don't check a soft raid disk with any other disk */ if (instance_list && (!strncmp(instance_list->device, BASE_MD, sizeof(BASE_MD)-1) || !strncmp(device, BASE_MD, sizeof(BASE_MD)-1))) return 1; #endif base = base_device(device); /* * If we don't know the base device, assume that the device is * already active if there are any fsck instances running. */ if (!base) return (instance_list != 0); for (inst = instance_list; inst; inst = inst->next) { if (!inst->base_device || !strcmp(base, inst->base_device)) { free(base); return 1; } } free(base); return 0; }
static int device_already_active(char *device) { struct fsck_instance *inst; char *base; if (force_all_parallel) return 0; #ifdef BASE_MD if (instance_list && (!strncmp(instance_list->device, BASE_MD, sizeof(BASE_MD)-1) || !strncmp(device, BASE_MD, sizeof(BASE_MD)-1))) return 1; #endif base = base_device(device); if (!base) return (instance_list != 0); for (inst = instance_list; inst; inst = inst->next) { if (!inst->base_device || !strcmp(base, inst->base_device)) { free(base); return 1; } } free(base); return 0; }
int main(int argc, char** argv) { const char *base; char buf[256], *cp; while (1) { if (fgets(buf, sizeof(buf), stdin) == NULL) break; cp = strchr(buf, '\n'); if (cp) *cp = 0; cp = strchr(buf, '\t'); if (cp) *cp = 0; base = base_device(buf); printf("%s\t%s\n", buf, base ? base : "NONE"); } exit(0); }
/* * Execute a particular fsck program, and link it into the list of * child processes we are waiting for. */ static int execute(const char *type, const char *device, const char *mntpt, int interactive) { char *s, *argv[80]; char *prog; int argc, i; struct fsck_instance *inst, *p; pid_t pid; inst = malloc(sizeof(struct fsck_instance)); if (!inst) return ENOMEM; memset(inst, 0, sizeof(struct fsck_instance)); prog = xasprintf("fsck.%s", type); argv[0] = prog; argc = 1; for (i=0; i <num_args; i++) argv[argc++] = string_copy(args[i]); if (progress && !progress_active()) { if ((strcmp(type, "ext2") == 0) || (strcmp(type, "ext3") == 0)) { char tmp[80]; snprintf(tmp, 80, "-C%d", progress_fd); argv[argc++] = string_copy(tmp); inst->flags |= FLAG_PROGRESS; } } argv[argc++] = string_copy(device); argv[argc] = 0; s = find_fsck(prog); if (s == NULL) { bb_error_msg("%s: not found", prog); return ENOENT; } if (verbose || noexecute) { printf("[%s (%d) -- %s] ", s, num_running, mntpt ? mntpt : device); for (i=0; i < argc; i++) printf("%s ", argv[i]); puts(""); } /* Fork and execute the correct program. */ if (noexecute) pid = -1; else if ((pid = fork()) < 0) { perror("fork"); return errno; } else if (pid == 0) { if (!interactive) close(0); (void) execv(s, argv); bb_perror_msg_and_die("%s", argv[0]); } for (i = 1; i < argc; i++) free(argv[i]); free(s); inst->pid = pid; inst->prog = prog; inst->type = string_copy(type); inst->device = string_copy(device); inst->base_device = base_device(device); inst->start_time = time(0); inst->next = NULL; /* * Find the end of the list, so we add the instance on at the end. */ for (p = instance_list; p && p->next; p = p->next); if (p) p->next = inst; else instance_list = inst; return 0; }
static int execute(const char *type, const char *device, const char *mntpt, int interactive) { char *s, *argv[80], prog[80]; int argc, i; struct fsck_instance *inst, *p; pid_t pid; inst = malloc(sizeof(struct fsck_instance)); if (!inst) return ENOMEM; memset(inst, 0, sizeof(struct fsck_instance)); sprintf(prog, "fsck.%s", type); argv[0] = string_copy(prog); argc = 1; for (i=0; i <num_args; i++) argv[argc++] = string_copy(args[i]); if (progress) { if ((strcmp(type, "ext2") == 0) || (strcmp(type, "ext3") == 0) || (strcmp(type, "ext4") == 0) || (strcmp(type, "ext4dev") == 0)) { char tmp[80]; tmp[0] = 0; if (!progress_active()) { snprintf(tmp, 80, "-C%d", progress_fd); inst->flags |= FLAG_PROGRESS; } else if (progress_fd) snprintf(tmp, 80, "-C%d", progress_fd * -1); if (tmp[0]) argv[argc++] = string_copy(tmp); } } argv[argc++] = string_copy(device); argv[argc] = 0; s = find_fsck(prog); if (s == NULL) { fprintf(stderr, _("fsck: %s: not found\n"), prog); free(inst); return ENOENT; } if (verbose || noexecute) { printf("[%s (%d) -- %s] ", s, num_running, mntpt ? mntpt : device); for (i=0; i < argc; i++) printf("%s ", argv[i]); printf("\n"); } if (noexecute) pid = -1; else if ((pid = fork()) < 0) { perror("fork"); free(inst); return errno; } else if (pid == 0) { if (!interactive) close(0); (void) execv(s, argv); perror(argv[0]); free(inst); exit(EXIT_ERROR); } for (i=0; i < argc; i++) free(argv[i]); inst->pid = pid; inst->prog = string_copy(prog); inst->type = string_copy(type); inst->device = string_copy(device); inst->base_device = base_device(device); inst->start_time = time(0); inst->next = NULL; for (p = instance_list; p && p->next; p = p->next); if (p) p->next = inst; else instance_list = inst; return 0; }