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