+/* vi: set sw=4 ts=4: */
/*
* pfsck --- A generic, parallelizing front-end for the fsck program.
* It will automatically try to run fsck programs in parallel if the
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/signal.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
#include <paths.h>
#include <unistd.h>
#include <errno.h>
-#include <malloc.h>
#include <signal.h>
#include "fsck.h"
* Return the "base device" given a particular device; this is used to
* assure that we only fsck one partition on a particular drive at any
* one time. Otherwise, the disk heads will be seeking all over the
- * place. If the base device can not be determined, return NULL.
- *
+ * place. If the base device cannot be determined, return NULL.
+ *
* The base_device() function returns an allocated string which must
* be freed.
- *
+ *
*/
int len;
#endif
- cp = str = bb_xstrdup(device);
+ cp = str = xstrdup(device);
/* Skip over /dev/; if it's not present, give up. */
if (strncmp(cp, "/dev/", 5) != 0)
goto errout;
cp += 5;
-#if 0 /* this is for old stuff no one uses anymore ? */
- /* Skip over /dev/dsk/... */
- if (strncmp(cp, "dsk/", 4) == 0)
- cp += 4;
-#endif
-
/*
* For md devices, we treat them all as if they were all
* on one disk, since we don't know how to parallelize them.
struct fs_info *fs;
if ((f = fopen(filename, "r")) == NULL) {
- bb_perror_msg("WARNING: couldn't open %s", filename);
+ bb_perror_msg("WARNING: cannot open %s", filename);
return;
}
while (!feof(f)) {
tpl = (strncmp(type, "fsck.", 5) ? "%s/fsck.%s" : "%s/%s");
for(s = strtok(p, ":"); s; s = strtok(NULL, ":")) {
- s = bb_xasprintf(tpl, s, type);
+ s = xasprintf(tpl, s, type);
if (stat(s, &st) == 0) break;
free(s);
}
return ENOMEM;
memset(inst, 0, sizeof(struct fsck_instance));
- prog = bb_xasprintf("fsck.%s", type);
+ prog = xasprintf("fsck.%s", type);
argv[0] = prog;
argc = 1;
mntpt ? mntpt : device);
for (i=0; i < argc; i++)
printf("%s ", argv[i]);
- printf("\n");
+ puts("");
}
/* Fork and execute the correct program. */
if ((errno == EINTR) || (errno == EAGAIN))
continue;
if (errno == ECHILD) {
- bb_error_msg("wait: No more child process?!?");
+ bb_error_msg("wait: no more child process?!?");
return NULL;
}
perror("wait");
num_running++;
retval = execute(type, fs->device, fs->mountpt, interactive);
if (retval) {
- bb_error_msg("Error %d while executing fsck.%s for %s",
+ bb_error_msg("error %d while executing fsck.%s for %s",
retval, type, fs->device);
num_running--;
}
}
}
- cmp->list = xcalloc(num, sizeof(char *));
- cmp->type = xcalloc(num, sizeof(int));
+ cmp->list = xzalloc(num * sizeof(char *));
+ cmp->type = xzalloc(num * sizeof(int));
cmp->negate = 0;
if (!fs_type)
bb_error_msg_and_die("%s", fs_type_syntax_error);
}
}
-#if 0
- printf("Adding %s to list (type %d).\n", s, cmp->type[num]);
-#endif
cmp->list[num++] = string_copy(s);
s = strtok(NULL, ",");
}
if (!fs_match(fs, &fs_type_compiled)) return 1;
/* Are we ignoring this type? */
- if(compare_string_array(ignored_types, fs->type) >= 0)
+ if (index_in_str_array(ignored_types, fs->type) >= 0)
return 1;
/* Do we really really want to check this fs? */
- wanted = compare_string_array(really_wanted, fs->type) >= 0;
+ wanted = index_in_str_array(really_wanted, fs->type) >= 0;
/* See if the <fsck.fs> program is available. */
s = find_fsck(fs->type);
return status;
}
-#if 0
-static void usage(void)
-{
- fputs("Usage: fsck [-ANPRTV] [ -C [ fd ] ] [-t fstype] [fs-options] [filesys ...]\n", stderr);
- exit(EXIT_USAGE);
-}
-#endif
-
static void signal_cancel(int sig FSCK_ATTR((unused)))
{
cancel_requested++;
* /proc/partitions isn't found.
*/
if (access("/proc/partitions", R_OK) < 0) {
- bb_error_msg_and_die("Couldn't open /proc/partitions: %m\n"
- "Is /proc mounted?");
+ bb_perror_msg_and_die("cannot open /proc/partitions "
+ "(is /proc mounted?)");
}
/*
* Check to see if this is because
*/
if (geteuid())
bb_error_msg_and_die(
- "Must be root to scan for matching filesystems: %s\n", arg);
+ "must be root to scan for matching filesystems: %s\n", arg);
else
bb_error_msg_and_die(
- "Couldn't find matching filesystem: %s", arg);
+ "cannot find matching filesystem: %s", arg);
}
devices[num_devices++] = dev ? dev : string_copy(arg);
continue;
case 't':
tmp = 0;
if (fstype)
- usage();
+ bb_show_usage();
if (arg[j+1])
tmp = arg+j+1;
else if ((i+1) < argc)
tmp = argv[++i];
else
- usage();
+ bb_show_usage();
fstype = string_copy(tmp);
compile_fs_type(fstype, &fs_type_compiled);
goto next_arg;
opts_for_fsck++;
break;
case '?':
- usage();
+ bb_show_usage();
break;
default:
options[++opt] = arg[j];
fstab = _PATH_MNTTAB;
load_fs_info(fstab);
- e2fs_set_sbin_path();
+ fsck_path = e2fs_set_sbin_path();
if ((num_devices == 1) || (serialize))
interactive = 1;
}
}
status |= wait_many(FLAG_WAIT_ALL);
- if (ENABLE_FEATURE_CLEAN_UP)
- free(fsck_path);
blkid_put_cache(cache);
return status;
}