dev.c revision 50b380b4d4ab668bad45033e3a8aaf93c7f42844
1e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 2e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * dev.c - allocation/initialization/free routines for dev 3e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * 4e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o * Copyright (C) 2001 Andreas Dilger 550b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o * Copyright (C) 2003 Theodore Ts'o 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 <stdlib.h> 14e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <string.h> 15e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 167a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#include "blkidP.h" 17e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 18e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#ifdef DEBUG_DEV 19e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#include <stdio.h> 20d3f917989badf78d1f97654e46d60d1f3d25cd17Theodore Ts'o#define DBG(x) x 21e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#else 22d3f917989badf78d1f97654e46d60d1f3d25cd17Theodore Ts'o#define DBG(x) 23e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o#endif 24e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 257a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oblkid_dev blkid_new_dev(void) 26e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 277a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_dev dev; 28e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 297a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o if (!(dev = (blkid_dev) calloc(1, sizeof(struct blkid_struct_dev)))) 30e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return NULL; 31e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 32e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o INIT_LIST_HEAD(&dev->bid_devs); 33e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o INIT_LIST_HEAD(&dev->bid_tags); 34e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 35e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return dev; 36e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 37e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 387a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ovoid blkid_free_dev(blkid_dev dev) 39e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o{ 40e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (!dev) 41e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o return; 42e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 43d3f917989badf78d1f97654e46d60d1f3d25cd17Theodore Ts'o DBG(printf(" freeing dev %s (%s)\n", dev->bid_name, dev->bid_type)); 44e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o DEB_DUMP_DEV(dev); 45e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 46e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o list_del(&dev->bid_devs); 47e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o while (!list_empty(&dev->bid_tags)) { 487a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_tag tag = list_entry(dev->bid_tags.next, 497a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o struct blkid_struct_tag, 507a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o bit_tags); 51e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o blkid_free_tag(tag); 52e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o } 53e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o if (dev->bid_name) 5450b380b4d4ab668bad45033e3a8aaf93c7f42844Theodore Ts'o free(dev->bid_name); 55e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o free(dev); 56e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o} 57e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o 58e12f2ae74c2eb8997bf13adf8fdd7e7313971eaeTheodore Ts'o/* 597a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * Given a blkid device, return its name 607a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */ 617a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern const char *blkid_devname_name(blkid_dev dev) 627a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{ 637a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o return dev->bid_name; 647a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o} 657a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 667a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/* 677a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * dev iteration routines for the public libblkid interface. 687a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * 697a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * These routines do not expose the list.h implementation, which are a 707a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * contamination of the namespace, and which force us to reveal far, far 717a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * too much of our internal implemenation. I'm not convinced I want 727a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * to keep list.h in the long term, anyway. It's fine for kernel 737a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * programming, but performance is not the #1 priority for this 747a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * library, and I really don't like the tradeoff of type-safety for 757a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * performance for this application. [tytso:20030125.2007EST] 767a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */ 777a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 787a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/* 797a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * This series of functions iterate over all devices in a blkid cache 807a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */ 817a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o#define DEV_ITERATE_MAGIC 0x01a5284c 827a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 837a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'ostruct blkid_struct_dev_iterate { 847a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o int magic; 857a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_cache cache; 867a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o struct list_head *p; 877a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o}; 887a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 897a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache) 907a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{ 917a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_dev_iterate iter; 927a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 937a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter = malloc(sizeof(struct blkid_struct_dev_iterate)); 947a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o if (iter) { 957a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->magic = DEV_ITERATE_MAGIC; 967a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->cache = cache; 977a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->p = cache->bic_devs.next; 987a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o } 997a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o return (iter); 1007a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o} 1017a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 1027a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o/* 1037a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o * Return 0 on success, -1 on error 1047a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o */ 1057a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern int blkid_dev_next(blkid_dev_iterate iter, 1067a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o blkid_dev *dev) 1077a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{ 1087a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o *dev = 0; 1097a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o if (!iter || iter->magic != DEV_ITERATE_MAGIC || 1107a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->p == &iter->cache->bic_devs) 1117a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o return -1; 1127a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o *dev = list_entry(iter->p, struct blkid_struct_dev, bid_devs); 1137a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->p = iter->p->next; 1147a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o return 0; 1157a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o} 1167a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 1177a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'oextern void blkid_dev_iterate_end(blkid_dev_iterate iter) 1187a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o{ 1197a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o if (!iter || iter->magic != DEV_ITERATE_MAGIC) 1207a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o return; 1217a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o iter->magic = 0; 1227a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o free(iter); 1237a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o} 1247a603aa89fcffb8798eca34ca3858db6f0393046Theodore Ts'o 125