busybox/e2fsprogs/old_e2fsprogs/blkid/cache.c
<<
>>
Prefs
   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
  19int blkid_debug_mask = 0;
  20
  21int 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        cache = xzalloc(sizeof(struct blkid_struct_cache));
  39
  40        INIT_LIST_HEAD(&cache->bic_devs);
  41        INIT_LIST_HEAD(&cache->bic_tags);
  42
  43        if (filename && !strlen(filename))
  44                filename = 0;
  45        if (!filename && (getuid() == geteuid()))
  46                filename = getenv("BLKID_FILE");
  47        if (!filename)
  48                filename = BLKID_CACHE_FILE;
  49        cache->bic_filename = blkid_strdup(filename);
  50
  51        blkid_read_cache(cache);
  52
  53        *ret_cache = cache;
  54        return 0;
  55}
  56
  57void blkid_put_cache(blkid_cache cache)
  58{
  59        if (!cache)
  60                return;
  61
  62        (void) blkid_flush_cache(cache);
  63
  64        DBG(DEBUG_CACHE, printf("freeing cache struct\n"));
  65
  66        /* DBG(DEBUG_CACHE, blkid_debug_dump_cache(cache)); */
  67
  68        while (!list_empty(&cache->bic_devs)) {
  69                blkid_dev dev = list_entry(cache->bic_devs.next,
  70                                           struct blkid_struct_dev,
  71                                            bid_devs);
  72                blkid_free_dev(dev);
  73        }
  74
  75        while (!list_empty(&cache->bic_tags)) {
  76                blkid_tag tag = list_entry(cache->bic_tags.next,
  77                                           struct blkid_struct_tag,
  78                                           bit_tags);
  79
  80                while (!list_empty(&tag->bit_names)) {
  81                        blkid_tag bad = list_entry(tag->bit_names.next,
  82                                                   struct blkid_struct_tag,
  83                                                   bit_names);
  84
  85                        DBG(DEBUG_CACHE, printf("warning: unfreed tag %s=%s\n",
  86                                                bad->bit_name, bad->bit_val));
  87                        blkid_free_tag(bad);
  88                }
  89                blkid_free_tag(tag);
  90        }
  91        free(cache->bic_filename);
  92
  93        free(cache);
  94}
  95
  96#ifdef TEST_PROGRAM
  97int main(int argc, char** argv)
  98{
  99        blkid_cache cache = NULL;
 100        int ret;
 101
 102        blkid_debug_mask = DEBUG_ALL;
 103        if ((argc > 2)) {
 104                fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
 105                exit(1);
 106        }
 107
 108        if ((ret = blkid_get_cache(&cache, argv[1])) < 0) {
 109                fprintf(stderr, "error %d parsing cache file %s\n", ret,
 110                        argv[1] ? argv[1] : BLKID_CACHE_FILE);
 111                exit(1);
 112        }
 113        if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) {
 114                fprintf(stderr, "%s: error creating cache (%d)\n",
 115                        argv[0], ret);
 116                exit(1);
 117        }
 118        if ((ret = blkid_probe_all(cache) < 0))
 119                fprintf(stderr, "error probing devices\n");
 120
 121        blkid_put_cache(cache);
 122
 123        return ret;
 124}
 125#endif
 126