Whamcloud - gitweb
Add new two new functions to the blkid library: blkid_dev_set_search(), and
authorTheodore Ts'o <tytso@mit.edu>
Sat, 7 May 2005 17:32:47 +0000 (13:32 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 7 May 2005 17:32:47 +0000 (13:32 -0400)
blkid_dev_has_tag(), and change the blkid program to take advantage of these
functions.

lib/blkid/ChangeLog
lib/blkid/Makefile.in
lib/blkid/blkid.h
lib/blkid/dev.c
lib/blkid/tag.c
misc/ChangeLog
misc/blkid.c

index 1f9083f..f558da8 100644 (file)
@@ -1,3 +1,14 @@
+2005-05-07  Theodore Ts'o  <tytso@mit.edu>
+
+       * tag.c (blkid_dev_has_tag): New function which returns 1 if a tag
+               has a particular type and possibly value.
+
+       * blkid.h, dev.c (blkid_dev_set_search, blkid_dev_next): Added new
+               function, blkid_dev_set_search(), which filters the
+               devices returned by the blkid_dev_next() iterator.
+
+       * tag.c, dev.c, Makefile.in: Add debugging test program code.
+
 2005-05-05  Theodore Ts'o  <tytso@mit.edu>
 
        * probe.c (probe_cramfs), probe.h: Fix magic number recognition
index d01cedb..9f7cffb 100644 (file)
@@ -108,6 +108,10 @@ tst_save: $(srcdir)/save.c $(DEPLIBS_BLKID)
        @echo " LD $@"
        @$(CC) -o tst_save -DTEST_PROGRAM $(srcdir)/save.c $(LIBS_BLKID) $(ALL_CFLAGS)
 
+tst_tag: $(srcdir)/tag.c $(DEPLIBS_BLKID)
+       @echo " LD $@"
+       @$(CC) -o tst_tag -DTEST_PROGRAM $(srcdir)/tag.c $(LIBS_BLKID) $(ALL_CFLAGS)
+
 ../../misc/blkid.o: $(top_srcdir)/misc/blkid.c blkid.h
        @echo " CC $@"
        @$(CC) $(ALL_CFLAGS) -c $(top_srcdir)/misc/blkid.c \
@@ -117,8 +121,8 @@ blkid: ../../misc/blkid.o libblkid.a $(DEPLIBUUID)
        @echo " LD $@"
        @$(CC) -o blkid ../../misc/blkid.o libblkid.a $(LIBUUID)
 
-check:: all tst_cache tst_devname tst_devno tst_getsize tst_probe \
- tst_read tst_resolve tst_save
+check:: all tst_cache tst_dev tst_devname tst_devno tst_getsize tst_probe \
+ tst_read tst_resolve tst_save tst_tag
 
 blkid.pc: $(srcdir)/blkid.pc.in $(top_builddir)/config.status
        @echo " CONFIG.STATUS $@"
index 2bfee7c..84be589 100644 (file)
@@ -55,6 +55,8 @@ extern int blkid_get_cache(blkid_cache *cache, const char *filename);
 extern const char *blkid_dev_devname(blkid_dev dev);
 
 extern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache);
+extern int blkid_dev_set_search(blkid_dev_iterate iter,
+                               char *search_type, char *search_value);
 extern int blkid_dev_next(blkid_dev_iterate iterate, blkid_dev *dev);
 extern void blkid_dev_iterate_end(blkid_dev_iterate iterate);
 
@@ -86,7 +88,8 @@ extern blkid_tag_iterate blkid_tag_iterate_begin(blkid_dev dev);
 extern int blkid_tag_next(blkid_tag_iterate iterate,
                              const char **type, const char **value);
 extern void blkid_tag_iterate_end(blkid_tag_iterate iterate);
-
+extern int blkid_dev_has_tag(blkid_dev dev, const char *type, 
+                            const char *value);
 extern blkid_dev blkid_find_dev_with_tag(blkid_cache cache,
                                         const char *type,
                                         const char *value);
index 23af887..081bedf 100644 (file)
@@ -77,6 +77,8 @@ extern const char *blkid_dev_devname(blkid_dev dev)
 struct blkid_struct_dev_iterate {
        int                     magic;
        blkid_cache             cache;
+       char                    *search_type;
+       char                    *search_value;
        struct list_head        *p;
 };
 
@@ -89,23 +91,62 @@ extern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache)
                iter->magic = DEV_ITERATE_MAGIC;
                iter->cache = cache;
                iter->p = cache->bic_devs.next;
+               iter->search_type = 0;
+               iter->search_value = 0;
        }
        return (iter);
 }
 
