mirror of
https://github.com/sheumann/hush.git
synced 2024-12-21 23:29:34 +00:00
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:
parent
f31c3b677d
commit
b9f5d59893
133
e2fsprogs/fsck.c
133
e2fsprogs/fsck.c
@ -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. */
|
||||||
|
Loading…
Reference in New Issue
Block a user