]> err.no Git - util-linux/commitdiff
mount: fsprobe: make fsprobe_get_devname functions more generic
authorKarel Zak <kzak@redhat.com>
Mon, 14 May 2007 12:31:28 +0000 (14:31 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 17 May 2007 10:10:18 +0000 (12:10 +0200)
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 <kzak@redhat.com>
mount/Makefile.am
mount/fsprobe.c
mount/fsprobe_blkid.c
mount/sundries.c
mount/sundries.h
mount/swapon.c

index ae67ed63956111fe68199787cd3d7e6ff0ff0c13..fb3301339bea4a32f0f4adf2fc0ba74e61be6fc4 100644 (file)
@@ -22,7 +22,7 @@ umount_CFLAGS = $(SUID_CFLAGS) $(AM_CFLAGS)
 umount_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 
 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_CPPFLAGS = -DMAIN $(AM_CPPFLAGS)
index 4b5780262e9261490daec773e393422c8c3ea95d..2629d0d51c4686dd80f4066bcb91bf2db174e854 100644 (file)
@@ -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);
+}
+
index d25b97311d89dc26bc3a2219f630188c1ca28e7b..2dc734e5a4e6b2f5be50ef17f5f3307c7fcdb86c 100644 (file)
@@ -24,11 +24,6 @@ fsprobe_get_uuid_by_devname(const char *devname) {
        return blkid_get_tag_value(blkid, "UUID", 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)
 {
index cdfbb42e53c5700d2a46f7dfc0d75f57aa5d9842..45404c5cf87726475b2dad4062a41e5279b482bd 100644 (file)
@@ -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;
+}
+
index 085114561688f868d313d2a9a1304ddf97637919..85ccd85fdb25fb7102685f355345e44f7dc6caa6 100644 (file)
@@ -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 */
index 8c3c1bdfef02d5a7cb7074357c263dfbb6c4641c..a8e5cc10eb3fbe4b920feb656ff244c6a7784347 100644 (file)
@@ -34,6 +34,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;