+extern int blkid_dev_set_search(blkid_dev_iterate iter,
+                                char *search_type, char *search_value)
+{
+       char *new_type, *new_value;
+
+       if (!iter || iter->magic != DEV_ITERATE_MAGIC || !search_type || 
+           !search_value)
+               return -1;
+       new_type = malloc(strlen(search_type)+1);
+       new_value = malloc(strlen(search_value)+1);
+       if (!new_type || !new_value) {
+               if (new_type)
+                       free(new_type);
+               if (new_value)
+                       free(new_value);
+               return -1;
+       }
+       strcpy(new_type, search_type);
+       strcpy(new_value, search_value);
+       if (iter->search_type)
+               free(iter->search_type);
+       if (iter->search_value)
+               free(iter->search_value);
+       iter->search_type = new_type;
+       iter->search_value = new_value;
+       return 0;
+}
+
 /*
  * Return 0 on success, -1 on error
  */
 extern int blkid_dev_next(blkid_dev_iterate iter,
-                         blkid_dev *dev)
+                         blkid_dev *ret_dev)
 {
-       *dev = 0;
-       if (!iter || iter->magic != DEV_ITERATE_MAGIC ||
-           iter->p == &iter->cache->bic_devs)
+       blkid_dev               dev;
+
+       *ret_dev = 0;
+       if (!iter || iter->magic != DEV_ITERATE_MAGIC)
                return -1;
-       *dev = list_entry(iter->p, struct blkid_struct_dev, bid_devs);
-       iter->p = iter->p->next;
-       return 0;
+       while (iter->p != &iter->cache->bic_devs) {
+               dev = list_entry(iter->p, struct blkid_struct_dev, bid_devs);
+               iter->p = iter->p->next;
+               if (iter->search_type && 
+                   !blkid_dev_has_tag(dev, iter->search_type, 
+                                      iter->search_value))
+                       continue;
+               *ret_dev = dev;
+               return 0;
+       }
+       return -1;
 }
 
 extern void blkid_dev_iterate_end(blkid_dev_iterate iter)
@@ -116,3 +157,72 @@ extern void blkid_dev_iterate_end(blkid_dev_iterate iter)
        free(iter);
 }
 
+#ifdef TEST_PROGRAM
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+extern char *optarg;
+extern int optind;
+#endif
+
+void usage(char *prog)
+{
+       fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask]\n", prog);
+       fprintf(stderr, "\tList all devices and exit\n", prog);
+       exit(1);
+}
+
+int main(int argc, char **argv)
+{
+       blkid_dev_iterate       iter;
+       blkid_cache             cache = NULL;
+       blkid_dev               dev;
+       int                     c, ret;
+       char                    *tmp;
+       char                    *file = NULL;
+       char                    *search_type = NULL;
+       char                    *search_value = NULL;
+
+       while ((c = getopt (argc, argv, "m:f:")) != EOF)
+               switch (c) {
+               case 'f':
+                       file = optarg;
+                       break;
+               case 'm':
+                       blkid_debug_mask = strtoul (optarg, &tmp, 0);
+                       if (*tmp) {
+                               fprintf(stderr, "Invalid debug mask: %d\n", 
+                                       optarg);
+                               exit(1);
+                       }
+                       break;
+               case '?':
+                       usage(argv[0]);
+               }
+       if (argc >= optind+2) {
+               search_type = argv[optind];
+               search_value = argv[optind+1];
+               optind += 2;
+       }
+       if (argc != optind)
+               usage(argv[0]);
+
+       if ((ret = blkid_get_cache(&cache, file)) != 0) {
+               fprintf(stderr, "%s: error creating cache (%d)\n",
+                       argv[0], ret);
+               exit(1);
+       }
+
+       iter = blkid_dev_iterate_begin(cache);
+       if (search_type)
+               blkid_dev_set_search(iter, search_type, search_value);
+       while (blkid_dev_next(iter, &dev) == 0) {
+               printf("Device: %s\n", blkid_dev_devname(dev));
+       }
+       blkid_dev_iterate_end(iter);
+
+
+       blkid_put_cache(cache);
+       return (0);
+}
+#endif
index 63e5e7b..e3df150 100644 (file)
@@ -70,6 +70,22 @@ blkid_tag blkid_find_tag_dev(blkid_dev dev, const char *type)
        return NULL;
 }
 
