fsck: use getmntent_r instead of open-coded parsing. By Vladimir

function                                             old     new   delta
create_fs_device                                     125     158     +33
parse_word                                            41       -     -41
parse_escape                                          55       -     -55
fsck_main                                           2246    1893    -353
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/1 up/down: 33/-449)          Total: -416 bytes
This commit is contained in:
Denis Vlasenko 2008-08-20 02:38:48 +00:00
parent f31c3b677d
commit b9f5d59893

View File

@ -280,9 +280,11 @@ static struct fs_info *create_fs_device(const char *device, const char *mntpnt,
fs = xzalloc(sizeof(*fs)); fs = xzalloc(sizeof(*fs));
fs->device = xstrdup(device); fs->device = xstrdup(device);
fs->mountpt = xstrdup(mntpnt); fs->mountpt = xstrdup(mntpnt);
if (strchr(type, ','))
type = (char *)"auto";
fs->type = xstrdup(type); fs->type = xstrdup(type);
fs->opts = xstrdup(opts ? opts : ""); fs->opts = xstrdup(opts ? opts : "");
fs->passno = passno; fs->passno = passno < 0 ? 1 : passno;
/*fs->flags = 0; */ /*fs->flags = 0; */
/*fs->next = NULL; */ /*fs->next = NULL; */
@ -295,130 +297,29 @@ static struct fs_info *create_fs_device(const char *device, const char *mntpnt,
return fs; return fs;
} }
static void strip_line(char *line)
{
char *p = line + strlen(line) - 1;
while (*line) {
if (*p != '\n' && *p != '\r')
break;
*p-- = '\0';
}
}
static char *parse_word(char **buf)
{
char *word, *next;
word = *buf;
if (*word == '\0')
return NULL;
word = skip_whitespace(word);
next = skip_non_whitespace(word);
if (*next)
*next++ = '\0';
*buf = next;
return word;
}
static void parse_escape(char *word)
{
char *q, c;
const char *p;
if (!word)
return;
for (p = q = word; *p; q++) {
c = *p++;
if (c != '\\') {
*q = c;
} else {
*q = bb_process_escape_sequence(&p);
}
}
*q = '\0';
}
static int parse_fstab_line(char *line, struct fs_info **ret_fs)
{
char *device, *mntpnt, *type, *opts, *passno, *cp;
struct fs_info *fs;
*ret_fs = NULL;
strip_line(line);
*strchrnul(line, '#') = '\0'; /* Ignore everything after comment */
cp = line;
device = parse_word(&cp);
if (!device) return 0; /* Allow blank lines */
mntpnt = parse_word(&cp);
type = parse_word(&cp);
opts = parse_word(&cp);
/*freq =*/ parse_word(&cp);
passno = parse_word(&cp);
if (!mntpnt || !type)
return -1;
parse_escape(device);
parse_escape(mntpnt);
parse_escape(type);
parse_escape(opts);
parse_escape(passno);
if (strchr(type, ','))
type = NULL;
fs = create_fs_device(device, mntpnt, type ? type : "auto", opts,
(passno ? atoi(passno) : -1));
*ret_fs = fs;
return 0;
}
/* Load the filesystem database from /etc/fstab */ /* Load the filesystem database from /etc/fstab */
static void load_fs_info(const char *filename) static void load_fs_info(const char *filename)
{ {
FILE *f; FILE *fstab;
int lineno = 0; struct mntent mte;
int old_fstab = 1;
struct fs_info *fs; struct fs_info *fs;
f = fopen_or_warn(filename, "r"); fstab = setmntent(filename, "r");
if (f == NULL) { if (!fstab) {
bb_perror_msg("cannot read %s", filename);
return; return;
} }
while (1) {
int r;
char *buf = xmalloc_fgetline(f);
if (!buf) break;
r = parse_fstab_line(buf, &fs);
free(buf);
lineno++;
if (r < 0) {
bb_error_msg("WARNING: bad format "
"on line %d of %s", lineno, filename);
continue;
}
if (!fs)
continue;
if (fs->passno < 0)
fs->passno = 0;
else
old_fstab = 0;
}
fclose(f);
if (old_fstab) { // Loop through entries
fputs("\007" while (getmntent_r(fstab, &mte, bb_common_bufsiz1, COMMON_BUFSIZE)) {
"WARNING: Your /etc/fstab does not contain the fsck passno field.\n" //bb_info_msg("CREATE[%s][%s][%s][%s][%d]", mte.mnt_fsname, mte.mnt_dir,
"I will kludge around things for you, but you should fix\n" // mte.mnt_type, mte.mnt_opts,
"your /etc/fstab file as soon as you can.\n\n", stderr); // mte.mnt_passno);
for (fs = filesys_info; fs; fs = fs->next) { fs = create_fs_device(mte.mnt_fsname, mte.mnt_dir,
fs->passno = 1; mte.mnt_type, mte.mnt_opts,
} mte.mnt_passno);
} }
endmntent(fstab);
} }
/* Lookup filesys in /etc/fstab and return the corresponding entry. */ /* Lookup filesys in /etc/fstab and return the corresponding entry. */