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