diff options
Diffstat (limited to 'e2fsprogs/blkid/cache.c')
-rw-r--r-- | e2fsprogs/blkid/cache.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/e2fsprogs/blkid/cache.c b/e2fsprogs/blkid/cache.c new file mode 100644 index 000000000..9bae6fb67 --- /dev/null +++ b/e2fsprogs/blkid/cache.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * cache.c - allocation/initialization/free routines for cache | ||
4 | * | ||
5 | * Copyright (C) 2001 Andreas Dilger | ||
6 | * Copyright (C) 2003 Theodore Ts'o | ||
7 | * | ||
8 | * %Begin-Header% | ||
9 | * This file may be redistributed under the terms of the | ||
10 | * GNU Lesser General Public License. | ||
11 | * %End-Header% | ||
12 | */ | ||
13 | |||
14 | #include <stdlib.h> | ||
15 | #include <string.h> | ||
16 | #include <unistd.h> | ||
17 | #include "blkidP.h" | ||
18 | |||
19 | int blkid_debug_mask = 0; | ||
20 | |||
21 | int blkid_get_cache(blkid_cache *ret_cache, const char *filename) | ||
22 | { | ||
23 | blkid_cache cache; | ||
24 | |||
25 | #ifdef CONFIG_BLKID_DEBUG | ||
26 | if (!(blkid_debug_mask & DEBUG_INIT)) { | ||
27 | char *dstr = getenv("BLKID_DEBUG"); | ||
28 | |||
29 | if (dstr) | ||
30 | blkid_debug_mask = strtoul(dstr, 0, 0); | ||
31 | blkid_debug_mask |= DEBUG_INIT; | ||
32 | } | ||
33 | #endif | ||
34 | |||
35 | DBG(DEBUG_CACHE, printf("creating blkid cache (using %s)\n", | ||
36 | filename ? filename : "default cache")); | ||
37 | |||
38 | if (!(cache = (blkid_cache) calloc(1, sizeof(struct blkid_struct_cache)))) | ||
39 | return -BLKID_ERR_MEM; | ||
40 | |||
41 | INIT_LIST_HEAD(&cache->bic_devs); | ||
42 | INIT_LIST_HEAD(&cache->bic_tags); | ||
43 | |||
44 | if (filename && !strlen(filename)) | ||
45 | filename = 0; | ||
46 | if (!filename && (getuid() == geteuid())) | ||
47 | filename = getenv("BLKID_FILE"); | ||
48 | if (!filename) | ||
49 | filename = BLKID_CACHE_FILE; | ||
50 | cache->bic_filename = blkid_strdup(filename); | ||
51 | |||
52 | blkid_read_cache(cache); | ||
53 | |||
54 | *ret_cache = cache; | ||
55 | return 0; | ||
56 | } | ||
57 | |||
58 | void blkid_put_cache(blkid_cache cache) | ||
59 | { | ||
60 | if (!cache) | ||
61 | return; | ||
62 | |||
63 | (void) blkid_flush_cache(cache); | ||
64 | |||
65 | DBG(DEBUG_CACHE, printf("freeing cache struct\n")); | ||
66 | |||
67 | /* DBG(DEBUG_CACHE, blkid_debug_dump_cache(cache)); */ | ||
68 | |||
69 | while (!list_empty(&cache->bic_devs)) { | ||
70 | blkid_dev dev = list_entry(cache->bic_devs.next, | ||
71 | struct blkid_struct_dev, | ||
72 | bid_devs); | ||
73 | blkid_free_dev(dev); | ||
74 | } | ||
75 | |||
76 | while (!list_empty(&cache->bic_tags)) { | ||
77 | blkid_tag tag = list_entry(cache->bic_tags.next, | ||
78 | struct blkid_struct_tag, | ||
79 | bit_tags); | ||
80 | |||
81 | while (!list_empty(&tag->bit_names)) { | ||
82 | blkid_tag bad = list_entry(tag->bit_names.next, | ||
83 | struct blkid_struct_tag, | ||
84 | bit_names); | ||
85 | |||
86 | DBG(DEBUG_CACHE, printf("warning: unfreed tag %s=%s\n", | ||
87 | bad->bit_name, bad->bit_val)); | ||
88 | blkid_free_tag(bad); | ||
89 | } | ||
90 | blkid_free_tag(tag); | ||
91 | } | ||
92 | free(cache->bic_filename); | ||
93 | |||
94 | free(cache); | ||
95 | } | ||
96 | |||
97 | #ifdef TEST_PROGRAM | ||
98 | int main(int argc, char** argv) | ||
99 | { | ||
100 | blkid_cache cache = NULL; | ||
101 | int ret; | ||
102 | |||
103 | blkid_debug_mask = DEBUG_ALL; | ||
104 | if ((argc > 2)) { | ||
105 | fprintf(stderr, "Usage: %s [filename]\n", argv[0]); | ||
106 | exit(1); | ||
107 | } | ||
108 | |||
109 | if ((ret = blkid_get_cache(&cache, argv[1])) < 0) { | ||
110 | fprintf(stderr, "error %d parsing cache file %s\n", ret, | ||
111 | argv[1] ? argv[1] : BLKID_CACHE_FILE); | ||
112 | exit(1); | ||
113 | } | ||
114 | if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) { | ||
115 | fprintf(stderr, "%s: error creating cache (%d)\n", | ||
116 | argv[0], ret); | ||
117 | exit(1); | ||
118 | } | ||
119 | if ((ret = blkid_probe_all(cache) < 0)) | ||
120 | fprintf(stderr, "error probing devices\n"); | ||
121 | |||
122 | blkid_put_cache(cache); | ||
123 | |||
124 | return ret; | ||
125 | } | ||
126 | #endif | ||