]> err.no Git - util-linux/commitdiff
libmount: add mnt_cache_find_tag_value()
authorKarel Zak <kzak@redhat.com>
Fri, 12 Mar 2010 22:42:56 +0000 (23:42 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 3 Jun 2010 13:20:11 +0000 (15:20 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/cache.c
shlibs/mount/src/fs.c
shlibs/mount/src/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/tab.c

index b9d89f4385784968000269d3fca019bde9fdb357..62d514d89a74826872f5a7bca62c55f9ffe82f4a 100644 (file)
@@ -220,7 +220,7 @@ const char *mnt_cache_find_tag(mnt_cache *cache,
  *
  * Reads @devname LABEL and UUID to the @cache.
  *
- * Returns: 1 if at least on tag was added, 0 no tag was added or
+ * Returns: 0 if at least on tag was added, 1 if no tag was added or
  *          -1 in case of error.
  */
 int mnt_cache_read_tags(mnt_cache *cache, const char *devname)
@@ -289,7 +289,7 @@ int mnt_cache_read_tags(mnt_cache *cache, const char *devname)
                ntags++;
        }
 
-       return ntags ? 1 : 0;
+       return ntags ? 0 : 1;
 error:
        blkid_free_probe(pr);
        close(fd);
@@ -317,6 +317,37 @@ int mnt_cache_device_has_tag(mnt_cache *cache, const char *devname,
        return 0;
 }
 
+/**
+ * mnt_cache_find_tag_value:
+ * @cache: cache for results
+ * @devname: device name
+ * @token: tag name ("LABEL" or "UUID")
+ *
+ * Returns: LABEL or UUID for the @devname or NULL in case of error.
+ */
+char *mnt_cache_find_tag_value(mnt_cache *cache,
+               const char *devname, const char *token)
+{
+       int i;
+
+       if (!cache || !devname || !token)
+               return NULL;
+
+       if (mnt_cache_read_tags(cache, devname) != 0)
+               return NULL;
+
+       for (i = 0; i < cache->nents; i++) {
+               struct mnt_cache_entry *e = &cache->ents[i];
+               if (!(e->flag & MNT_CACHE_ISTAG))
+                       continue;
+               if (strcmp(e->real, devname) == 0 &&    /* dev name */
+                   strcmp(token, e->native) == 0)      /* tag name */
+                       return e->native + strlen(token) + 1;   /* tag value */
+       }
+
+       return NULL;
+}
+
 /**
  * mnt_resolve_path:
  * @path: "native" path
index ae97b65420d8312d9b0ad6aa78dc89e7851f5c95..aa38998b9ac5b7da34949861901db2780a01fc5c 100644 (file)
@@ -574,7 +574,7 @@ int mnt_fs_match_source(mnt_fs *fs, const char *source, mnt_cache *cache)
                return 0;
 
        /* read @source's tags to the cache */
-       if (mnt_cache_read_tags(cache, cn) < 1) {
+       if (mnt_cache_read_tags(cache, cn) < 0) {
                if (errno == EACCES) {
                        /* we don't have permissions to read TAGs from
                         * @source, but can translate @fs tag to devname.
index 4e918b8332ba846534a4a24095bbf2cff7c3e455..7d13e7061d894a29385aa069b5cfa4be64e58bb5 100644 (file)
@@ -123,6 +123,10 @@ extern const char *mnt_cache_find_tag(mnt_cache *cache,
 extern int mnt_cache_read_tags(mnt_cache *cache, const char *devname);
 extern int mnt_cache_device_has_tag(mnt_cache *cache, const char *devname,
                                 const char *token, const char *value);
+
+extern char *mnt_cache_find_tag_value(mnt_cache *cache,
+                               const char *devname, const char *token);
+
 extern char *mnt_resolve_path(const char *path, mnt_cache *cache);
 extern char *mnt_resolve_tag(const char *token, const char *value, mnt_cache *cache);
 extern char *mnt_resolve_spec(const char *spec, mnt_cache *cache);
index 5df37796a6835ef7afcf3f8d61ee946cac437957..358d7b73e9cdd8265c96963d7ba236cf638f975b 100644 (file)
@@ -8,6 +8,7 @@ global:
        mnt_cache_device_has_tag;
        mnt_cache_find_path;
        mnt_cache_find_tag;
+       mnt_cache_find_tag_value;
        mnt_cache_read_tags;
        mnt_fprintf_line;
        mnt_free_cache;
index 98c56602b8d7327f2f6bcecc20341c443ea61db0..176a7d5a73e5f176c2421e763d07b5c016daeb4d 100644 (file)
@@ -519,9 +519,11 @@ mnt_fs *mnt_tab_find_srcpath(mnt_tab *tb, const char *path, int direction)
 
        /* evaluated tag */
        if (ntags) {
+               int rc = mnt_cache_read_tags(tb->cache, cn);
+
                mnt_reset_iter(&itr, direction);
 
-               if (mnt_cache_read_tags(tb->cache, cn) > 0) {
+               if (rc == 0) {
                        /* @path's TAGs are in the cache */
                        while(mnt_tab_next_fs(tb, &itr, &fs) == 0) {
                                const char *t, *v;
@@ -532,7 +534,7 @@ mnt_fs *mnt_tab_find_srcpath(mnt_tab *tb, const char *path, int direction)
                                if (mnt_cache_device_has_tag(tb->cache, cn, t, v))
                                        return fs;
                        }
-               } else if (errno == EACCES) {
+               } else if (rc < 0 && errno == EACCES) {
                        /* @path is unaccessible, try evaluate all TAGs in @tb
                         * by udev symlinks -- this could be expensive on systems
                         * with huge fstab/mtab */