blob: 62764c7d0845de5be26ee6fb8a9558af5f154b64 [file] [log] [blame]
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -05001/*
2 * resolve.c - resolve names and tags into specific devices
3 *
Theodore Ts'o50b380b2003-02-12 23:51:21 -05004 * Copyright (C) 2001, 2003 Theodore Ts'o.
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -05005 * Copyright (C) 2001 Andreas Dilger
6 *
7 * %Begin-Header%
8 * This file may be redistributed under the terms of the
9 * GNU Lesser General Public License.
10 * %End-Header%
11 */
12
13#include <stdio.h>
14#if HAVE_UNISTD_H
15#include <unistd.h>
16#endif
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050017#include <stdlib.h>
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050018#include <fcntl.h>
19#include <string.h>
20#include <sys/types.h>
21#include <sys/stat.h>
Theodore Ts'o7a603aa2003-01-26 01:54:39 -050022#include "blkidP.h"
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050023#include "probe.h"
24
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050025/*
26 * Find a tagname (e.g. LABEL or UUID) on a specific device.
27 */
Theodore Ts'o7a603aa2003-01-26 01:54:39 -050028char *blkid_get_tagname_devname(blkid_cache cache, const char *tagname,
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050029 const char *devname)
30{
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050031 blkid_tag found;
Theodore Ts'o7a603aa2003-01-26 01:54:39 -050032 blkid_dev dev;
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050033 char *ret = NULL;
34
Theodore Ts'of0a22d02003-02-22 13:19:53 -050035 DBG(DEBUG_RESOLVE, printf("looking for %s on %s\n", tagname, devname));
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050036
37 if (!devname)
38 return NULL;
39
Theodore Ts'o98999c32003-02-16 00:47:07 -050040 if ((dev = blkid_get_dev(cache, devname, BLKID_DEV_NORMAL)) &&
Theodore Ts'o50b380b2003-02-12 23:51:21 -050041 (found = blkid_find_tag_dev(dev, tagname)))
42 ret = blkid_strdup(found->bit_val);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050043
44 if (!cache)
45 blkid_free_dev(dev);
46
47 return ret;
48}
49
50/*
51 * Locate a device name from a token (NAME=value string), or (name, value)
52 * pair. In the case of a token, value is ignored. If the "token" is not
53 * of the form "NAME=value" and there is no value given, then it is assumed
54 * to be the actual devname and a copy is returned.
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050055 */
Theodore Ts'o98999c32003-02-16 00:47:07 -050056char *blkid_get_devname(blkid_cache cache, const char *token,
57 const char *value)
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050058{
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050059 blkid_dev dev;
Theodore Ts'o7a603aa2003-01-26 01:54:39 -050060 blkid_cache c = cache;
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050061 char *t = 0, *v = 0;
62 char *ret = NULL;
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050063
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050064 if (!token)
65 return NULL;
66
Theodore Ts'of0a22d02003-02-22 13:19:53 -050067 DBG(DEBUG_RESOLVE,
68 printf("looking for %s%c%s %s\n", token, value ? '=' : ' ',
Theodore Ts'od3f91792003-01-25 00:26:48 -050069 value ? value : "", cache ? "in cache" : "from disk"));
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050070
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050071 if (!cache) {
Theodore Ts'o50b380b2003-02-12 23:51:21 -050072 if (blkid_get_cache(&c, NULL) < 0)
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050073 return NULL;
74 }
75
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050076 if (!value) {
77 blkid_parse_tag_string(token, &t, &v);
78 if (!t || !v)
79 goto errout;
80 token = t;
81 value = v;
82 }
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050083
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050084 dev = blkid_find_dev_with_tag(c, token, value);
85 if (!dev)
86 goto errout;
87
Theodore Ts'o98999c32003-02-16 00:47:07 -050088 ret = blkid_strdup(blkid_dev_devname(dev));
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050089
90errout:
91 if (t)
92 free(t);
93 if (v)
94 free(v);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050095 if (!cache) {
Theodore Ts'o50b380b2003-02-12 23:51:21 -050096 blkid_put_cache(c);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050097 }
Theodore Ts'o76b07bb2003-01-27 01:09:24 -050098 return (ret);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -050099}
100
101#ifdef TEST_PROGRAM
102int main(int argc, char **argv)
103{
104 char *value;
Theodore Ts'oce72b862003-02-14 01:31:45 -0500105 blkid_cache cache;
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500106
Theodore Ts'of0a22d02003-02-22 13:19:53 -0500107 blkid_debug_mask = DEBUG_ALL;
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500108 if (argc != 2 && argc != 3) {
109 fprintf(stderr, "Usage:\t%s tagname=value\n"
110 "\t%s tagname devname\n"
111 "Find which device holds a given token or\n"
112 "Find what the value of a tag is in a device\n",
113 argv[0], argv[0]);
114 exit(1);
115 }
Theodore Ts'o79dd2342003-02-22 17:15:20 -0500116 if (blkid_get_cache(&cache, "/dev/null") < 0) {
Theodore Ts'oce72b862003-02-14 01:31:45 -0500117 fprintf(stderr, "Couldn't get blkid cache\n");
118 exit(1);
119 }
120
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500121 if (argv[2]) {
Theodore Ts'oce72b862003-02-14 01:31:45 -0500122 value = blkid_get_tagname_devname(cache, argv[1], argv[2]);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500123 printf("%s has tag %s=%s\n", argv[2], argv[1],
124 value ? value : "<missing>");
125 } else {
Theodore Ts'o98999c32003-02-16 00:47:07 -0500126 value = blkid_get_devname(cache, argv[1], NULL);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500127 printf("%s has tag %s\n", value ? value : "<none>", argv[1]);
128 }
Theodore Ts'oce72b862003-02-14 01:31:45 -0500129 blkid_put_cache(cache);
Theodore Ts'oe12f2ae2003-01-23 16:45:16 -0500130 return value ? 0 : 1;
131}
132#endif