The blkid supports NAME=value parsing, but use the library for
this simple task is overkill. (The libblkid requires initialized
blkid cache all time, for all calls.)

This patch makes the fsprobe_get_devname_for_mounting() and
fsprobe_get_devname() generic for all fsprobe implementations.

Signed-off-by: Karel Zak <[EMAIL PROTECTED]>
---
 mount/Makefile.am     |    2 +-
 mount/fsprobe.c       |   61 +++++++++++++++++++++++++++++++++++++++++++++++++
 mount/fsprobe_blkid.c |   11 ---------
 mount/sundries.c      |   38 ++++++++++++++++++++++++++++++
 mount/sundries.h      |    2 +
 mount/swapon.c        |    1 +
 6 files changed, 103 insertions(+), 12 deletions(-)

diff --git a/mount/Makefile.am b/mount/Makefile.am
index b5b21b5..e61261f 100644
--- a/mount/Makefile.am
+++ b/mount/Makefile.am
@@ -23,7 +23,7 @@ umount_LDADD = $(top_srcdir)/lib/libenv.a
 umount_CFLAGS = $(SUID_CFLAGS)
 
 swapon_SOURCES = swapon.c xmalloc.c \
-       swap_constants.h realpath.c
+       swap_constants.h realpath.c fsprobe.c sundries.c
 
 losetup_SOURCES = lomount.c loop.h lomount.h
 losetup_CFLAGS = -DMAIN
diff --git a/mount/fsprobe.c b/mount/fsprobe.c
index 4b57802..2629d0d 100644
--- a/mount/fsprobe.c
+++ b/mount/fsprobe.c
@@ -162,3 +162,64 @@ fsprobe_procfsloop_mount(  int (*mount_fn)(struct 
mountargs *),
        }
        return 1;
 }
+
+const char *
+fsprobe_get_devname_for_mounting(const char *spec)
+{
+       char *name, *value;
+
+       if (!spec)
+               return NULL;
+
+       if (parse_spec(spec, &name, &value) != 0)
+               return NULL;                            /* parse error */
+
+       if (name) {
+               const char *nspec = NULL;
+
+               if (!strcmp(name,"LABEL"))
+                       nspec = fsprobe_get_devname_by_label(value);
+               else if (!strcmp(name,"UUID"))
+                       nspec = fsprobe_get_devname_by_uuid(value);
+
+               if (nspec && verbose > 1)
+                       printf(_("mount: going to mount %s by %s\n"), spec, 
name);
+
+               free((void *) name);
+               return nspec;
+       }
+
+       /* no LABEL, no UUID, .. probably a path */
+       if (verbose > 1)
+               printf(_("mount: no LABEL=, no UUID=, going to mount %s by 
path\n"), spec);
+
+       return canonicalize(spec);
+}
+
+/* like fsprobe_get_devname_for_mounting(), but without verbose messages */
+const char *
+fsprobe_get_devname(const char *spec)
+{
+       char *name, *value;
+
+       if (!spec)
+               return NULL;
+
+       if (parse_spec(spec, &name, &value) != 0)
+               return NULL;                            /* parse error */
+
+       if (name) {
+               const char *nspec = NULL;
+
+               if (!strcmp(name,"LABEL"))
+                       nspec = fsprobe_get_devname_by_label(value);
+               else if (!strcmp(name,"UUID"))
+                       nspec = fsprobe_get_devname_by_uuid(value);
+
+               free((void *) name);
+               return nspec;
+       }
+
+       return canonicalize(spec);
+}
+
diff --git a/mount/fsprobe_blkid.c b/mount/fsprobe_blkid.c
index d25b973..2dc734e 100644
--- a/mount/fsprobe_blkid.c
+++ b/mount/fsprobe_blkid.c
@@ -25,11 +25,6 @@ fsprobe_get_uuid_by_devname(const char *devname) {
 }
 
 const char *
-fsprobe_get_devname(const char *spec) {
-       return blkid_get_devname(blkid, spec, 0);
-}
-
-const char *
 fsprobe_get_devname_by_uuid(const char *uuid) {
        return blkid_get_devname(blkid, "UUID", uuid);
 }
@@ -39,12 +34,6 @@ fsprobe_get_devname_by_label(const char *label) {
        return blkid_get_devname(blkid, "LABEL", label);
 }
 
-/* Also when no UUID= or LABEL= occur? No verbose? No warnings? */
-const char *
-fsprobe_get_devname_for_mounting(const char *spec) {
-       return blkid_get_devname(blkid, spec, 0);
-}
-
 int
 fsprobe_known_fstype(const char *fstype)
 {
diff --git a/mount/sundries.c b/mount/sundries.c
index cdfbb42..45404c5 100644
--- a/mount/sundries.c
+++ b/mount/sundries.c
@@ -247,3 +247,41 @@ canonicalize (const char *path) {
 
        return xstrdup(path);
 }
+
+
+/*
+ * Parses NAME=value, returns -1 on parse error, 0 success. The success is also
+ * when the 'spec' doesn't contain name=value pair (because the spec could be
+ * a devname too). In particular case the pointer 'name' is set to NULL.
+
+ * The result is a new allocated string (the 'name' pointer).
+ */
+int
+parse_spec(const char *spec, char **name, char **value)
+{
+       char *vl, *tk, *cp;
+
+       *name = NULL;
+       *value = NULL;
+
+       if (!(cp = strchr(spec, '=')))
+               return 0;                               /* no name= */
+
+       tk = xstrdup(spec);
+       vl = tk + (cp - spec);
+       *vl++ = '\0';
+
+       if (*vl == '"' || *vl == '\'') {
+               if (!(cp = strrchr(vl+1, *vl))) {
+                       free(tk);
+                       return -1;                      /* parse error */
+               }
+               vl++;
+               *cp = '\0';
+       }
+
+       *name = tk;
+       *value = vl;
+       return 0;
+}
+
diff --git a/mount/sundries.h b/mount/sundries.h
index 0851145..85ccd85 100644
--- a/mount/sundries.h
+++ b/mount/sundries.h
@@ -35,6 +35,8 @@ char *xstrndup (const char *s, int n);
 char *xstrconcat3 (char *, const char *, const char *);
 char *xstrconcat4 (char *, const char *, const char *, const char *);
 
+int parse_spec(const char *spec, char **name, char **value);
+
 void die (int errcode, const char *fmt, ...);
 
 /* exit status - bits below are ORed */
diff --git a/mount/swapon.c b/mount/swapon.c
index 025a6b5..3936790 100644
--- a/mount/swapon.c
+++ b/mount/swapon.c
@@ -30,6 +30,7 @@
 int all = 0;
 int verbose = 0;
 int priority = -1;     /* non-prioritized swap by default */
+int mount_quiet = 0;
 
 /* If true, don't complain if the device/file doesn't exist */
 int ifexists = 0;
-- 
1.5.0.6

-
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to