+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
@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 \
@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 $@"
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);
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);
struct blkid_struct_dev_iterate {
int magic;
blkid_cache cache;
+ char *search_type;
+ char *search_value;
struct list_head *p;
};
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)
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
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.
}
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
+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
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;
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;
}
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;