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->device = xstrdup(device);
fs->mountpt = xstrdup(mntpnt);
if (strchr(type, ','))
type = (char *)"auto";
fs->type = xstrdup(type);
fs->opts = xstrdup(opts ? opts : "");
fs->passno = passno;
fs->passno = passno < 0 ? 1 : passno;
/*fs->flags = 0; */
/*fs->next = NULL; */
@ -295,130 +297,29 @@ static struct fs_info *create_fs_device(const char *device, const char *mntpnt,
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 */
static void load_fs_info(const char *filename)
{
FILE *f;
int lineno = 0;
int old_fstab = 1;
FILE *fstab;
struct mntent mte;
struct fs_info *fs;
f = fopen_or_warn(filename, "r");
if (f == NULL) {
fstab = setmntent(filename, "r");
if (!fstab) {
bb_perror_msg("cannot read %s", filename);
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) {
fputs("\007"
"WARNING: Your /etc/fstab does not contain the fsck passno field.\n"
"I will kludge around things for you, but you should fix\n"
"your /etc/fstab file as soon as you can.\n\n", stderr);
for (fs = filesys_info; fs; fs = fs->next) {
fs->passno = 1;
}
// Loop through entries
while (getmntent_r(fstab, &mte, bb_common_bufsiz1, COMMON_BUFSIZE)) {
//bb_info_msg("CREATE[%s][%s][%s][%s][%d]", mte.mnt_fsname, mte.mnt_dir,
// mte.mnt_type, mte.mnt_opts,
// mte.mnt_passno);
fs = create_fs_device(mte.mnt_fsname, mte.mnt_dir,
mte.mnt_type, mte.mnt_opts,
mte.mnt_passno);
}
endmntent(fstab);
}
/* Lookup filesys in /etc/fstab and return the corresponding entry. */