]> err.no Git - util-linux/commitdiff
libmount: improve parser return codes
authorKarel Zak <kzak@redhat.com>
Mon, 21 Jun 2010 21:15:54 +0000 (23:15 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:39 +0000 (12:28 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/tab.c
shlibs/mount/src/tab_parse.c

index c7665ee4b57ec317df96b3cd343ef8436b0a961a..4c06d8beb6db96059fd6f036c9fb4b74ec8915e3 100644 (file)
@@ -762,6 +762,13 @@ error:
 }
 
 #ifdef TEST_PROGRAM
+
+static int parser_errcb(mnt_tab *tb, const char *filename, int line, int flag)
+{
+       fprintf(stderr, "%s:%d: parse error\n", filename, line);
+       return 0;
+}
+
 mnt_tab *create_tab(const char *file)
 {
        mnt_tab *tb;
@@ -771,6 +778,9 @@ mnt_tab *create_tab(const char *file)
        tb = mnt_new_tab(file);
        if (!tb)
                goto err;
+
+       mnt_tab_set_parser_errcb(tb, parser_errcb);
+
        if (mnt_tab_parse_file(tb) != 0)
                goto err;
        return tb;
@@ -792,6 +802,7 @@ int test_parse(struct mtest *ts, int argc, char *argv[])
        itr = mnt_new_iter(MNT_ITER_FORWARD);
        if (!itr)
                goto err;
+
        while(mnt_tab_next_fs(tb, itr, &fs) == 0)
                mnt_fs_print_debug(fs, stdout);
 err:
index 4942692a167fb99fa95337598ac59d67ad327edf..d7cb1b77a292aa38fbc1ff7b8193cfac7b5f9ca3 100644 (file)
@@ -330,6 +330,7 @@ static int mnt_tab_parse_next(mnt_tab *tb, FILE *f, mnt_fs *fs, int *nlines)
                /* parse /etc/{fs,m}tab */
                if (mnt_tab_parse_file_line(fs, s) != 0)
                        goto err;
+
        } else if (tb->fmt == MNT_FMT_MOUNTINFO) {
                /* parse /proc/self/mountinfo */
                if (mnt_parse_mountinfo_line(fs, s) != 0)
@@ -340,11 +341,11 @@ static int mnt_tab_parse_next(mnt_tab *tb, FILE *f, mnt_fs *fs, int *nlines)
        if (!fs->optstr && (fs->vfs_optstr || fs->fs_optstr)) {
                fs->optstr = merge_optstr(fs->vfs_optstr, fs->fs_optstr);
                if (!fs->optstr)
-                       goto err;
+                       return -1;
        }
 
        DBG(DEBUG_TAB, fprintf(stderr,
-               "libmount: %s: %d: SOURCE:%s, MNTPOINT:%s, TYPE:%s, "
+               "libmount: %s:%d: SOURCE:%s, MNTPOINT:%s, TYPE:%s, "
                                  "OPTS:%s, FREQ:%d, PASSNO:%d\n",
                tb->filename, *nlines,
                fs->source, fs->target, fs->fstype,
@@ -352,10 +353,13 @@ static int mnt_tab_parse_next(mnt_tab *tb, FILE *f, mnt_fs *fs, int *nlines)
 
        return 0;
 err:
-       if (tb->errcb)
-               return tb->errcb(tb, NULL, *nlines, 0);
+       DBG(DEBUG_TAB, fprintf(stderr,
+               "libmount: %s:%d: parse error\n", tb->filename, *nlines));
 
-       return 0;
+       if (tb->errcb && tb->errcb(tb, tb->filename, *nlines, 0))
+               return -1;      /* fatal error */
+
+       return 1;               /* recoverable error */
 }
 
 /**
@@ -402,19 +406,20 @@ int mnt_tab_parse_file(mnt_tab *tb)
        while (!feof(f)) {
                int rc;
                mnt_fs *fs = mnt_new_fs();
+
                if (!fs)
                        goto error;
 
                rc = mnt_tab_parse_next(tb, f, fs, &nlines);
                if (!rc)
                        rc = mnt_tab_add_fs(tb, fs);
-               else if (feof(f)) {
-                       mnt_free_fs(fs);
-                       break;
-               }
                if (rc) {
                        mnt_free_fs(fs);
-                       goto error;
+                       if (rc == 1)
+                               continue;       /* recoverable error */
+                       if (feof(f))
+                               break;
+                       goto error;             /* fatal error */
                }
        }