1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * resolve.c - resolve names and tags into specific devices 3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * 450b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o * Copyright (C) 2001, 2003 Theodore Ts'o. 5e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Copyright (C) 2001 Andreas Dilger 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 <stdio.h> 14e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#if HAVE_UNISTD_H 15e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <unistd.h> 16e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#endif 1776b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o#include <stdlib.h> 18e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <fcntl.h> 19e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <string.h> 20e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <sys/types.h> 21e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <sys/stat.h> 227a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#include "blkidP.h" 23e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 24e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 25e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Find a tagname (e.g. LABEL or UUID) on a specific device. 26e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o */ 271549a44762df6e938306efc1f41826d4ea7f0d38Theodore Ts'ochar *blkid_get_tag_value(blkid_cache cache, const char *tagname, 281549a44762df6e938306efc1f41826d4ea7f0d38Theodore Ts'o const char *devname) 29e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 3076b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o blkid_tag found; 317a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_dev dev; 32ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o blkid_cache c = cache; 33e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *ret = NULL; 34e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 35f0a22d0fd3ec3f45b562af5afba8811f72b94a28Theodore Ts'o DBG(DEBUG_RESOLVE, printf("looking for %s on %s\n", tagname, devname)); 36e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 37e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!devname) 38e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return NULL; 39e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 40ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o if (!cache) { 41ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o if (blkid_get_cache(&c, NULL) < 0) 42ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o return NULL; 43ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o } 44ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o 45ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o if ((dev = blkid_get_dev(c, devname, BLKID_DEV_NORMAL)) && 4650b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o (found = blkid_find_tag_dev(dev, tagname))) 4750b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o ret = blkid_strdup(found->bit_val); 48e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 49e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!cache) 50ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o blkid_put_cache(c); 51e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 52e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return ret; 53e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 54e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 55e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 56e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Locate a device name from a token (NAME=value string), or (name, value) 57e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * pair. In the case of a token, value is ignored. If the "token" is not 58e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * of the form "NAME=value" and there is no value given, then it is assumed 59e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * to be the actual devname and a copy is returned. 60e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o */ 6198999c399d563c248728bf217467a788cb0c1aadTheodore Ts'ochar *blkid_get_devname(blkid_cache cache, const char *token, 6298999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o const char *value) 63e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 6476b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o blkid_dev dev; 657a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_cache c = cache; 6676b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o char *t = 0, *v = 0; 6776b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o char *ret = NULL; 68e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 6976b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o if (!token) 7076b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o return NULL; 71efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 72e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!cache) { 7350b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o if (blkid_get_cache(&c, NULL) < 0) 74e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return NULL; 75e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 76e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 77ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o DBG(DEBUG_RESOLVE, 78ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o printf("looking for %s%s%s %s\n", token, value ? "=" : "", 79ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o value ? value : "", cache ? "in cache" : "from disk")); 80ed1b33e8fb310641684d68a177c940b58f2f529dTheodore Ts'o 8176b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o if (!value) { 825f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o if (!strchr(token, '=')) { 835f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o ret = blkid_strdup(token); 845f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o goto out; 855f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o } 8676b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o blkid_parse_tag_string(token, &t, &v); 8776b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o if (!t || !v) 885f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o goto out; 8976b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o token = t; 9076b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o value = v; 9176b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o } 9276b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o 9376b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o dev = blkid_find_dev_with_tag(c, token, value); 9476b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o if (!dev) 955f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'o goto out; 96e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 9798999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o ret = blkid_strdup(blkid_dev_devname(dev)); 9876b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o 995f7fe7fe0e96965b9cb4f6d1e2fa08acc175d7beTheodore Ts'oout: 10045e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free(t); 10145e338f5332a54295893dba2e32cc093d1316f60Jim Meyering free(v); 102e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!cache) { 10350b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o blkid_put_cache(c); 104e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 10576b07bb1bc9cbcb70a94cb235954eaac993920adTheodore Ts'o return (ret); 106e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 107e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 108e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#ifdef TEST_PROGRAM 109e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'oint main(int argc, char **argv) 110e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 111e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o char *value; 112ce72b862c59da24ba16b354d687549276a24f908Theodore Ts'o blkid_cache cache; 113e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 114f0a22d0fd3ec3f45b562af5afba8811f72b94a28Theodore Ts'o blkid_debug_mask = DEBUG_ALL; 115e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (argc != 2 && argc != 3) { 116e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o fprintf(stderr, "Usage:\t%s tagname=value\n" 117e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "\t%s tagname devname\n" 118e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "Find which device holds a given token or\n" 119e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o "Find what the value of a tag is in a device\n", 120e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o argv[0], argv[0]); 121e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o exit(1); 122e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 12379dd234a799434b6dc8365c49e743f00eb09d2fdTheodore Ts'o if (blkid_get_cache(&cache, "/dev/null") < 0) { 124ce72b862c59da24ba16b354d687549276a24f908Theodore Ts'o fprintf(stderr, "Couldn't get blkid cache\n"); 125ce72b862c59da24ba16b354d687549276a24f908Theodore Ts'o exit(1); 126ce72b862c59da24ba16b354d687549276a24f908Theodore Ts'o } 127efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 128e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (argv[2]) { 12928595220024d4a5e8726d0288030341c809a5fbcTheodore Ts'o value = blkid_get_tag_value(cache, argv[1], argv[2]); 130e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o printf("%s has tag %s=%s\n", argv[2], argv[1], 131e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o value ? value : "<missing>"); 132e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } else { 13398999c399d563c248728bf217467a788cb0c1aadTheodore Ts'o value = blkid_get_devname(cache, argv[1], NULL); 134e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o printf("%s has tag %s\n", value ? value : "<none>", argv[1]); 135e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 136ce72b862c59da24ba16b354d687549276a24f908Theodore Ts'o blkid_put_cache(cache); 137e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return value ? 0 : 1; 138e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 139e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#endif 140