blkid.c revision 544349270e4c74a6feb971123884a8cf5052a7ee
1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/*
2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * blkid.c - User command-line interface for libblkid
3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *
4e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Copyright (C) 2001 Andreas Dilger
5e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o *
6e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %Begin-Header%
7e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * This file may be redistributed under the terms of the
8e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * GNU Lesser General Public License.
9e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * %End-Header%
10e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o */
11e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
12e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <stdio.h>
137a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#include <stdlib.h>
1448e6e81362f264aee4f3945c14928efaf71a06c9Theodore Ts'o#include <string.h>
15e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#ifdef HAVE_GETOPT_H
16e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <getopt.h>
17e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#else
18e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oextern char *optarg;
19e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oextern int optind;
20e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#endif
21e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
22e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include "blkid/blkid.h"
23e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
247a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oconst char *progname = "blkid";
257a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o
267a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ostatic void print_version(FILE *out)
27e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
28544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o	fprintf(out, "%s %s (%s)\n", progname, BLKID_VERSION, BLKID_DATE);
29e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
30e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
317a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ostatic void usage(int error)
32e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
33e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	FILE *out = error ? stderr : stdout;
34e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
35e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	print_version(out);
36e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	fprintf(out,
37e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"usage:\t%s [-c <file>] [-h] "
38e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"[-p] [-s <tag>] [-t <token>] [-v] [-w <file>] [dev ...]\n"
39e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-c\tcache file (default: /etc/blkid.tab, /dev/null = none)\n"
40e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-h\tprint this usage message and exit\n"
41e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-s\tshow specified tag(s) (default show all tags)\n"
42e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-t\tfind device with a specific token (NAME=value pair)\n"
43e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-v\tprint version and exit\n"
44e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\t-w\twrite cache to different file (/dev/null = no write)\n"
45e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		"\tdev\tspecify device(s) to probe (default: all devices)\n",
46e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		progname);
47e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	exit(error);
48e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
49e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
507a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ostatic void print_tags(blkid_dev dev, char *show[], int numtag)
51e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
527a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_tag_iterate	iter;
537a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	const char		*type, *value;
54ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o	int 			i, first = 1;
55e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
56e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	if (!dev)
57e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		return;
58e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
597a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	iter = blkid_tag_iterate_begin(dev);
607a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	while (blkid_tag_next(iter, &type, &value) == 0) {
617a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		if (numtag && show) {
627a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			for (i=0; i < numtag; i++)
637a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o				if (!strcmp(type, show[i]))
647a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o					break;
657a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			if (i >= numtag)
667a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o				continue;
677a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		}
687a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		if (first) {
6998999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o			printf("%s: ", blkid_dev_devname(dev));
707a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			first = 0;
71e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		}
727a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		printf("%s=\"%s\" ", type, value);
73e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	}
747a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_tag_iterate_end(iter);
75e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
767a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (!first)
77e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		printf("\n");
78e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
79e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
80e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oint main(int argc, char **argv)
81e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{
827a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	blkid_cache cache = NULL;
83e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	char *devices[128] = { NULL, };
84e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	char *show[128] = { NULL, };
857a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	char *search_type = NULL, *search_value = NULL;
86e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	char *read = NULL;
87e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	char *write = NULL;
88544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o	unsigned int numdev = 0, numtag = 0;
89e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	int version = 0;
90e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	int err = 4;
91544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o	unsigned int i;
92e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	char c;
93e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
94ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o	while ((c = getopt (argc, argv, "c:f:hps:t:w:v")) != EOF)
95e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		switch (c) {
96e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 'c':
97e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			if (optarg && !*optarg)
98e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				read = NULL;
99e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			else
100e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				read = optarg;
101e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			if (!write)
102e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				write = read;
103e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			break;
104e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 's':
105e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			if (numtag >= sizeof(show) / sizeof(*show)) {
106e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				fprintf(stderr, "Too many tags specified\n");
107e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				usage(err);
108e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			}
109e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			show[numtag++] = optarg;
110e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			break;
111e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 't':
1127a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			if (search_type) {
113e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				fprintf(stderr, "Can only search for "
114e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o						"one NAME=value pair\n");
115e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				usage(err);
116e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			}
1177a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			if (blkid_parse_tag_string(optarg,
1187a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o						   &search_type,
1197a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o						   &search_value)) {
120e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				fprintf(stderr, "-t needs NAME=value pair\n");
121e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				usage(err);
122e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			}
123e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			break;
124e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 'v':
125e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			version = 1;
126e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			break;
127e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 'w':
128e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			if (optarg && !*optarg)
129e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				write = NULL;
130e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			else
131e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o				write = optarg;
132e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			break;
133e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		case 'h':
134e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			err = 0;
135e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		default:
136e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			usage(err);
137e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		}
138e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
139e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	while (optind < argc)
140e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		devices[numdev++] = argv[optind++];
141e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
142e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	if (version) {
143e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		print_version(stdout);
144e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		goto exit;
145e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	}
146e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
14750b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o	if (blkid_get_cache(&cache, read) < 0)
148e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		goto exit;
149e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
150e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	err = 2;
151e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	/* If looking for a specific NAME=value pair, print only that */
1527a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (search_type) {
1537a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		blkid_dev dev;
154e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
155e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		/* Load any additional devices not in the cache */
156e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		for (i = 0; i < numdev; i++)
15798999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o			blkid_get_dev(cache, devices[i], BLKID_DEV_NORMAL);
158e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
1597a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		if ((dev = blkid_find_dev_with_tag(cache, search_type,
1607a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o						   search_value))) {
1617a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o			print_tags(dev, show, numtag);
162e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			err = 0;
163e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		}
164e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	/* If we didn't specify a single device, show all available devices */
165e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	} else if (!numdev) {
1667a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		blkid_dev_iterate	iter;
1677a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		blkid_dev		dev;
168e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
16950b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o		blkid_probe_all(cache);
170e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
1717a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		iter = blkid_dev_iterate_begin(cache);
1727a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		while (blkid_dev_next(iter, &dev) == 0) {
173e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			print_tags(dev, show, numtag);
174e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			err = 0;
175e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		}
1767a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		blkid_dev_iterate_end(iter);
177e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	/* Add all specified devices to cache (optionally display tags) */
178e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	} else for (i = 0; i < numdev; i++) {
17998999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o		blkid_dev dev = blkid_get_dev(cache, devices[i],
18050b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o						  BLKID_DEV_NORMAL);
181e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
182e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		if (dev) {
183e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			print_tags(dev, show, numtag);
184e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o			err = 0;
185e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o		}
186e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	}
187e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o
188e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oexit:
1897a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (search_type)
1907a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		free(search_type);
1917a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o	if (search_value)
1927a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o		free(search_value);
19350b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o	blkid_put_cache(cache);
194e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o	return err;
195e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o}
196