1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/*
2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * dev.c - allocation/initialization/free routines for dev
3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *
4e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Copyright (C) 2001 Andreas Dilger
550b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o * Copyright (C) 2003 Theodore Ts'o
6e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *
7e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %Begin-Header%
8e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * This file may be redistributed under the terms of the
9e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * GNU Lesser General Public License.
10e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %End-Header%
11e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o */
12e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
13e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <stdlib.h>
14e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <string.h>
15e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
167a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#include "blkidP.h"
17e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
187a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oblkid_dev blkid_new_dev(void)
19e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
207a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_dev dev;
21e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
227a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (!(dev = (blkid_dev) calloc(1, sizeof(struct blkid_struct_dev))))
23e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		return NULL;
24e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
25e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	INIT_LIST_HEAD(&dev->bid_devs);
26e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	INIT_LIST_HEAD(&dev->bid_tags);
27e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
28e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	return dev;
29e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
30e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
317a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ovoid blkid_free_dev(blkid_dev dev)
32e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
33e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	if (!dev)
34e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		return;
35e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
36f0a22d0fd3ec3f45b562af5afba8811f72b94a28Theodore Ts'o	DBG(DEBUG_DEV,
37bb47c2a4aff6ec6b9be7f30cd04cf7c858a84de4Theodore Ts'o	    printf("  freeing dev %s (%s)\n", dev->bid_name, dev->bid_type ?
38bb47c2a4aff6ec6b9be7f30cd04cf7c858a84de4Theodore Ts'o		   dev->bid_type : "(null)"));
3978c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	DBG(DEBUG_DEV, blkid_debug_dump_dev(dev));
40e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
41e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	list_del(&dev->bid_devs);
42e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	while (!list_empty(&dev->bid_tags)) {
437a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		blkid_tag tag = list_entry(dev->bid_tags.next,
447a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o					   struct blkid_struct_tag,
457a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o					   bit_tags);
46e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		blkid_free_tag(tag);
47e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	}
4845e338f5332a54295893dba2e32cc093d1316f60Jim Meyering	free(dev->bid_name);
49e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	free(dev);
50e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
51e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
52e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/*
537a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * Given a blkid device, return its name
547a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */
5598999c399d563c248728bf217467a788cb0c1aadTheodore Ts'oextern const char *blkid_dev_devname(blkid_dev dev)
567a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{
577a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	return dev->bid_name;
587a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o}
597a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
6078c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o#ifdef CONFIG_BLKID_DEBUG
6178c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'ovoid blkid_debug_dump_dev(blkid_dev dev)
6278c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o{
6378c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	struct list_head *p;
6478c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o
6578c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	if (!dev) {
6678c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o		printf("  dev: NULL\n");
6778c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o		return;
6878c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	}
6978c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o
7078c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	printf("  dev: name = %s\n", dev->bid_name);
7112a829dcdc57fb8ddc4887b07b40136288b6e7feMatthias Andree	printf("  dev: DEVNO=\"0x%0llx\"\n", (long long)dev->bid_devno);
7212a829dcdc57fb8ddc4887b07b40136288b6e7feMatthias Andree	printf("  dev: TIME=\"%ld\"\n", (long)dev->bid_time);
7378c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	printf("  dev: PRI=\"%d\"\n", dev->bid_pri);
7478c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	printf("  dev: flags = 0x%08X\n", dev->bid_flags);
7578c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o
7678c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	list_for_each(p, &dev->bid_tags) {
7778c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o		blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags);
7855080a7637172402c51eb4f2fb2b81870c04de3dTheodore Ts'o		if (tag)
79efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o			printf("    tag: %s=\"%s\"\n", tag->bit_name,
8055080a7637172402c51eb4f2fb2b81870c04de3dTheodore Ts'o			       tag->bit_val);
8155080a7637172402c51eb4f2fb2b81870c04de3dTheodore Ts'o		else
8255080a7637172402c51eb4f2fb2b81870c04de3dTheodore Ts'o			printf("    tag: NULL\n");
8378c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	}
8478c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o	printf("\n");
8578c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o}
8678c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o#endif
8778c7d0efae91cde1a992f69c1a0157b39e971670Theodore Ts'o
887a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/*
897a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * dev iteration routines for the public libblkid interface.
907a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o *
917a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * These routines do not expose the list.h implementation, which are a
927a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * contamination of the namespace, and which force us to reveal far, far
937a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * too much of our internal implemenation.  I'm not convinced I want
947a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * to keep list.h in the long term, anyway.  It's fine for kernel
957a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * programming, but performance is not the #1 priority for this
967a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * library, and I really don't like the tradeoff of type-safety for
977a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * performance for this application.  [tytso:20030125.2007EST]
987a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */
997a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
1007a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/*
1017a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * This series of functions iterate over all devices in a blkid cache
1027a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */
1037a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#define DEV_ITERATE_MAGIC	0x01a5284c
104efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o
1057a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ostruct blkid_struct_dev_iterate {
1067a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	int			magic;
1077a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_cache		cache;
108c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*search_type;
109c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*search_value;
1107a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	struct list_head	*p;
1117a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o};
1127a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
1137a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache)
1147a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{
1157a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_dev_iterate	iter;
1167a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
1177a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	iter = malloc(sizeof(struct blkid_struct_dev_iterate));
1187a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (iter) {
1197a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		iter->magic = DEV_ITERATE_MAGIC;
1207a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		iter->cache = cache;
1217a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		iter->p	= cache->bic_devs.next;
122c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		iter->search_type = 0;
123c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		iter->search_value = 0;
1247a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	}
1257a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	return (iter);
1267a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o}
1277a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
128c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'oextern int blkid_dev_set_search(blkid_dev_iterate iter,
129c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o				 char *search_type, char *search_value)
130c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o{
131c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char *new_type, *new_value;
132c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
133efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o	if (!iter || iter->magic != DEV_ITERATE_MAGIC || !search_type ||
134c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	    !search_value)
135c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		return -1;
136c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	new_type = malloc(strlen(search_type)+1);
137c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	new_value = malloc(strlen(search_value)+1);
138c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if (!new_type || !new_value) {
13945e338f5332a54295893dba2e32cc093d1316f60Jim Meyering		free(new_type);
14045e338f5332a54295893dba2e32cc093d1316f60Jim Meyering		free(new_value);
141c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		return -1;
142c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	}
143c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	strcpy(new_type, search_type);
144c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	strcpy(new_value, search_value);
14545e338f5332a54295893dba2e32cc093d1316f60Jim Meyering	free(iter->search_type);
14645e338f5332a54295893dba2e32cc093d1316f60Jim Meyering	free(iter->search_value);
147c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	iter->search_type = new_type;
148c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	iter->search_value = new_value;
149c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	return 0;
150c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o}
151c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
1527a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/*
1537a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * Return 0 on success, -1 on error
1547a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */
1557a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern int blkid_dev_next(blkid_dev_iterate iter,
156c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			  blkid_dev *ret_dev)
1577a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{
158c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_dev		dev;
159c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
160c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	*ret_dev = 0;
161c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if (!iter || iter->magic != DEV_ITERATE_MAGIC)
1627a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		return -1;
163c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	while (iter->p != &iter->cache->bic_devs) {
164c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		dev = list_entry(iter->p, struct blkid_struct_dev, bid_devs);
165c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		iter->p = iter->p->next;
166efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		if (iter->search_type &&
167efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o		    !blkid_dev_has_tag(dev, iter->search_type,
168c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o				       iter->search_value))
169c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			continue;
170c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		*ret_dev = dev;
171c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		return 0;
172c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	}
173c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	return -1;
1747a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o}
1757a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
1767a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern void blkid_dev_iterate_end(blkid_dev_iterate iter)
1777a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{
1787a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (!iter || iter->magic != DEV_ITERATE_MAGIC)
1797a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		return;
1807a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	iter->magic = 0;
1817a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	free(iter);
1827a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o}
1837a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
184c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#ifdef TEST_PROGRAM
185c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#ifdef HAVE_GETOPT_H
186c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#include <getopt.h>
187c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#else
188c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'oextern char *optarg;
189c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'oextern int optind;
190c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#endif
191c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
192c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'ovoid usage(char *prog)
193c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o{
194c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask]\n", prog);
19512a829dcdc57fb8ddc4887b07b40136288b6e7feMatthias Andree	fprintf(stderr, "\tList all devices and exit\n");
196c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	exit(1);
197c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o}
198c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
199c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'oint main(int argc, char **argv)
200c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o{
201c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_dev_iterate	iter;
202c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_cache 		cache = NULL;
203c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_dev		dev;
204c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	int			c, ret;
205c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*tmp;
206c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*file = NULL;
207c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*search_type = NULL;
208c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	char			*search_value = NULL;
209c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
210c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	while ((c = getopt (argc, argv, "m:f:")) != EOF)
211c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		switch (c) {
212c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		case 'f':
213c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			file = optarg;
214c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			break;
215c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		case 'm':
216c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			blkid_debug_mask = strtoul (optarg, &tmp, 0);
217c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			if (*tmp) {
218efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o				fprintf(stderr, "Invalid debug mask: %s\n",
219c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o					optarg);
220c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o				exit(1);
221c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			}
222c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			break;
223c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		case '?':
224c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			usage(argv[0]);
225c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		}
226c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if (argc >= optind+2) {
227c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		search_type = argv[optind];
228c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		search_value = argv[optind+1];
229c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		optind += 2;
230c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	}
231c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if (argc != optind)
232c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		usage(argv[0]);
233c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
234c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if ((ret = blkid_get_cache(&cache, file)) != 0) {
235c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		fprintf(stderr, "%s: error creating cache (%d)\n",
236c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o			argv[0], ret);
237c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		exit(1);
238c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	}
239c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
240c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	iter = blkid_dev_iterate_begin(cache);
241c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	if (search_type)
242c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		blkid_dev_set_search(iter, search_type, search_value);
243c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	while (blkid_dev_next(iter, &dev) == 0) {
244c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o		printf("Device: %s\n", blkid_dev_devname(dev));
245c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	}
246c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_dev_iterate_end(iter);
247c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
248c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o
249c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	blkid_put_cache(cache);
250c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o	return (0);
251c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o}
252c37543df2f58f454c29fece5997bd0e9d6ee7533Theodore Ts'o#endif
253