~ubuntu-branches/ubuntu/precise/util-linux/precise

« back to all changes in this revision

Viewing changes to libblkid/src/resolve.c

  • Committer: Package Import Robot
  • Author(s): Steve Langasek
  • Date: 2011-12-16 22:53:42 UTC
  • mfrom: (1.6.4) (4.5.5 sid)
  • Revision ID: package-import@ubuntu.com-20111216225342-206wz4bhvutyvx0d
Tags: 2.20.1-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Build for multiarch.
  - Add pre-depends on multiarch-support.
  - configure.ac: don't try to be clever about extracting a path name from
    $libdir to append to /usr in a way that's not overridable; instead,
    reuse the built-in configurable libexecdir.
  - Fix up the .pc.in files to know about libexecdir, so our substitutions
    don't leave us with unusable pkg-config files.
  - Install custom blkid.conf to use /dev/.blkid.tab since we don't
    expect device names to survive a reboot
  - Mention mountall(8) in fstab(5) manpages, along with its special
    options.
  - Since upstart is required in Ubuntu, the hwclock.sh init script is not
    called on startup and the hwclockfirst.sh init script is removed.
  - Drop depends on initscripts for the above.
  - Replace hwclock udev rule with an Upstart job.
  - For the case where mount is called with a directory to mount, look
    that directory up in mountall's /lib/init/fstab if we couldn't find
    it mentioned anywhere else.  This means "mount /proc", "mount /sys",
    etc. work.
  - mount.8 points to the cifs-utils package, not the obsolete smbfs one. 
  - Use canonicalize_spec in getmntdevbackward. proc should not be
    interpreted as a non-canonical-path.
* Dropped changes, superseded upstream:
  - shlibs/mount/src/tab_update.c: don't refuse to update mtab when source
    is 'none'.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * resolve.c - resolve names and tags into specific devices
 
3
 *
 
4
 * Copyright (C) 2001, 2003 Theodore Ts'o.
 
5
 * 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
 
17
#include <stdlib.h>
 
18
#include <fcntl.h>
 
19
#include <string.h>
 
20
#include <sys/types.h>
 
21
#include <sys/stat.h>
 
22
#include "blkidP.h"
 
23
 
 
24
/*
 
25
 * Find a tagname (e.g. LABEL or UUID) on a specific device.
 
26
 */
 
27
char *blkid_get_tag_value(blkid_cache cache, const char *tagname,
 
28
                          const char *devname)
 
29
{
 
30
        blkid_tag found;
 
31
        blkid_dev dev;
 
32
        blkid_cache c = cache;
 
33
        char *ret = NULL;
 
34
 
 
35
        DBG(DEBUG_RESOLVE, printf("looking for %s on %s\n", tagname, devname));
 
36
 
 
37
        if (!devname)
 
38
                return NULL;
 
39
 
 
40
        if (!cache) {
 
41
                if (blkid_get_cache(&c, NULL) < 0)
 
42
                        return NULL;
 
43
        }
 
44
 
 
45
        if ((dev = blkid_get_dev(c, devname, BLKID_DEV_NORMAL)) &&
 
46
            (found = blkid_find_tag_dev(dev, tagname)))
 
47
                ret = blkid_strdup(found->bit_val);
 
48
 
 
49
        if (!cache)
 
50
                blkid_put_cache(c);
 
51
 
 
52
        return ret;
 
53
}
 
54
 
 
55
/*
 
56
 * Locate a device name from a token (NAME=value string), or (name, value)
 
57
 * pair.  In the case of a token, value is ignored.  If the "token" is not
 
58
 * of the form "NAME=value" and there is no value given, then it is assumed
 
59
 * to be the actual devname and a copy is returned.
 
60
 */
 
61
char *blkid_get_devname(blkid_cache cache, const char *token,
 
62
                        const char *value)
 
63
{
 
64
        blkid_dev dev;
 
65
        blkid_cache c = cache;
 
66
        char *t = 0, *v = 0;
 
67
        char *ret = NULL;
 
68
 
 
69
        if (!token)
 
70
                return NULL;
 
71
 
 
72
        if (!cache) {
 
73
                if (blkid_get_cache(&c, NULL) < 0)
 
74
                        return NULL;
 
75
        }
 
76
 
 
77
        DBG(DEBUG_RESOLVE,
 
78
            printf("looking for %s%s%s %s\n", token, value ? "=" : "",
 
79
                   value ? value : "", cache ? "in cache" : "from disk"));
 
80
 
 
81
        if (!value) {
 
82
                if (!strchr(token, '=')) {
 
83
                        ret = blkid_strdup(token);
 
84
                        goto out;
 
85
                }
 
86
                blkid_parse_tag_string(token, &t, &v);
 
87
                if (!t || !v)
 
88
                        goto out;
 
89
                token = t;
 
90
                value = v;
 
91
        }
 
92
 
 
93
        dev = blkid_find_dev_with_tag(c, token, value);
 
94
        if (!dev)
 
95
                goto out;
 
96
 
 
97
        ret = blkid_strdup(blkid_dev_devname(dev));
 
98
 
 
99
out:
 
100
        free(t);
 
101
        free(v);
 
102
        if (!cache) {
 
103
                blkid_put_cache(c);
 
104
        }
 
105
        return (ret);
 
106
}
 
107
 
 
108
#ifdef TEST_PROGRAM
 
109
int main(int argc, char **argv)
 
110
{
 
111
        char *value;
 
112
        blkid_cache cache;
 
113
 
 
114
        blkid_init_debug(DEBUG_ALL);
 
115
        if (argc != 2 && argc != 3) {
 
116
                fprintf(stderr, "Usage:\t%s tagname=value\n"
 
117
                        "\t%s tagname devname\n"
 
118
                        "Find which device holds a given token or\n"
 
119
                        "Find what the value of a tag is in a device\n",
 
120
                        argv[0], argv[0]);
 
121
                exit(1);
 
122
        }
 
123
        if (blkid_get_cache(&cache, "/dev/null") < 0) {
 
124
                fprintf(stderr, "Couldn't get blkid cache\n");
 
125
                exit(1);
 
126
        }
 
127
 
 
128
        if (argv[2]) {
 
129
                value = blkid_get_tag_value(cache, argv[1], argv[2]);
 
130
                printf("%s has tag %s=%s\n", argv[2], argv[1],
 
131
                       value ? value : "<missing>");
 
132
        } else {
 
133
                value = blkid_get_devname(cache, argv[1], NULL);
 
134
                printf("%s has tag %s\n", value ? value : "<none>", argv[1]);
 
135
        }
 
136
        blkid_put_cache(cache);
 
137
        return value ? 0 : 1;
 
138
}
 
139
#endif