+extern int blkid_dev_has_tag(blkid_dev dev, const char *type, 
+                            const char *value)
+{
+       blkid_tag               tag;
+
+       if (!dev || !type || !value)
+               return -1;
+
+       tag = blkid_find_tag_dev(dev, type);
+       if (!value)
+               return(tag != NULL);
+       if (!tag || strcmp(tag->bit_val, value))
+               return 0;
+       return 1;
+}
+
 /*
  * Find the desired tag type in the cache.
  * We return the head tag for this tag type.
@@ -338,3 +354,90 @@ try_again:
        }
        return dev;
 }
+
+#ifdef TEST_PROGRAM
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+extern char *optarg;
+extern int optind;
+#endif
+
+void usage(char *prog)
+{
+       fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask] device "
+               "[type value]\n", 
+               prog);
+       fprintf(stderr, "\tList all tags for a device and exit\n", prog);
+       exit(1);
+}
+
+int main(int argc, char **argv)
+{
+       blkid_tag_iterate       iter;
+       blkid_cache             cache = NULL;
+       blkid_dev               dev;
+       int                     c, ret, found;
+       int                     flags = BLKID_DEV_FIND;
+       char                    *tmp;
+       char                    *file = NULL;
+       char                    *devname = NULL;
+       char                    *search_type = NULL;
+       char                    *search_value = NULL;
+       const char              *type, *value;
+
+       while ((c = getopt (argc, argv, "m:f:")) != EOF)
+               switch (c) {
+               case 'f':
+                       file = optarg;
+                       break;
+               case 'm':
+                       blkid_debug_mask = strtoul (optarg, &tmp, 0);
+                       if (*tmp) {
+                               fprintf(stderr, "Invalid debug mask: %d\n", 
+                                       optarg);
+                               exit(1);
+                       }
+                       break;
+               case '?':
+                       usage(argv[0]);
+               }
+       if (argc > optind)
+               devname = argv[optind++];
+       if (argc > optind)
+               search_type = argv[optind++];
+       if (argc > optind)
+               search_value = argv[optind++];
+       if (!devname || (argc != optind))
+               usage(argv[0]);
+
+       if ((ret = blkid_get_cache(&cache, file)) != 0) {
+               fprintf(stderr, "%s: error creating cache (%d)\n",
+                       argv[0], ret);
+               exit(1);
+       }
+
+       dev = blkid_get_dev(cache, devname, flags);
+       if (!dev) {
+               fprintf(stderr, "%s: Can not find device in blkid cache\n");
+               exit(1);
+       }
+       if (search_type) {
+               found = blkid_dev_has_tag(dev, search_type, search_value);
+               printf("Device %s: (%s, %s) %s\n", blkid_dev_devname(dev),
+                      search_type, search_value ? search_value : "NULL", 
+                      found ? "FOUND" : "NOT FOUND");
+               return(!found);
+       }
+       printf("Device %s...\n", blkid_dev_devname(dev));
+
+       iter = blkid_tag_iterate_begin(dev);
+       while (blkid_tag_next(iter, &type, &value) == 0) {
+               printf("\tTag %s has value %s\n", type, value);
+       }
+       blkid_tag_iterate_end(iter);
+
+       blkid_put_cache(cache);
+       return (0);
+}
+#endif
index f9bac5d..b0b87f6 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-07  Theodore Ts'o  <tytso@mit.edu>
+
+       * blkid.c (main): Use the new functions blkid_dev_set_search() and
+               blkid_dev_has_tag().  Remove compare_search_type() since
+               it has been obseleted by blkid_dev_has_tag().
+
 2005-05-06  Theodore Ts'o  <tytso@mit.edu>
 
        * blkid.c (main): Use an int instead of an char to store the
index fcadac9..44dd7d6 100644 (file)
@@ -88,26 +88,6 @@ static void print_tags(blkid_dev dev, char *show[], int numtag, int output)
                printf("\n");
 }
 
-int compare_search_type(blkid_dev dev, const char *search_type, 
-                       const char *search_value)
-{
-       blkid_tag_iterate       tag_iter;
-       const char              *type, *value;
-       int                     found = 0;
-
-       tag_iter = blkid_tag_iterate_begin(dev);
-       while (blkid_tag_next(tag_iter, &type, &value) == 0) {
-               if (!strcmp(type, search_type) &&
-                   !strcmp(value, search_value)) {
-                       found++;
-                       break;
-               }
-       }
-       blkid_tag_iterate_end(tag_iter);
-
-       return found;
-}
-
 int main(int argc, char **argv)
 {
        blkid_cache cache = NULL;
@@ -200,14 +180,11 @@ int main(int argc, char **argv)
                blkid_probe_all(cache);
 
                iter = blkid_dev_iterate_begin(cache);
+               blkid_dev_set_search(iter, search_type, search_value);
                while (blkid_dev_next(iter, &dev) == 0) {
                        dev = blkid_verify(cache, dev);
                        if (!dev)
                                continue;
-                       if (search_type &&
-                           !compare_search_type(dev, search_type, 
-                                                search_value))
-                               continue;
                        print_tags(dev, show, numtag, output_format);
                        err = 0;
                }
@@ -218,9 +195,9 @@ int main(int argc, char **argv)
                                                  BLKID_DEV_NORMAL);
 
                if (dev) {
-                       if (search_type &&
-                           !compare_search_type(dev, search_type, 
-                                                search_value))
+                       if (search_type && 
+                           !blkid_dev_has_tag(dev, search_type, 
+                                              search_value))
                                continue;
                        print_tags(dev, show, numtag, output_format);
                        err = 0;