From c37543df2f58f454c29fece5997bd0e9d6ee7533 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 7 May 2005 13:32:47 -0400 Subject: [PATCH] Add new two new functions to the blkid library: blkid_dev_set_search(), and blkid_dev_has_tag(), and change the blkid program to take advantage of these functions. --- lib/blkid/ChangeLog | 11 +++++ lib/blkid/Makefile.in | 8 +++- lib/blkid/blkid.h | 5 +- lib/blkid/dev.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++--- lib/blkid/tag.c | 103 +++++++++++++++++++++++++++++++++++++++++ misc/ChangeLog | 6 +++ misc/blkid.c | 31 ++----------- 7 files changed, 251 insertions(+), 37 deletions(-) diff --git a/lib/blkid/ChangeLog b/lib/blkid/ChangeLog index 1f9083f..f558da8 100644 --- a/lib/blkid/ChangeLog +++ b/lib/blkid/ChangeLog @@ -1,3 +1,14 @@ +2005-05-07 Theodore Ts'o + + * 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 * probe.c (probe_cramfs), probe.h: Fix magic number recognition diff --git a/lib/blkid/Makefile.in b/lib/blkid/Makefile.in index d01cedb..9f7cffb 100644 --- a/lib/blkid/Makefile.in +++ b/lib/blkid/Makefile.in @@ -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 $@" diff --git a/lib/blkid/blkid.h b/lib/blkid/blkid.h index 2bfee7c..84be589 100644 --- a/lib/blkid/blkid.h +++ b/lib/blkid/blkid.h @@ -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); diff --git a/lib/blkid/dev.c b/lib/blkid/dev.c index 23af887..081bedf 100644 --- a/lib/blkid/dev.c +++ b/lib/blkid/dev.c @@ -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 +#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 diff --git a/lib/blkid/tag.c b/lib/blkid/tag.c index 63e5e7b..e3df150 100644 --- a/lib/blkid/tag.c +++ b/lib/blkid/tag.c @@ -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 +#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 diff --git a/misc/ChangeLog b/misc/ChangeLog index f9bac5d..b0b87f6 100644 --- a/misc/ChangeLog +++ b/misc/ChangeLog @@ -1,3 +1,9 @@ +2005-05-07 Theodore Ts'o + + * 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 * blkid.c (main): Use an int instead of an char to store the diff --git a/misc/blkid.c b/misc/blkid.c index fcadac9..44dd7d6 100644 --- a/misc/blkid.c +++ b/misc/blkid.c @@ -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; -- 1.8.3.1