summaryrefslogtreecommitdiff
path: root/e2fsprogs/blkid
diff options
context:
space:
mode:
Diffstat (limited to 'e2fsprogs/blkid')
-rw-r--r--e2fsprogs/blkid/Kbuild23
-rw-r--r--e2fsprogs/blkid/blkid.h105
-rw-r--r--e2fsprogs/blkid/blkidP.h187
-rw-r--r--e2fsprogs/blkid/blkid_getsize.c179
-rw-r--r--e2fsprogs/blkid/cache.c126
-rw-r--r--e2fsprogs/blkid/dev.c214
-rw-r--r--e2fsprogs/blkid/devname.c368
-rw-r--r--e2fsprogs/blkid/devno.c223
-rw-r--r--e2fsprogs/blkid/list.c110
-rw-r--r--e2fsprogs/blkid/list.h73
-rw-r--r--e2fsprogs/blkid/probe.c721
-rw-r--r--e2fsprogs/blkid/probe.h375
-rw-r--r--e2fsprogs/blkid/read.c462
-rw-r--r--e2fsprogs/blkid/resolve.c139
-rw-r--r--e2fsprogs/blkid/save.c189
-rw-r--r--e2fsprogs/blkid/tag.c432
16 files changed, 0 insertions, 3926 deletions
diff --git a/e2fsprogs/blkid/Kbuild b/e2fsprogs/blkid/Kbuild
deleted file mode 100644
index ddcfdfd..0000000
--- a/e2fsprogs/blkid/Kbuild
+++ /dev/null
@@ -1,23 +0,0 @@
-# Makefile for busybox
-#
-# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
-#
-# Licensed under the GPL v2, see the file LICENSE in this tarball.
-
-NEEDED-$(CONFIG_E2FSCK) = y
-NEEDED-$(CONFIG_FSCK) = y
-NEEDED-$(CONFIG_MKE2FS) = y
-NEEDED-$(CONFIG_TUNE2FS) = y
-
-lib-y:=
-lib-$(NEEDED-y) += cache.o dev.o devname.o devno.o blkid_getsize.o \
- probe.o read.o resolve.o save.o tag.o list.o
-
-CFLAGS_dev.o := -include $(srctree)/include/busybox.h
-CFLAGS_devname.o := -include $(srctree)/include/busybox.h
-CFLAGS_devno.o := -include $(srctree)/include/busybox.h
-CFLAGS_blkid_getsize.o := -include $(srctree)/include/busybox.h
-CFLAGS_probe.o := -include $(srctree)/include/busybox.h
-CFLAGS_save.o := -include $(srctree)/include/busybox.h
-CFLAGS_tag.o := -include $(srctree)/include/busybox.h
-CFLAGS_list.o := -include $(srctree)/include/busybox.h
diff --git a/e2fsprogs/blkid/blkid.h b/e2fsprogs/blkid/blkid.h
deleted file mode 100644
index 4fa9f6f..0000000
--- a/e2fsprogs/blkid/blkid.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * blkid.h - Interface for libblkid, a library to identify block devices
- *
- * Copyright (C) 2001 Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#ifndef _BLKID_BLKID_H
-#define _BLKID_BLKID_H
-
-#include <sys/types.h>
-#include <linux/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define BLKID_VERSION "1.0.0"
-#define BLKID_DATE "12-Feb-2003"
-
-typedef struct blkid_struct_dev *blkid_dev;
-typedef struct blkid_struct_cache *blkid_cache;
-typedef __s64 blkid_loff_t;
-
-typedef struct blkid_struct_tag_iterate *blkid_tag_iterate;
-typedef struct blkid_struct_dev_iterate *blkid_dev_iterate;
-
-/*
- * Flags for blkid_get_dev
- *
- * BLKID_DEV_CREATE Create an empty device structure if not found
- * in the cache.
- * BLKID_DEV_VERIFY Make sure the device structure corresponds
- * with reality.
- * BLKID_DEV_FIND Just look up a device entry, and return NULL
- * if it is not found.
- * BLKID_DEV_NORMAL Get a valid device structure, either from the
- * cache or by probing the device.
- */
-#define BLKID_DEV_FIND 0x0000
-#define BLKID_DEV_CREATE 0x0001
-#define BLKID_DEV_VERIFY 0x0002
-#define BLKID_DEV_NORMAL (BLKID_DEV_CREATE | BLKID_DEV_VERIFY)
-
-/* cache.c */
-extern void blkid_put_cache(blkid_cache cache);
-extern int blkid_get_cache(blkid_cache *cache, const char *filename);
-
-/* dev.c */
-extern const char *blkid_dev_devname(blkid_dev dev);
-
-extern blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache);
-extern int blkid_dev_set_search(blkid_dev_iterate iter,
- char *search_type, char *search_value);
-extern int blkid_dev_next(blkid_dev_iterate iterate, blkid_dev *dev);
-extern void blkid_dev_iterate_end(blkid_dev_iterate iterate);
-
-/* devno.c */
-extern char *blkid_devno_to_devname(dev_t devno);
-
-/* devname.c */
-extern int blkid_probe_all(blkid_cache cache);
-extern int blkid_probe_all_new(blkid_cache cache);
-extern blkid_dev blkid_get_dev(blkid_cache cache, const char *devname,
- int flags);
-
-/* getsize.c */
-extern blkid_loff_t blkid_get_dev_size(int fd);
-
-/* probe.c */
-int blkid_known_fstype(const char *fstype);
-extern blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev);
-
-/* read.c */
-
-/* resolve.c */
-extern char *blkid_get_tag_value(blkid_cache cache, const char *tagname,
- const char *devname);
-extern char *blkid_get_devname(blkid_cache cache, const char *token,
- const char *value);
-
-/* tag.c */
-extern blkid_tag_iterate blkid_tag_iterate_begin(blkid_dev dev);
-extern int blkid_tag_next(blkid_tag_iterate iterate,
- const char **type, const char **value);
-extern void blkid_tag_iterate_end(blkid_tag_iterate iterate);
-extern int blkid_dev_has_tag(blkid_dev dev, const char *type,
- const char *value);
-extern blkid_dev blkid_find_dev_with_tag(blkid_cache cache,
- const char *type,
- const char *value);
-extern int blkid_parse_tag_string(const char *token, char **ret_type,
- char **ret_val);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _BLKID_BLKID_H */
diff --git a/e2fsprogs/blkid/blkidP.h b/e2fsprogs/blkid/blkidP.h
deleted file mode 100644
index c7cb8ab..0000000
--- a/e2fsprogs/blkid/blkidP.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * blkidP.h - Internal interfaces for libblkid
- *
- * Copyright (C) 2001 Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#ifndef _BLKID_BLKIDP_H
-#define _BLKID_BLKIDP_H
-
-#include <sys/types.h>
-#include <stdio.h>
-
-#include "blkid.h"
-#include "list.h"
-
-#ifdef __GNUC__
-#define __BLKID_ATTR(x) __attribute__(x)
-#else
-#define __BLKID_ATTR(x)
-#endif
-
-
-/*
- * This describes the attributes of a specific device.
- * We can traverse all of the tags by bid_tags (linking to the tag bit_names).
- * The bid_label and bid_uuid fields are shortcuts to the LABEL and UUID tag
- * values, if they exist.
- */
-struct blkid_struct_dev
-{
- struct list_head bid_devs; /* All devices in the cache */
- struct list_head bid_tags; /* All tags for this device */
- blkid_cache bid_cache; /* Dev belongs to this cache */
- char *bid_name; /* Device inode pathname */
- char *bid_type; /* Preferred device TYPE */
- int bid_pri; /* Device priority */
- dev_t bid_devno; /* Device major/minor number */
- time_t bid_time; /* Last update time of device */
- unsigned int bid_flags; /* Device status bitflags */
- char *bid_label; /* Shortcut to device LABEL */
- char *bid_uuid; /* Shortcut to binary UUID */
-};
-
-#define BLKID_BID_FL_VERIFIED 0x0001 /* Device data validated from disk */
-#define BLKID_BID_FL_INVALID 0x0004 /* Device is invalid */
-
-/*
- * Each tag defines a NAME=value pair for a particular device. The tags
- * are linked via bit_names for a single device, so that traversing the
- * names list will get you a list of all tags associated with a device.
- * They are also linked via bit_values for all devices, so one can easily
- * search all tags with a given NAME for a specific value.
- */
-struct blkid_struct_tag
-{
- struct list_head bit_tags; /* All tags for this device */
- struct list_head bit_names; /* All tags with given NAME */
- char *bit_name; /* NAME of tag (shared) */
- char *bit_val; /* value of tag */
- blkid_dev bit_dev; /* pointer to device */
-};
-typedef struct blkid_struct_tag *blkid_tag;
-
-/*
- * Minimum number of seconds between device probes, even when reading
- * from the cache. This is to avoid re-probing all devices which were
- * just probed by another program that does not share the cache.
- */
-#define BLKID_PROBE_MIN 2
-
-/*
- * Time in seconds an entry remains verified in the in-memory cache
- * before being reverified (in case of long-running processes that
- * keep a cache in memory and continue to use it for a long time).
- */
-#define BLKID_PROBE_INTERVAL 200
-
-/* This describes an entire blkid cache file and probed devices.
- * We can traverse all of the found devices via bic_list.
- * We can traverse all of the tag types by bic_tags, which hold empty tags
- * for each tag type. Those tags can be used as list_heads for iterating
- * through all devices with a specific tag type (e.g. LABEL).
- */
-struct blkid_struct_cache
-{
- struct list_head bic_devs; /* List head of all devices */
- struct list_head bic_tags; /* List head of all tag types */
- time_t bic_time; /* Last probe time */
- time_t bic_ftime; /* Mod time of the cachefile */
- unsigned int bic_flags; /* Status flags of the cache */
- char *bic_filename; /* filename of cache */
-};
-
-#define BLKID_BIC_FL_PROBED 0x0002 /* We probed /proc/partition devices */
-#define BLKID_BIC_FL_CHANGED 0x0004 /* Cache has changed from disk */
-
-extern char *blkid_strdup(const char *s);
-extern char *blkid_strndup(const char *s, const int length);
-
-#define BLKID_CACHE_FILE "/etc/blkid.tab"
-extern const char *blkid_devdirs[];
-
-#define BLKID_ERR_IO 5
-#define BLKID_ERR_PROC 9
-#define BLKID_ERR_MEM 12
-#define BLKID_ERR_CACHE 14
-#define BLKID_ERR_DEV 19
-#define BLKID_ERR_PARAM 22
-#define BLKID_ERR_BIG 27
-
-/*
- * Priority settings for different types of devices
- */
-#define BLKID_PRI_EVMS 30
-#define BLKID_PRI_LVM 20
-#define BLKID_PRI_MD 10
-
-#if defined(TEST_PROGRAM) && !defined(CONFIG_BLKID_DEBUG)
-#define CONFIG_BLKID_DEBUG
-#endif
-
-#define DEBUG_CACHE 0x0001
-#define DEBUG_DUMP 0x0002
-#define DEBUG_DEV 0x0004
-#define DEBUG_DEVNAME 0x0008
-#define DEBUG_DEVNO 0x0010
-#define DEBUG_PROBE 0x0020
-#define DEBUG_READ 0x0040
-#define DEBUG_RESOLVE 0x0080
-#define DEBUG_SAVE 0x0100
-#define DEBUG_TAG 0x0200
-#define DEBUG_INIT 0x8000
-#define DEBUG_ALL 0xFFFF
-
-#ifdef CONFIG_BLKID_DEBUG
-#include <stdio.h>
-extern int blkid_debug_mask;
-#define DBG(m,x) if ((m) & blkid_debug_mask) x;
-#else
-#define DBG(m,x)
-#endif
-
-#ifdef CONFIG_BLKID_DEBUG
-extern void blkid_debug_dump_dev(blkid_dev dev);
-extern void blkid_debug_dump_tag(blkid_tag tag);
-#endif
-
-/* lseek.c */
-/* extern blkid_loff_t blkid_llseek(int fd, blkid_loff_t offset, int whence); */
-#ifdef CONFIG_LFS
-# define blkid_llseek lseek64
-#else
-# define blkid_llseek lseek
-#endif
-
-/* read.c */
-extern void blkid_read_cache(blkid_cache cache);
-
-/* save.c */
-extern int blkid_flush_cache(blkid_cache cache);
-
-/*
- * Functions to create and find a specific tag type: tag.c
- */
-extern void blkid_free_tag(blkid_tag tag);
-extern blkid_tag blkid_find_tag_dev(blkid_dev dev, const char *type);
-extern int blkid_set_tag(blkid_dev dev, const char *name,
- const char *value, const int vlength);
-
-/*
- * Functions to create and find a specific tag type: dev.c
- */
-extern blkid_dev blkid_new_dev(void);
-extern void blkid_free_dev(blkid_dev dev);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _BLKID_BLKIDP_H */
diff --git a/e2fsprogs/blkid/blkid_getsize.c b/e2fsprogs/blkid/blkid_getsize.c
deleted file mode 100644
index 941efa4..0000000
--- a/e2fsprogs/blkid/blkid_getsize.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * getsize.c --- get the size of a partition.
- *
- * Copyright (C) 1995, 1995 Theodore Ts'o.
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-/* include this before sys/queues.h! */
-#include "blkidP.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#include <fcntl.h>
-#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#ifdef HAVE_LINUX_FD_H
-#include <linux/fd.h>
-#endif
-#ifdef HAVE_SYS_DISKLABEL_H
-#include <sys/disklabel.h>
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_DISK_H
-#ifdef HAVE_SYS_QUEUE_H
-#include <sys/queue.h> /* for LIST_HEAD */
-#endif
-#include <sys/disk.h>
-#endif
-#ifdef __linux__
-#include <sys/utsname.h>
-#endif
-
-#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
-#define BLKGETSIZE _IO(0x12,96) /* return device size */
-#endif
-
-#if defined(__linux__) && defined(_IOR) && !defined(BLKGETSIZE64)
-#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
-#endif
-
-#ifdef APPLE_DARWIN
-#define BLKGETSIZE DKIOCGETBLOCKCOUNT32
-#endif /* APPLE_DARWIN */
-
-static int valid_offset(int fd, blkid_loff_t offset)
-{
- char ch;
-
- if (blkid_llseek(fd, offset, 0) < 0)
- return 0;
- if (read(fd, &ch, 1) < 1)
- return 0;
- return 1;
-}
-
-/*
- * Returns the number of blocks in a partition
- */
-blkid_loff_t blkid_get_dev_size(int fd)
-{
- int valid_blkgetsize64 = 1;
-#ifdef __linux__
- struct utsname ut;
-#endif
- unsigned long long size64;
- unsigned long size;
- blkid_loff_t high, low;
-#ifdef FDGETPRM
- struct floppy_struct this_floppy;
-#endif
-#ifdef HAVE_SYS_DISKLABEL_H
- int part = -1;
- struct disklabel lab;
- struct partition *pp;
- char ch;
- struct stat st;
-#endif /* HAVE_SYS_DISKLABEL_H */
-
-#ifdef DKIOCGETBLOCKCOUNT /* For Apple Darwin */
- if (ioctl(fd, DKIOCGETBLOCKCOUNT, &size64) >= 0) {
- if ((sizeof(blkid_loff_t) < sizeof(unsigned long long))
- && (size64 << 9 > 0xFFFFFFFF))
- return 0; /* EFBIG */
- return (blkid_loff_t) size64 << 9;
- }
-#endif
-
-#ifdef BLKGETSIZE64
-#ifdef __linux__
- if ((uname(&ut) == 0) &&
- ((ut.release[0] == '2') && (ut.release[1] == '.') &&
- (ut.release[2] < '6') && (ut.release[3] == '.')))
- valid_blkgetsize64 = 0;
-#endif
- if (valid_blkgetsize64 &&
- ioctl(fd, BLKGETSIZE64, &size64) >= 0) {
- if ((sizeof(blkid_loff_t) < sizeof(unsigned long long))
- && ((size64) > 0xFFFFFFFF))
- return 0; /* EFBIG */
- return size64;
- }
-#endif
-
-#ifdef BLKGETSIZE
- if (ioctl(fd, BLKGETSIZE, &size) >= 0)
- return (blkid_loff_t)size << 9;
-#endif
-
-#ifdef FDGETPRM
- if (ioctl(fd, FDGETPRM, &this_floppy) >= 0)
- return (blkid_loff_t)this_floppy.size << 9;
-#endif
-#ifdef HAVE_SYS_DISKLABEL_H
-#if 0
- /*
- * This should work in theory but I haven't tested it. Anyone
- * on a BSD system want to test this for me? In the meantime,
- * binary search mechanism should work just fine.
- */
- if ((fstat(fd, &st) >= 0) && S_ISBLK(st.st_mode))
- part = st.st_rdev & 7;
- if (part >= 0 && (ioctl(fd, DIOCGDINFO, (char *)&lab) >= 0)) {
- pp = &lab.d_partitions[part];
- if (pp->p_size)
- return pp->p_size << 9;
- }
-#endif
-#endif /* HAVE_SYS_DISKLABEL_H */
-
- /*
- * OK, we couldn't figure it out by using a specialized ioctl,
- * which is generally the best way. So do binary search to
- * find the size of the partition.
- */
- low = 0;
- for (high = 1024; valid_offset(fd, high); high *= 2)
- low = high;
- while (low < high - 1)
- {
- const blkid_loff_t mid = (low + high) / 2;
-
- if (valid_offset(fd, mid))
- low = mid;
- else
- high = mid;
- }
- return low + 1;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char **argv)
-{
- blkid_loff_t bytes;
- int fd;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s device\n"
- "Determine the size of a device\n", argv[0]);
- return 1;
- }
-
- if ((fd = open(argv[1], O_RDONLY)) < 0)
- perror(argv[0]);
-
- bytes = blkid_get_dev_size(fd);
- printf("Device %s has %lld 1k blocks.\n", argv[1], bytes >> 10);
-
- return 0;
-}
-#endif
diff --git a/e2fsprogs/blkid/cache.c b/e2fsprogs/blkid/cache.c
deleted file mode 100644
index 9bae6fb..0000000
--- a/e2fsprogs/blkid/cache.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * cache.c - allocation/initialization/free routines for cache
- *
- * Copyright (C) 2001 Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "blkidP.h"
-
-int blkid_debug_mask = 0;
-
-int blkid_get_cache(blkid_cache *ret_cache, const char *filename)
-{
- blkid_cache cache;
-
-#ifdef CONFIG_BLKID_DEBUG
- if (!(blkid_debug_mask & DEBUG_INIT)) {
- char *dstr = getenv("BLKID_DEBUG");
-
- if (dstr)
- blkid_debug_mask = strtoul(dstr, 0, 0);
- blkid_debug_mask |= DEBUG_INIT;
- }
-#endif
-
- DBG(DEBUG_CACHE, printf("creating blkid cache (using %s)\n",
- filename ? filename : "default cache"));
-
- if (!(cache = (blkid_cache) calloc(1, sizeof(struct blkid_struct_cache))))
- return -BLKID_ERR_MEM;
-
- INIT_LIST_HEAD(&cache->bic_devs);
- INIT_LIST_HEAD(&cache->bic_tags);
-
- if (filename && !strlen(filename))
- filename = 0;
- if (!filename && (getuid() == geteuid()))
- filename = getenv("BLKID_FILE");
- if (!filename)
- filename = BLKID_CACHE_FILE;
- cache->bic_filename = blkid_strdup(filename);
-
- blkid_read_cache(cache);
-
- *ret_cache = cache;
- return 0;
-}
-
-void blkid_put_cache(blkid_cache cache)
-{
- if (!cache)
- return;
-
- (void) blkid_flush_cache(cache);
-
- DBG(DEBUG_CACHE, printf("freeing cache struct\n"));
-
- /* DBG(DEBUG_CACHE, blkid_debug_dump_cache(cache)); */
-
- while (!list_empty(&cache->bic_devs)) {
- blkid_dev dev = list_entry(cache->bic_devs.next,
- struct blkid_struct_dev,
- bid_devs);
- blkid_free_dev(dev);
- }
-
- while (!list_empty(&cache->bic_tags)) {
- blkid_tag tag = list_entry(cache->bic_tags.next,
- struct blkid_struct_tag,
- bit_tags);
-
- while (!list_empty(&tag->bit_names)) {
- blkid_tag bad = list_entry(tag->bit_names.next,
- struct blkid_struct_tag,
- bit_names);
-
- DBG(DEBUG_CACHE, printf("warning: unfreed tag %s=%s\n",
- bad->bit_name, bad->bit_val));
- blkid_free_tag(bad);
- }
- blkid_free_tag(tag);
- }
- free(cache->bic_filename);
-
- free(cache);
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char** argv)
-{
- blkid_cache cache = NULL;
- int ret;
-
- blkid_debug_mask = DEBUG_ALL;
- if ((argc > 2)) {
- fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
- exit(1);
- }
-
- if ((ret = blkid_get_cache(&cache, argv[1])) < 0) {
- fprintf(stderr, "error %d parsing cache file %s\n", ret,
- argv[1] ? argv[1] : BLKID_CACHE_FILE);
- exit(1);
- }
- if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
- if ((ret = blkid_probe_all(cache) < 0))
- fprintf(stderr, "error probing devices\n");
-
- blkid_put_cache(cache);
-
- return ret;
-}
-#endif
diff --git a/e2fsprogs/blkid/dev.c b/e2fsprogs/blkid/dev.c
deleted file mode 100644
index eddbd02..0000000
--- a/e2fsprogs/blkid/dev.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * dev.c - allocation/initialization/free routines for dev
- *
- * Copyright (C) 2001 Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "blkidP.h"
-
-blkid_dev blkid_new_dev(void)
-{
- blkid_dev dev;
-
- if (!(dev = (blkid_dev) calloc(1, sizeof(struct blkid_struct_dev))))
- return NULL;
-
- INIT_LIST_HEAD(&dev->bid_devs);
- INIT_LIST_HEAD(&dev->bid_tags);
-
- return dev;
-}
-
-void blkid_free_dev(blkid_dev dev)
-{
- if (!dev)
- return;
-
- DBG(DEBUG_DEV,
- printf(" freeing dev %s (%s)\n", dev->bid_name, dev->bid_type));
- DBG(DEBUG_DEV, blkid_debug_dump_dev(dev));
-
- list_del(&dev->bid_devs);
- while (!list_empty(&dev->bid_tags)) {
- blkid_tag tag = list_entry(dev->bid_tags.next,
- struct blkid_struct_tag,
- bit_tags);
- blkid_free_tag(tag);
- }
- if (dev->bid_name)
- free(dev->bid_name);
- free(dev);
-}
-
-/*
- * Given a blkid device, return its name
- */
-const char *blkid_dev_devname(blkid_dev dev)
-{
- return dev->bid_name;
-}
-
-#ifdef CONFIG_BLKID_DEBUG
-void blkid_debug_dump_dev(blkid_dev dev)
-{
- struct list_head *p;
-
- if (!dev) {
- printf(" dev: NULL\n");
- return;
- }
-
- printf(" dev: name = %s\n", dev->bid_name);
- printf(" dev: DEVNO=\"0x%0llx\"\n", dev->bid_devno);
- printf(" dev: TIME=\"%lu\"\n", dev->bid_time);
- printf(" dev: PRI=\"%d\"\n", dev->bid_pri);
- printf(" dev: flags = 0x%08X\n", dev->bid_flags);
-
- list_for_each(p, &dev->bid_tags) {
- blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags);
- if (tag)
- printf(" tag: %s=\"%s\"\n", tag->bit_name,
- tag->bit_val);
- else
- printf(" tag: NULL\n");
- }
- puts("");
-}
-#endif
-
-/*
- * dev iteration routines for the public libblkid interface.
- *
- * These routines do not expose the list.h implementation, which are a
- * contamination of the namespace, and which force us to reveal far, far
- * too much of our internal implemenation. I'm not convinced I want
- * to keep list.h in the long term, anyway. It's fine for kernel
- * programming, but performance is not the #1 priority for this
- * library, and I really don't like the tradeoff of type-safety for
- * performance for this application. [tytso:20030125.2007EST]
- */
-
-/*
- * This series of functions iterate over all devices in a blkid cache
- */
-#define DEV_ITERATE_MAGIC 0x01a5284c
-
-struct blkid_struct_dev_iterate {
- int magic;
- blkid_cache cache;
- struct list_head *p;
-};
-
-blkid_dev_iterate blkid_dev_iterate_begin(blkid_cache cache)
-{
- blkid_dev_iterate iter;
-
- iter = xmalloc(sizeof(struct blkid_struct_dev_iterate));
- iter->magic = DEV_ITERATE_MAGIC;
- iter->cache = cache;
- iter->p = cache->bic_devs.next;
- return iter;
-}
-
-/*
- * Return 0 on success, -1 on error
- */
-extern int blkid_dev_next(blkid_dev_iterate iter,
- blkid_dev *dev)
-{
- *dev = 0;
- if (!iter || iter->magic != DEV_ITERATE_MAGIC ||
- iter->p == &iter->cache->bic_devs)
- return -1;
- *dev = list_entry(iter->p, struct blkid_struct_dev, bid_devs);
- iter->p = iter->p->next;
- return 0;
-}
-
-void blkid_dev_iterate_end(blkid_dev_iterate iter)
-{
- if (!iter || iter->magic != DEV_ITERATE_MAGIC)
- return;
- iter->magic = 0;
- free(iter);
-}
-
-#ifdef TEST_PROGRAM
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#else
-extern char *optarg;
-extern int optind;
-#endif
-
-void usage(char *prog)
-{
- fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask]\n", prog);
- fprintf(stderr, "\tList all devices and exit\n", prog);
- exit(1);
-}
-
-int main(int argc, char **argv)
-{
- blkid_dev_iterate iter;
- blkid_cache cache = NULL;
- blkid_dev dev;
- int c, ret;
- char *tmp;
- char *file = NULL;
- char *search_type = NULL;
- char *search_value = NULL;
-
- while ((c = getopt (argc, argv, "m:f:")) != EOF)
- switch (c) {
- case 'f':
- file = optarg;
- break;
- case 'm':
- blkid_debug_mask = strtoul (optarg, &tmp, 0);
- if (*tmp) {
- fprintf(stderr, "Invalid debug mask: %d\n",
- optarg);
- exit(1);
- }
- break;
- case '?':
- usage(argv[0]);
- }
- if (argc >= optind+2) {
- search_type = argv[optind];
- search_value = argv[optind+1];
- optind += 2;
- }
- if (argc != optind)
- usage(argv[0]);
-
- if ((ret = blkid_get_cache(&cache, file)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
-
- iter = blkid_dev_iterate_begin(cache);
- if (search_type)
- blkid_dev_set_search(iter, search_type, search_value);
- while (blkid_dev_next(iter, &dev) == 0) {
- printf("Device: %s\n", blkid_dev_devname(dev));
- }
- blkid_dev_iterate_end(iter);
-
-
- blkid_put_cache(cache);
- return 0;
-}
-#endif
diff --git a/e2fsprogs/blkid/devname.c b/e2fsprogs/blkid/devname.c
deleted file mode 100644
index 3d11734..0000000
--- a/e2fsprogs/blkid/devname.c
+++ /dev/null
@@ -1,368 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * devname.c - get a dev by its device inode name
- *
- * Copyright (C) Andries Brouwer
- * Copyright (C) 1999, 2000, 2001, 2002, 2003 Theodore Ts'o
- * Copyright (C) 2001 Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#include <sys/stat.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_SYS_MKDEV_H
-#include <sys/mkdev.h>
-#endif
-#include <time.h>
-
-#include "blkidP.h"
-
-/*
- * Find a dev struct in the cache by device name, if available.
- *
- * If there is no entry with the specified device name, and the create
- * flag is set, then create an empty device entry.
- */
-blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags)
-{
- blkid_dev dev = NULL, tmp;
- struct list_head *p;
-
- if (!cache || !devname)
- return NULL;
-
- list_for_each(p, &cache->bic_devs) {
- tmp = list_entry(p, struct blkid_struct_dev, bid_devs);
- if (strcmp(tmp->bid_name, devname))
- continue;
-
- DBG(DEBUG_DEVNAME,
- printf("found devname %s in cache\n", tmp->bid_name));
- dev = tmp;
- break;
- }
-
- if (!dev && (flags & BLKID_DEV_CREATE)) {
- dev = blkid_new_dev();
- if (!dev)
- return NULL;
- dev->bid_name = blkid_strdup(devname);
- dev->bid_cache = cache;
- list_add_tail(&dev->bid_devs, &cache->bic_devs);
- cache->bic_flags |= BLKID_BIC_FL_CHANGED;
- }
-
- if (flags & BLKID_DEV_VERIFY)
- dev = blkid_verify(cache, dev);
- return dev;
-}
-
-/*
- * Probe a single block device to add to the device cache.
- */
-static void probe_one(blkid_cache cache, const char *ptname,
- dev_t devno, int pri)
-{
- blkid_dev dev = NULL;
- struct list_head *p;
- const char **dir;
- char *devname = NULL;
-
- /* See if we already have this device number in the cache. */
- list_for_each(p, &cache->bic_devs) {
- blkid_dev tmp = list_entry(p, struct blkid_struct_dev,
- bid_devs);
- if (tmp->bid_devno == devno) {
- dev = blkid_verify(cache, tmp);
- break;
- }
- }
- if (dev && dev->bid_devno == devno)
- goto set_pri;
-
- /*
- * Take a quick look at /dev/ptname for the device number. We check
- * all of the likely device directories. If we don't find it, or if
- * the stat information doesn't check out, use blkid_devno_to_devname()
- * to find it via an exhaustive search for the device major/minor.
- */
- for (dir = blkid_devdirs; *dir; dir++) {
- struct stat st;
- char device[256];
-
- sprintf(device, "%s/%s", *dir, ptname);
- if ((dev = blkid_get_dev(cache, device, BLKID_DEV_FIND)) &&
- dev->bid_devno == devno)
- goto set_pri;
-
- if (stat(device, &st) == 0 && S_ISBLK(st.st_mode) &&
- st.st_rdev == devno) {
- devname = blkid_strdup(device);
- break;
- }
- }
- if (!devname) {
- devname = blkid_devno_to_devname(devno);
- if (!devname)
- return;
- }
- dev = blkid_get_dev(cache, devname, BLKID_DEV_NORMAL);
- free(devname);
-
-set_pri:
- if (!pri && !strncmp(ptname, "md", 2))
- pri = BLKID_PRI_MD;
- if (dev)
- dev->bid_pri = pri;
- return;
-}
-
-#define PROC_PARTITIONS "/proc/partitions"
-#define VG_DIR "/proc/lvm/VGs"
-
-/*
- * This function initializes the UUID cache with devices from the LVM
- * proc hierarchy. We currently depend on the names of the LVM
- * hierarchy giving us the device structure in /dev. (XXX is this a
- * safe thing to do?)
- */
-#ifdef VG_DIR
-#include <dirent.h>
-static dev_t lvm_get_devno(const char *lvm_device)
-{
- FILE *lvf;
- char buf[1024];
- int ma, mi;
- dev_t ret = 0;
-
- DBG(DEBUG_DEVNAME, printf("opening %s\n", lvm_device));
- if ((lvf = fopen(lvm_device, "r")) == NULL) {
- DBG(DEBUG_DEVNAME, printf("%s: (%d) %s\n", lvm_device, errno,
- strerror(errno)));
- return 0;
- }
-
- while (fgets(buf, sizeof(buf), lvf)) {
- if (sscanf(buf, "device: %d:%d", &ma, &mi) == 2) {
- ret = makedev(ma, mi);
- break;
- }
- }
- fclose(lvf);
-
- return ret;
-}
-
-static void lvm_probe_all(blkid_cache cache)
-{
- DIR *vg_list;
- struct dirent *vg_iter;
- int vg_len = strlen(VG_DIR);
- dev_t dev;
-
- if ((vg_list = opendir(VG_DIR)) == NULL)
- return;
-
- DBG(DEBUG_DEVNAME, printf("probing LVM devices under %s\n", VG_DIR));
-
- while ((vg_iter = readdir(vg_list)) != NULL) {
- DIR *lv_list;
- char *vdirname;
- char *vg_name;
- struct dirent *lv_iter;
-
- vg_name = vg_iter->d_name;
- if (LONE_CHAR(vg_name, '.') || !strcmp(vg_name, ".."))
- continue;
- vdirname = xmalloc(vg_len + strlen(vg_name) + 8);
- sprintf(vdirname, "%s/%s/LVs", VG_DIR, vg_name);
-
- lv_list = opendir(vdirname);
- free(vdirname);
- if (lv_list == NULL)
- continue;
-
- while ((lv_iter = readdir(lv_list)) != NULL) {
- char *lv_name, *lvm_device;
-
- lv_name = lv_iter->d_name;
- if (LONE_CHAR(lv_name, '.') || !strcmp(lv_name, ".."))
- continue;
-
- lvm_device = xmalloc(vg_len + strlen(vg_name) +
- strlen(lv_name) + 8);
- sprintf(lvm_device, "%s/%s/LVs/%s", VG_DIR, vg_name,
- lv_name);
- dev = lvm_get_devno(lvm_device);
- sprintf(lvm_device, "%s/%s", vg_name, lv_name);
- DBG(DEBUG_DEVNAME, printf("LVM dev %s: devno 0x%04X\n",
- lvm_device,
- (unsigned int) dev));
- probe_one(cache, lvm_device, dev, BLKID_PRI_LVM);
- free(lvm_device);
- }
- closedir(lv_list);
- }
- closedir(vg_list);
-}
-#endif
-
-#define PROC_EVMS_VOLUMES "/proc/evms/volumes"
-
-static int
-evms_probe_all(blkid_cache cache)
-{
- char line[100];
- int ma, mi, sz, num = 0;
- FILE *procpt;
- char device[110];
-
- procpt = fopen(PROC_EVMS_VOLUMES, "r");
- if (!procpt)
- return 0;
- while (fgets(line, sizeof(line), procpt)) {
- if (sscanf (line, " %d %d %d %*s %*s %[^\n ]",
- &ma, &mi, &sz, device) != 4)
- continue;
-
- DBG(DEBUG_DEVNAME, printf("Checking partition %s (%d, %d)\n",
- device, ma, mi));
-
- probe_one(cache, device, makedev(ma, mi), BLKID_PRI_EVMS);
- num++;
- }
- fclose(procpt);
- return num;
-}
-
-/*
- * Read the device data for all available block devices in the system.
- */
-int blkid_probe_all(blkid_cache cache)
-{
- FILE *proc;
- char line[1024];
- char ptname0[128], ptname1[128], *ptname = 0;
- char *ptnames[2];
- dev_t devs[2];
- int ma, mi;
- unsigned long long sz;
- int lens[2] = { 0, 0 };
- int which = 0, last = 0;
-
- ptnames[0] = ptname0;
- ptnames[1] = ptname1;
-
- if (!cache)
- return -BLKID_ERR_PARAM;
-
- if (cache->bic_flags & BLKID_BIC_FL_PROBED &&
- time(0) - cache->bic_time < BLKID_PROBE_INTERVAL)
- return 0;
-
- blkid_read_cache(cache);
- evms_probe_all(cache);
-#ifdef VG_DIR
- lvm_probe_all(cache);
-#endif
-
- proc = fopen(PROC_PARTITIONS, "r");
- if (!proc)
- return -BLKID_ERR_PROC;
-
- while (fgets(line, sizeof(line), proc)) {
- last = which;
- which ^= 1;
- ptname = ptnames[which];
-
- if (sscanf(line, " %d %d %llu %128[^\n ]",
- &ma, &mi, &sz, ptname) != 4)
- continue;
- devs[which] = makedev(ma, mi);
-
- DBG(DEBUG_DEVNAME, printf("read partition name %s\n", ptname));
-
- /* Skip whole disk devs unless they have no partitions
- * If we don't have a partition on this dev, also
- * check previous dev to see if it didn't have a partn.
- * heuristic: partition name ends in a digit.
- *
- * Skip extended partitions.
- * heuristic: size is 1
- *
- * FIXME: skip /dev/{ida,cciss,rd} whole-disk devs
- */
-
- lens[which] = strlen(ptname);
- if (isdigit(ptname[lens[which] - 1])) {
- DBG(DEBUG_DEVNAME,
- printf("partition dev %s, devno 0x%04X\n",
- ptname, (unsigned int) devs[which]));
-
- if (sz > 1)
- probe_one(cache, ptname, devs[which], 0);
- lens[which] = 0;
- lens[last] = 0;
- } else if (lens[last] && strncmp(ptnames[last], ptname,
- lens[last])) {
- DBG(DEBUG_DEVNAME,
- printf("whole dev %s, devno 0x%04X\n",
- ptnames[last], (unsigned int) devs[last]));
- probe_one(cache, ptnames[last], devs[last], 0);
- lens[last] = 0;
- }
- }
-
- /* Handle the last device if it wasn't partitioned */
- if (lens[which])
- probe_one(cache, ptname, devs[which], 0);
-
- fclose(proc);
-
- cache->bic_time = time(0);
- cache->bic_flags |= BLKID_BIC_FL_PROBED;
- blkid_flush_cache(cache);
- return 0;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char **argv)
-{
- blkid_cache cache = NULL;
- int ret;
-
- blkid_debug_mask = DEBUG_ALL;
- if (argc != 1) {
- fprintf(stderr, "Usage: %s\n"
- "Probe all devices and exit\n", argv[0]);
- exit(1);
- }
- if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
- if (blkid_probe_all(cache) < 0)
- printf("%s: error probing devices\n", argv[0]);
-
- blkid_put_cache(cache);
- return 0;
-}
-#endif
diff --git a/e2fsprogs/blkid/devno.c b/e2fsprogs/blkid/devno.c
deleted file mode 100644
index 13e7f1a..0000000
--- a/e2fsprogs/blkid/devno.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * devno.c - find a particular device by its device number (major/minor)
- *
- * Copyright (C) 2000, 2001, 2003 Theodore Ts'o
- * Copyright (C) 2001 Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#include <sys/stat.h>
-#include <dirent.h>
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#ifdef HAVE_SYS_MKDEV_H
-#include <sys/mkdev.h>
-#endif
-
-#include "blkidP.h"
-
-struct dir_list {
- char *name;
- struct dir_list *next;
-};
-
-char *blkid_strndup(const char *s, int length)
-{
- char *ret;
-
- if (!s)
- return NULL;
-
- if (!length)
- length = strlen(s);
-
- ret = xmalloc(length + 1);
- strncpy(ret, s, length);
- ret[length] = '\0';
- return ret;
-}
-
-char *blkid_strdup(const char *s)
-{
- return blkid_strndup(s, 0);
-}
-
-/*
- * This function adds an entry to the directory list
- */
-static void add_to_dirlist(const char *name, struct dir_list **list)
-{
- struct dir_list *dp;
-
- dp = xmalloc(sizeof(struct dir_list));
- dp->name = blkid_strdup(name);
- dp->next = *list;
- *list = dp;
-}
-
-/*
- * This function frees a directory list
- */
-static void free_dirlist(struct dir_list **list)
-{
- struct dir_list *dp, *next;
-
- for (dp = *list; dp; dp = next) {
- next = dp->next;
- free(dp->name);
- free(dp);
- }
- *list = NULL;
-}
-
-static void scan_dir(char *dir_name, dev_t devno, struct dir_list **list,
- char **devname)
-{
- DIR *dir;
- struct dirent *dp;
- char path[1024];
- int dirlen;
- struct stat st;
-
- if ((dir = opendir(dir_name)) == NULL)
- return;
- dirlen = strlen(dir_name) + 2;
- while ((dp = readdir(dir)) != 0) {
- if (dirlen + strlen(dp->d_name) >= sizeof(path))
- continue;
-
- if (dp->d_name[0] == '.' &&
- ((dp->d_name[1] == 0) ||
- ((dp->d_name[1] == '.') && (dp->d_name[2] == 0))))
- continue;
-
- sprintf(path, "%s/%s", dir_name, dp->d_name);
- if (stat(path, &st) < 0)
- continue;
-
- if (S_ISDIR(st.st_mode))
- add_to_dirlist(path, list);
- else if (S_ISBLK(st.st_mode) && st.st_rdev == devno) {
- *devname = blkid_strdup(path);
- DBG(DEBUG_DEVNO,
- printf("found 0x%llx at %s (%p)\n", devno,
- path, *devname));
- break;
- }
- }
- closedir(dir);
- return;
-}
-
-/* Directories where we will try to search for device numbers */
-const char *blkid_devdirs[] = { "/devices", "/devfs", "/dev", NULL };
-
-/*
- * This function finds the pathname to a block device with a given
- * device number. It returns a pointer to allocated memory to the
- * pathname on success, and NULL on failure.
- */
-char *blkid_devno_to_devname(dev_t devno)
-{
- struct dir_list *list = NULL, *new_list = NULL;
- char *devname = NULL;
- const char **dir;
-
- /*
- * Add the starting directories to search in reverse order of
- * importance, since we are using a stack...
- */
- for (dir = blkid_devdirs; *dir; dir++)
- add_to_dirlist(*dir, &list);
-
- while (list) {
- struct dir_list *current = list;
-
- list = list->next;
- DBG(DEBUG_DEVNO, printf("directory %s\n", current->name));
- scan_dir(current->name, devno, &new_list, &devname);
- free(current->name);
- free(current);
- if (devname)
- break;
- /*
- * If we're done checking at this level, descend to
- * the next level of subdirectories. (breadth-first)
- */
- if (list == NULL) {
- list = new_list;
- new_list = NULL;
- }
- }
- free_dirlist(&list);
- free_dirlist(&new_list);
-
- if (!devname) {
- DBG(DEBUG_DEVNO,
- printf("blkid: cannot find devno 0x%04lx\n",
- (unsigned long) devno));
- } else {
- DBG(DEBUG_DEVNO,
- printf("found devno 0x%04llx as %s\n", devno, devname));
- }
-
-
- return devname;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char** argv)
-{
- char *devname, *tmp;
- int major, minor;
- dev_t devno;
- const char *errmsg = "Cannot parse %s: %s\n";
-
- blkid_debug_mask = DEBUG_ALL;
- if ((argc != 2) && (argc != 3)) {
- fprintf(stderr, "Usage:\t%s device_number\n\t%s major minor\n"
- "Resolve a device number to a device name\n",
- argv[0], argv[0]);
- exit(1);
- }
- if (argc == 2) {
- devno = strtoul(argv[1], &tmp, 0);
- if (*tmp) {
- fprintf(stderr, errmsg, "device number", argv[1]);
- exit(1);
- }
- } else {
- major = strtoul(argv[1], &tmp, 0);
- if (*tmp) {
- fprintf(stderr, errmsg, "major number", argv[1]);
- exit(1);
- }
- minor = strtoul(argv[2], &tmp, 0);
- if (*tmp) {
- fprintf(stderr, errmsg, "minor number", argv[2]);
- exit(1);
- }
- devno = makedev(major, minor);
- }
- printf("Looking for device 0x%04Lx\n", devno);
- devname = blkid_devno_to_devname(devno);
- free(devname);
- return 0;
-}
-#endif
diff --git a/e2fsprogs/blkid/list.c b/e2fsprogs/blkid/list.c
deleted file mode 100644
index 04d61a1..0000000
--- a/e2fsprogs/blkid/list.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/* vi: set sw=4 ts=4: */
-
-#include "list.h"
-
-/*
- * Insert a new entry between two known consecutive entries.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-void __list_add(struct list_head * add,
- struct list_head * prev,
- struct list_head * next)
-{
- next->prev = add;
- add->next = next;
- add->prev = prev;
- prev->next = add;
-}
-
-/*
- * list_add - add a new entry
- * @add: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-void list_add(struct list_head *add, struct list_head *head)
-{
- __list_add(add, head, head->next);
-}
-
-/*
- * list_add_tail - add a new entry
- * @add: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-void list_add_tail(struct list_head *add, struct list_head *head)
-{
- __list_add(add, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-void __list_del(struct list_head * prev, struct list_head * next)
-{
- next->prev = prev;
- prev->next = next;
-}
-
-/*
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- *
- * list_empty() on @entry does not return true after this, @entry is
- * in an undefined state.
- */
-void list_del(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
-}
-
-/*
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-void list_del_init(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
- INIT_LIST_HEAD(entry);
-}
-
-/*
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-int list_empty(struct list_head *head)
-{
- return head->next == head;
-}
-
-/*
- * list_splice - join two lists
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-void list_splice(struct list_head *list, struct list_head *head)
-{
- struct list_head *first = list->next;
-
- if (first != list) {
- struct list_head *last = list->prev;
- struct list_head *at = head->next;
-
- first->prev = head;
- head->next = first;
-
- last->next = at;
- at->prev = last;
- }
-}
diff --git a/e2fsprogs/blkid/list.h b/e2fsprogs/blkid/list.h
deleted file mode 100644
index 8b06d85..0000000
--- a/e2fsprogs/blkid/list.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* vi: set sw=4 ts=4: */
-#if !defined(_BLKID_LIST_H) && !defined(LIST_HEAD)
-#define _BLKID_LIST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Simple doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-struct list_head {
- struct list_head *next, *prev;
-};
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
-
-#define INIT_LIST_HEAD(ptr) do { \
- (ptr)->next = (ptr); (ptr)->prev = (ptr); \
-} while (0)
-
-void __list_add(struct list_head * add, struct list_head * prev, struct list_head * next);
-void list_add(struct list_head *add, struct list_head *head);
-void list_add_tail(struct list_head *add, struct list_head *head);
-void __list_del(struct list_head * prev, struct list_head * next);
-void list_del(struct list_head *entry);
-void list_del_init(struct list_head *entry);
-int list_empty(struct list_head *head);
-void list_splice(struct list_head *list, struct list_head *head);
-
-/**
- * list_entry - get the struct for this entry
- * @ptr: the &struct list_head pointer.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_struct within the struct.
- */
-#define list_entry(ptr, type, member) \
- ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
-
-/**
- * list_for_each - iterate over elements in a list
- * @pos: the &struct list_head to use as a loop counter.
- * @head: the head for your list.
- */
-#define list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
-
-/**
- * list_for_each_safe - iterate over elements in a list, but don't dereference
- * pos after the body is done (in case it is freed)
- * @pos: the &struct list_head to use as a loop counter.
- * @pnext: the &struct list_head to use as a pointer to the next item.
- * @head: the head for your list (not included in iteration).
- */
-#define list_for_each_safe(pos, pnext, head) \
- for (pos = (head)->next, pnext = pos->next; pos != (head); \
- pos = pnext, pnext = pos->next)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _BLKID_LIST_H */
diff --git a/e2fsprogs/blkid/probe.c b/e2fsprogs/blkid/probe.c
deleted file mode 100644
index 8c6e2aa..0000000
--- a/e2fsprogs/blkid/probe.c
+++ /dev/null
@@ -1,721 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * probe.c - identify a block device by its contents, and return a dev
- * struct with the details
- *
- * Copyright (C) 1999 by Andries Brouwer
- * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
- * Copyright (C) 2001 by Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_MKDEV_H
-#include <sys/mkdev.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#include "blkidP.h"
-#include "../uuid/uuid.h"
-#include "probe.h"
-
-/*
- * This is a special case code to check for an MDRAID device. We do
- * this special since it requires checking for a superblock at the end
- * of the device.
- */
-static int check_mdraid(int fd, unsigned char *ret_uuid)
-{
- struct mdp_superblock_s *md;
- blkid_loff_t offset;
- char buf[4096];
-
- if (fd < 0)
- return -BLKID_ERR_PARAM;
-
- offset = (blkid_get_dev_size(fd) & ~((blkid_loff_t)65535)) - 65536;
-
- if (blkid_llseek(fd, offset, 0) < 0 ||
- read(fd, buf, 4096) != 4096)
- return -BLKID_ERR_IO;
-
- /* Check for magic number */
- if (memcmp("\251+N\374", buf, 4))
- return -BLKID_ERR_PARAM;
-
- if (!ret_uuid)
- return 0;
- *ret_uuid = 0;
-
- /* The MD UUID is not contiguous in the superblock, make it so */
- md = (struct mdp_superblock_s *)buf;
- if (md->set_uuid0 || md->set_uuid1 || md->set_uuid2 || md->set_uuid3) {
- memcpy(ret_uuid, &md->set_uuid0, 4);
- memcpy(ret_uuid, &md->set_uuid1, 12);
- }
- return 0;
-}
-
-static void set_uuid(blkid_dev dev, uuid_t uuid)
-{
- char str[37];
-
- if (!uuid_is_null(uuid)) {
- uuid_unparse(uuid, str);
- blkid_set_tag(dev, "UUID", str, sizeof(str));
- }
-}
-
-static void get_ext2_info(blkid_dev dev, unsigned char *buf)
-{
- struct ext2_super_block *es = (struct ext2_super_block *) buf;
- const char *label = 0;
-
- DBG(DEBUG_PROBE, printf("ext2_sb.compat = %08X:%08X:%08X\n",
- blkid_le32(es->s_feature_compat),
- blkid_le32(es->s_feature_incompat),
- blkid_le32(es->s_feature_ro_compat)));
-
- if (strlen(es->s_volume_name))
- label = es->s_volume_name;
- blkid_set_tag(dev, "LABEL", label, sizeof(es->s_volume_name));
-
- set_uuid(dev, es->s_uuid);
-}
-
-static int probe_ext3(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct ext2_super_block *es;
-
- es = (struct ext2_super_block *)buf;
-
- /* Distinguish between jbd and ext2/3 fs */
- if (blkid_le32(es->s_feature_incompat) &
- EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
- return -BLKID_ERR_PARAM;
-
- /* Distinguish between ext3 and ext2 */
- if (!(blkid_le32(es->s_feature_compat) &
- EXT3_FEATURE_COMPAT_HAS_JOURNAL))
- return -BLKID_ERR_PARAM;
-
- get_ext2_info(dev, buf);
-
- blkid_set_tag(dev, "SEC_TYPE", "ext2", sizeof("ext2"));
-
- return 0;
-}
-
-static int probe_ext2(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct ext2_super_block *es;
-
- es = (struct ext2_super_block *)buf;
-
- /* Distinguish between jbd and ext2/3 fs */
- if (blkid_le32(es->s_feature_incompat) &
- EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)
- return -BLKID_ERR_PARAM;
-
- get_ext2_info(dev, buf);
-
- return 0;
-}
-
-static int probe_jbd(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct ext2_super_block *es = (struct ext2_super_block *) buf;
-
- if (!(blkid_le32(es->s_feature_incompat) &
- EXT3_FEATURE_INCOMPAT_JOURNAL_DEV))
- return -BLKID_ERR_PARAM;
-
- get_ext2_info(dev, buf);
-
- return 0;
-}
-
-static int probe_vfat(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct vfat_super_block *vs;
- char serno[10];
- const char *label = 0;
- int label_len = 0;
-
- vs = (struct vfat_super_block *)buf;
-
- if (strncmp(vs->vs_label, "NO NAME", 7)) {
- char *end = vs->vs_label + sizeof(vs->vs_label) - 1;
-
- while (*end == ' ' && end >= vs->vs_label)
- --end;
- if (end >= vs->vs_label) {
- label = vs->vs_label;
- label_len = end - vs->vs_label + 1;
- }
- }
-
- /* We can't just print them as %04X, because they are unaligned */
- sprintf(serno, "%02X%02X-%02X%02X", vs->vs_serno[3], vs->vs_serno[2],
- vs->vs_serno[1], vs->vs_serno[0]);
- blkid_set_tag(dev, "LABEL", label, label_len);
- blkid_set_tag(dev, "UUID", serno, sizeof(serno));
-
- return 0;
-}
-
-static int probe_msdos(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct msdos_super_block *ms = (struct msdos_super_block *) buf;
- char serno[10];
- const char *label = 0;
- int label_len = 0;
-
- if (strncmp(ms->ms_label, "NO NAME", 7)) {
- char *end = ms->ms_label + sizeof(ms->ms_label) - 1;
-
- while (*end == ' ' && end >= ms->ms_label)
- --end;
- if (end >= ms->ms_label) {
- label = ms->ms_label;
- label_len = end - ms->ms_label + 1;
- }
- }
-
- /* We can't just print them as %04X, because they are unaligned */
- sprintf(serno, "%02X%02X-%02X%02X", ms->ms_serno[3], ms->ms_serno[2],
- ms->ms_serno[1], ms->ms_serno[0]);
- blkid_set_tag(dev, "UUID", serno, 0);
- blkid_set_tag(dev, "LABEL", label, label_len);
- blkid_set_tag(dev, "SEC_TYPE", "msdos", sizeof("msdos"));
-
- return 0;
-}
-
-static int probe_xfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct xfs_super_block *xs;
- const char *label = 0;
-
- xs = (struct xfs_super_block *)buf;
-
- if (strlen(xs->xs_fname))
- label = xs->xs_fname;
- blkid_set_tag(dev, "LABEL", label, sizeof(xs->xs_fname));
- set_uuid(dev, xs->xs_uuid);
- return 0;
-}
-
-static int probe_reiserfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id, unsigned char *buf)
-{
- struct reiserfs_super_block *rs = (struct reiserfs_super_block *) buf;
- unsigned int blocksize;
- const char *label = 0;
-
- blocksize = blkid_le16(rs->rs_blocksize);
-
- /* If the superblock is inside the journal, we have the wrong one */
- if (id->bim_kboff/(blocksize>>10) > blkid_le32(rs->rs_journal_block))
- return -BLKID_ERR_BIG;
-
- /* LABEL/UUID are only valid for later versions of Reiserfs v3.6. */
- if (!strcmp(id->bim_magic, "ReIsEr2Fs") ||
- !strcmp(id->bim_magic, "ReIsEr3Fs")) {
- if (strlen(rs->rs_label))
- label = rs->rs_label;
- set_uuid(dev, rs->rs_uuid);
- }
- blkid_set_tag(dev, "LABEL", label, sizeof(rs->rs_label));
-
- return 0;
-}
-
-static int probe_jfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct jfs_super_block *js;
- const char *label = 0;
-
- js = (struct jfs_super_block *)buf;
-
- if (strlen((char *) js->js_label))
- label = (char *) js->js_label;
- blkid_set_tag(dev, "LABEL", label, sizeof(js->js_label));
- set_uuid(dev, js->js_uuid);
- return 0;
-}
-
-static int probe_romfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct romfs_super_block *ros;
- const char *label = 0;
-
- ros = (struct romfs_super_block *)buf;
-
- if (strlen((char *) ros->ros_volume))
- label = (char *) ros->ros_volume;
- blkid_set_tag(dev, "LABEL", label, 0);
- return 0;
-}
-
-static int probe_cramfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct cramfs_super_block *csb;
- const char *label = 0;
-
- csb = (struct cramfs_super_block *)buf;
-
- if (strlen((char *) csb->name))
- label = (char *) csb->name;
- blkid_set_tag(dev, "LABEL", label, 0);
- return 0;
-}
-
-static int probe_swap0(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf __BLKID_ATTR((unused)))
-{
- blkid_set_tag(dev, "UUID", 0, 0);
- blkid_set_tag(dev, "LABEL", 0, 0);
- return 0;
-}
-
-static int probe_swap1(int fd,
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf __BLKID_ATTR((unused)))
-{
- struct swap_id_block *sws;
-
- probe_swap0(fd, cache, dev, id, buf);
- /*
- * Version 1 swap headers are always located at offset of 1024
- * bytes, although the swap signature itself is located at the
- * end of the page (which may vary depending on hardware
- * pagesize).
- */
- if (lseek(fd, 1024, SEEK_SET) < 0) return 1;
- sws = xmalloc(1024);
- if (read(fd, sws, 1024) != 1024) {
- free(sws);
- return 1;
- }
-
- /* arbitrary sanity check.. is there any garbage down there? */
- if (sws->sws_pad[32] == 0 && sws->sws_pad[33] == 0) {
- if (sws->sws_volume[0])
- blkid_set_tag(dev, "LABEL", (const char*)sws->sws_volume,
- sizeof(sws->sws_volume));
- if (sws->sws_uuid[0])
- set_uuid(dev, sws->sws_uuid);
- }
- free(sws);
-
- return 0;
-}
-
-static const char
-* const udf_magic[] = { "BEA01", "BOOT2", "CD001", "CDW02", "NSR02",
- "NSR03", "TEA01", 0 };
-
-static int probe_udf(int fd, blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev __BLKID_ATTR((unused)),
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf __BLKID_ATTR((unused)))
-{
- int j, bs;
- struct iso_volume_descriptor isosb;
- const char * const * m;
-
- /* determine the block size by scanning in 2K increments
- (block sizes larger than 2K will be null padded) */
- for (bs = 1; bs < 16; bs++) {
- lseek(fd, bs*2048+32768, SEEK_SET);
- if (read(fd, (char *)&isosb, sizeof(isosb)) != sizeof(isosb))
- return 1;
- if (isosb.id[0])
- break;
- }
-
- /* Scan up to another 64 blocks looking for additional VSD's */
- for (j = 1; j < 64; j++) {
- if (j > 1) {
- lseek(fd, j*bs*2048+32768, SEEK_SET);
- if (read(fd, (char *)&isosb, sizeof(isosb))
- != sizeof(isosb))
- return 1;
- }
- /* If we find NSR0x then call it udf:
- NSR01 for UDF 1.00
- NSR02 for UDF 1.50
- NSR03 for UDF 2.00 */
- if (!strncmp(isosb.id, "NSR0", 4))
- return 0;
- for (m = udf_magic; *m; m++)
- if (!strncmp(*m, isosb.id, 5))
- break;
- if (*m == 0)
- return 1;
- }
- return 1;
-}
-
-static int probe_ocfs(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct ocfs_volume_header ovh;
- struct ocfs_volume_label ovl;
- __u32 major;
-
- memcpy(&ovh, buf, sizeof(ovh));
- memcpy(&ovl, buf+512, sizeof(ovl));
-
- major = ocfsmajor(ovh);
- if (major == 1)
- blkid_set_tag(dev,"SEC_TYPE","ocfs1",sizeof("ocfs1"));
- else if (major >= 9)
- blkid_set_tag(dev,"SEC_TYPE","ntocfs",sizeof("ntocfs"));
-
- blkid_set_tag(dev, "LABEL", (const char*)ovl.label, ocfslabellen(ovl));
- blkid_set_tag(dev, "MOUNT", (const char*)ovh.mount, ocfsmountlen(ovh));
- set_uuid(dev, ovl.vol_id);
- return 0;
-}
-
-static int probe_ocfs2(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct ocfs2_super_block *osb;
-
- osb = (struct ocfs2_super_block *)buf;
-
- blkid_set_tag(dev, "LABEL", (const char*)osb->s_label, sizeof(osb->s_label));
- set_uuid(dev, osb->s_uuid);
- return 0;
-}
-
-static int probe_oracleasm(int fd __BLKID_ATTR((unused)),
- blkid_cache cache __BLKID_ATTR((unused)),
- blkid_dev dev,
- const struct blkid_magic *id __BLKID_ATTR((unused)),
- unsigned char *buf)
-{
- struct oracle_asm_disk_label *dl;
-
- dl = (struct oracle_asm_disk_label *)buf;
-
- blkid_set_tag(dev, "LABEL", dl->dl_id, sizeof(dl->dl_id));
- return 0;
-}
-
-/*
- * BLKID_BLK_OFFS is at least as large as the highest bim_kboff defined
- * in the type_array table below + bim_kbalign.
- *
- * When probing for a lot of magics, we handle everything in 1kB buffers so
- * that we don't have to worry about reading each combination of block sizes.
- */
-#define BLKID_BLK_OFFS 64 /* currently reiserfs */
-
-/*
- * Various filesystem magics that we can check for. Note that kboff and
- * sboff are in kilobytes and bytes respectively. All magics are in
- * byte strings so we don't worry about endian issues.
- */
-static const struct blkid_magic type_array[] = {
-/* type kboff sboff len magic probe */
- { "oracleasm", 0, 32, 8, "ORCLDISK", probe_oracleasm },
- { "ntfs", 0, 3, 8, "NTFS ", 0 },
- { "jbd", 1, 0x38, 2, "\123\357", probe_jbd },
- { "ext3", 1, 0x38, 2, "\123\357", probe_ext3 },
- { "ext2", 1, 0x38, 2, "\123\357", probe_ext2 },
- { "reiserfs", 8, 0x34, 8, "ReIsErFs", probe_reiserfs },
- { "reiserfs", 64, 0x34, 9, "ReIsEr2Fs", probe_reiserfs },
- { "reiserfs", 64, 0x34, 9, "ReIsEr3Fs", probe_reiserfs },
- { "reiserfs", 64, 0x34, 8, "ReIsErFs", probe_reiserfs },
- { "reiserfs", 8, 20, 8, "ReIsErFs", probe_reiserfs },
- { "vfat", 0, 0x52, 5, "MSWIN", probe_vfat },
- { "vfat", 0, 0x52, 8, "FAT32 ", probe_vfat },
- { "vfat", 0, 0x36, 5, "MSDOS", probe_msdos },
- { "vfat", 0, 0x36, 8, "FAT16 ", probe_msdos },
- { "vfat", 0, 0x36, 8, "FAT12 ", probe_msdos },
- { "minix", 1, 0x10, 2, "\177\023", 0 },
- { "minix", 1, 0x10, 2, "\217\023", 0 },
- { "minix", 1, 0x10, 2, "\150\044", 0 },
- { "minix", 1, 0x10, 2, "\170\044", 0 },
- { "vxfs", 1, 0, 4, "\365\374\001\245", 0 },
- { "xfs", 0, 0, 4, "XFSB", probe_xfs },
- { "romfs", 0, 0, 8, "-rom1fs-", probe_romfs },
- { "bfs", 0, 0, 4, "\316\372\173\033", 0 },
- { "cramfs", 0, 0, 4, "E=\315\050", probe_cramfs },
- { "qnx4", 0, 4, 6, "QNX4FS", 0 },
- { "udf", 32, 1, 5, "BEA01", probe_udf },
- { "udf", 32, 1, 5, "BOOT2", probe_udf },
- { "udf", 32, 1, 5, "CD001", probe_udf },
- { "udf", 32, 1, 5, "CDW02", probe_udf },
- { "udf", 32, 1, 5, "NSR02", probe_udf },
- { "udf", 32, 1, 5, "NSR03", probe_udf },
- { "udf", 32, 1, 5, "TEA01", probe_udf },
- { "iso9660", 32, 1, 5, "CD001", 0 },
- { "iso9660", 32, 9, 5, "CDROM", 0 },
- { "jfs", 32, 0, 4, "JFS1", probe_jfs },
- { "hfs", 1, 0, 2, "BD", 0 },
- { "ufs", 8, 0x55c, 4, "T\031\001\000", 0 },
- { "hpfs", 8, 0, 4, "I\350\225\371", 0 },
- { "sysv", 0, 0x3f8, 4, "\020~\030\375", 0 },
- { "swap", 0, 0xff6, 10, "SWAP-SPACE", probe_swap0 },
- { "swap", 0, 0xff6, 10, "SWAPSPACE2", probe_swap1 },
- { "swap", 0, 0x1ff6, 10, "SWAP-SPACE", probe_swap0 },
- { "swap", 0, 0x1ff6, 10, "SWAPSPACE2", probe_swap1 },
- { "swap", 0, 0x3ff6, 10, "SWAP-SPACE", probe_swap0 },
- { "swap", 0, 0x3ff6, 10, "SWAPSPACE2", probe_swap1 },
- { "swap", 0, 0x7ff6, 10, "SWAP-SPACE", probe_swap0 },
- { "swap", 0, 0x7ff6, 10, "SWAPSPACE2", probe_swap1 },
- { "swap", 0, 0xfff6, 10, "SWAP-SPACE", probe_swap0 },
- { "swap", 0, 0xfff6, 10, "SWAPSPACE2", probe_swap1 },
- { "ocfs", 0, 8, 9, "OracleCFS", probe_ocfs },
- { "ocfs2", 1, 0, 6, "OCFSV2", probe_ocfs2 },
- { "ocfs2", 2, 0, 6, "OCFSV2", probe_ocfs2 },
- { "ocfs2", 4, 0, 6, "OCFSV2", probe_ocfs2 },
- { "ocfs2", 8, 0, 6, "OCFSV2", probe_ocfs2 },
- { NULL, 0, 0, 0, NULL, NULL }
-};
-
-/*
- * Verify that the data in dev is consistent with what is on the actual
- * block device (using the devname field only). Normally this will be
- * called when finding items in the cache, but for long running processes
- * is also desirable to revalidate an item before use.
- *
- * If we are unable to revalidate the data, we return the old data and
- * do not set the BLKID_BID_FL_VERIFIED flag on it.
- */
-blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev)
-{
- const struct blkid_magic *id;
- unsigned char *bufs[BLKID_BLK_OFFS + 1], *buf;
- const char *type;
- struct stat st;
- time_t diff, now;
- int fd, idx;
-
- if (!dev)
- return NULL;
-
- now = time(0);
- diff = now - dev->bid_time;
-
- if ((now < dev->bid_time) ||
- (diff < BLKID_PROBE_MIN) ||
- (dev->bid_flags & BLKID_BID_FL_VERIFIED &&
- diff < BLKID_PROBE_INTERVAL))
- return dev;
-
- DBG(DEBUG_PROBE,
- printf("need to revalidate %s (time since last check %lu)\n",
- dev->bid_name, diff));
-
- if (((fd = open(dev->bid_name, O_RDONLY)) < 0) ||
- (fstat(fd, &st) < 0)) {
- if (errno == ENXIO || errno == ENODEV || errno == ENOENT) {
- blkid_free_dev(dev);
- return NULL;
- }
- /* We don't have read permission, just return cache data. */
- DBG(DEBUG_PROBE,
- printf("returning unverified data for %s\n",
- dev->bid_name));
- return dev;
- }
-
- memset(bufs, 0, sizeof(bufs));
-
- /*
- * Iterate over the type array. If we already know the type,
- * then try that first. If it doesn't work, then blow away
- * the type information, and try again.
- *
- */
-try_again:
- type = 0;
- if (!dev->bid_type || !strcmp(dev->bid_type, "mdraid")) {
- uuid_t uuid;
-
- if (check_mdraid(fd, uuid) == 0) {
- set_uuid(dev, uuid);
- type = "mdraid";
- goto found_type;
- }
- }
- for (id = type_array; id->bim_type; id++) {
- if (dev->bid_type &&
- strcmp(id->bim_type, dev->bid_type))
- continue;
-
- idx = id->bim_kboff + (id->bim_sboff >> 10);
- if (idx > BLKID_BLK_OFFS || idx < 0)
- continue;
- buf = bufs[idx];
- if (!buf) {
- if (lseek(fd, idx << 10, SEEK_SET) < 0)
- continue;
-
- buf = xmalloc(1024);
-
- if (read(fd, buf, 1024) != 1024) {
- free(buf);
- continue;
- }
- bufs[idx] = buf;
- }
-
- if (memcmp(id->bim_magic, buf + (id->bim_sboff&0x3ff),
- id->bim_len))
- continue;
-
- if ((id->bim_probe == NULL) ||
- (id->bim_probe(fd, cache, dev, id, buf) == 0)) {
- type = id->bim_type;
- goto found_type;
- }
- }
-
- if (!id->bim_type && dev->bid_type) {
- /*
- * Zap the device filesystem type and try again
- */
- blkid_set_tag(dev, "TYPE", 0, 0);
- blkid_set_tag(dev, "SEC_TYPE", 0, 0);
- blkid_set_tag(dev, "LABEL", 0, 0);
- blkid_set_tag(dev, "UUID", 0, 0);
- goto try_again;
- }
-
- if (!dev->bid_type) {
- blkid_free_dev(dev);
- return NULL;
- }
-
-found_type:
- if (dev && type) {
- dev->bid_devno = st.st_rdev;
- dev->bid_time = time(0);
- dev->bid_flags |= BLKID_BID_FL_VERIFIED;
- cache->bic_flags |= BLKID_BIC_FL_CHANGED;
-
- blkid_set_tag(dev, "TYPE", type, 0);
-
- DBG(DEBUG_PROBE, printf("%s: devno 0x%04llx, type %s\n",
- dev->bid_name, st.st_rdev, type));
- }
-
- close(fd);
-
- return dev;
-}
-
-int blkid_known_fstype(const char *fstype)
-{
- const struct blkid_magic *id;
-
- for (id = type_array; id->bim_type; id++) {
- if (strcmp(fstype, id->bim_type) == 0)
- return 1;
- }
- return 0;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char **argv)
-{
- blkid_dev dev;
- blkid_cache cache;
- int ret;
-
- blkid_debug_mask = DEBUG_ALL;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s device\n"
- "Probe a single device to determine type\n", argv[0]);
- exit(1);
- }
- if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
- dev = blkid_get_dev(cache, argv[1], BLKID_DEV_NORMAL);
- if (!dev) {
- printf("%s: %s has an unsupported type\n", argv[0], argv[1]);
- return 1;
- }
- printf("%s is type %s\n", argv[1], dev->bid_type ?
- dev->bid_type : "(null)");
- if (dev->bid_label)
- printf("\tlabel is '%s'\n", dev->bid_label);
- if (dev->bid_uuid)
- printf("\tuuid is %s\n", dev->bid_uuid);
-
- blkid_free_dev(dev);
- return 0;
-}
-#endif
diff --git a/e2fsprogs/blkid/probe.h b/e2fsprogs/blkid/probe.h
deleted file mode 100644
index 78f7964..0000000
--- a/e2fsprogs/blkid/probe.h
+++ /dev/null
@@ -1,375 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * probe.h - constants and on-disk structures for extracting device data
- *
- * Copyright (C) 1999 by Andries Brouwer
- * Copyright (C) 1999, 2000, 2003 by Theodore Ts'o
- * Copyright (C) 2001 by Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#ifndef _BLKID_PROBE_H
-#define _BLKID_PROBE_H
-
-#include <linux/types.h>
-
-struct blkid_magic;
-
-typedef int (*blkid_probe_t)(int fd, blkid_cache cache, blkid_dev dev,
- const struct blkid_magic *id, unsigned char *buf);
-
-struct blkid_magic {
- const char *bim_type; /* type name for this magic */
- long bim_kboff; /* kilobyte offset of superblock */
- unsigned bim_sboff; /* byte offset within superblock */
- unsigned bim_len; /* length of magic */
- const char *bim_magic; /* magic string */
- blkid_probe_t bim_probe; /* probe function */
-};
-
-/*
- * Structures for each of the content types we want to extract information
- * from. We do not necessarily need the magic field here, because we have
- * already identified the content type before we get this far. It may still
- * be useful if there are probe functions which handle multiple content types.
- */
-struct ext2_super_block {
- __u32 s_inodes_count;
- __u32 s_blocks_count;
- __u32 s_r_blocks_count;
- __u32 s_free_blocks_count;
- __u32 s_free_inodes_count;
- __u32 s_first_data_block;
- __u32 s_log_block_size;
- __u32 s_dummy3[7];
- unsigned char s_magic[2];
- __u16 s_state;
- __u32 s_dummy5[8];
- __u32 s_feature_compat;
- __u32 s_feature_incompat;
- __u32 s_feature_ro_compat;
- unsigned char s_uuid[16];
- char s_volume_name[16];
-};
-#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x00000004
-#define EXT3_FEATURE_INCOMPAT_RECOVER 0x00000004
-#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x00000008
-
-struct xfs_super_block {
- unsigned char xs_magic[4];
- __u32 xs_blocksize;
- __u64 xs_dblocks;
- __u64 xs_rblocks;
- __u32 xs_dummy1[2];
- unsigned char xs_uuid[16];
- __u32 xs_dummy2[15];
- char xs_fname[12];
- __u32 xs_dummy3[2];
- __u64 xs_icount;
- __u64 xs_ifree;
- __u64 xs_fdblocks;
-};
-
-struct reiserfs_super_block {
- __u32 rs_blocks_count;
- __u32 rs_free_blocks;
- __u32 rs_root_block;
- __u32 rs_journal_block;
- __u32 rs_journal_dev;
- __u32 rs_orig_journal_size;
- __u32 rs_dummy2[5];
- __u16 rs_blocksize;
- __u16 rs_dummy3[3];
- unsigned char rs_magic[12];
- __u32 rs_dummy4[5];
- unsigned char rs_uuid[16];
- char rs_label[16];
-};
-
-struct jfs_super_block {
- unsigned char js_magic[4];
- __u32 js_version;
- __u64 js_size;
- __u32 js_bsize;
- __u32 js_dummy1;
- __u32 js_pbsize;
- __u32 js_dummy2[27];
- unsigned char js_uuid[16];
- unsigned char js_label[16];
- unsigned char js_loguuid[16];
-};
-
-struct romfs_super_block {
- unsigned char ros_magic[8];
- __u32 ros_dummy1[2];
- unsigned char ros_volume[16];
-};
-
-struct cramfs_super_block {
- __u8 magic[4];
- __u32 size;
- __u32 flags;
- __u32 future;
- __u8 signature[16];
- struct cramfs_info {
- __u32 crc;
- __u32 edition;
- __u32 blocks;
- __u32 files;
- } info;
- __u8 name[16];
-};
-
-struct swap_id_block {
-/* unsigned char sws_boot[1024]; */
- __u32 sws_version;
- __u32 sws_lastpage;
- __u32 sws_nrbad;
- unsigned char sws_uuid[16];
- char sws_volume[16];
- unsigned char sws_pad[117];
- __u32 sws_badpg;
-};
-
-/* Yucky misaligned values */
-struct vfat_super_block {
-/* 00*/ unsigned char vs_ignored[3];
-/* 03*/ unsigned char vs_sysid[8];
-/* 0b*/ unsigned char vs_sector_size[2];
-/* 0d*/ __u8 vs_cluster_size;
-/* 0e*/ __u16 vs_reserved;
-/* 10*/ __u8 vs_fats;
-/* 11*/ unsigned char vs_dir_entries[2];
-/* 13*/ unsigned char vs_sectors[2];
-/* 15*/ unsigned char vs_media;
-/* 16*/ __u16 vs_fat_length;
-/* 18*/ __u16 vs_secs_track;
-/* 1a*/ __u16 vs_heads;
-/* 1c*/ __u32 vs_hidden;
-/* 20*/ __u32 vs_total_sect;
-/* 24*/ __u32 vs_fat32_length;
-/* 28*/ __u16 vs_flags;
-/* 2a*/ __u8 vs_version[2];
-/* 2c*/ __u32 vs_root_cluster;
-/* 30*/ __u16 vs_insfo_sector;
-/* 32*/ __u16 vs_backup_boot;
-/* 34*/ __u16 vs_reserved2[6];
-/* 40*/ unsigned char vs_unknown[3];
-/* 43*/ unsigned char vs_serno[4];
-/* 47*/ char vs_label[11];
-/* 52*/ unsigned char vs_magic[8];
-/* 5a*/ unsigned char vs_dummy2[164];
-/*1fe*/ unsigned char vs_pmagic[2];
-};
-
-/* Yucky misaligned values */
-struct msdos_super_block {
-/* 00*/ unsigned char ms_ignored[3];
-/* 03*/ unsigned char ms_sysid[8];
-/* 0b*/ unsigned char ms_sector_size[2];
-/* 0d*/ __u8 ms_cluster_size;
-/* 0e*/ __u16 ms_reserved;
-/* 10*/ __u8 ms_fats;
-/* 11*/ unsigned char ms_dir_entries[2];
-/* 13*/ unsigned char ms_sectors[2];
-/* 15*/ unsigned char ms_media;
-/* 16*/ __u16 ms_fat_length;
-/* 18*/ __u16 ms_secs_track;
-/* 1a*/ __u16 ms_heads;
-/* 1c*/ __u32 ms_hidden;
-/* 20*/ __u32 ms_total_sect;
-/* 24*/ unsigned char ms_unknown[3];
-/* 27*/ unsigned char ms_serno[4];
-/* 2b*/ char ms_label[11];
-/* 36*/ unsigned char ms_magic[8];
-/* 3d*/ unsigned char ms_dummy2[192];
-/*1fe*/ unsigned char ms_pmagic[2];
-};
-
-struct minix_super_block {
- __u16 ms_ninodes;
- __u16 ms_nzones;
- __u16 ms_imap_blocks;
- __u16 ms_zmap_blocks;
- __u16 ms_firstdatazone;
- __u16 ms_log_zone_size;
- __u32 ms_max_size;
- unsigned char ms_magic[2];
- __u16 ms_state;
- __u32 ms_zones;
-};
-
-struct mdp_superblock_s {
- __u32 md_magic;
- __u32 major_version;
- __u32 minor_version;
- __u32 patch_version;
- __u32 gvalid_words;
- __u32 set_uuid0;
- __u32 ctime;
- __u32 level;
- __u32 size;
- __u32 nr_disks;
- __u32 raid_disks;
- __u32 md_minor;
- __u32 not_persistent;
- __u32 set_uuid1;
- __u32 set_uuid2;
- __u32 set_uuid3;
-};
-
-struct hfs_super_block {
- char h_magic[2];
- char h_dummy[18];
- __u32 h_blksize;
-};
-
-struct ocfs_volume_header {
- unsigned char minor_version[4];
- unsigned char major_version[4];
- unsigned char signature[128];
- char mount[128];
- unsigned char mount_len[2];
-};
-
-struct ocfs_volume_label {
- unsigned char disk_lock[48];
- char label[64];
- unsigned char label_len[2];
- unsigned char vol_id[16];
- unsigned char vol_id_len[2];
-};
-
-#define ocfsmajor(o) ((__u32)o.major_version[0] \
- + (((__u32) o.major_version[1]) << 8) \
- + (((__u32) o.major_version[2]) << 16) \
- + (((__u32) o.major_version[3]) << 24))
-#define ocfslabellen(o) ((__u32)o.label_len[0] + (((__u32) o.label_len[1]) << 8))
-#define ocfsmountlen(o) ((__u32)o.mount_len[0] + (((__u32) o.mount_len[1])<<8))
-
-#define OCFS_MAGIC "OracleCFS"
-
-struct ocfs2_super_block {
- unsigned char signature[8];
- unsigned char s_dummy1[184];
- unsigned char s_dummy2[80];
- char s_label[64];
- unsigned char s_uuid[16];
-};
-
-#define OCFS2_MIN_BLOCKSIZE 512
-#define OCFS2_MAX_BLOCKSIZE 4096
-
-#define OCFS2_SUPER_BLOCK_BLKNO 2
-
-#define OCFS2_SUPER_BLOCK_SIGNATURE "OCFSV2"
-
-struct oracle_asm_disk_label {
- char dummy[32];
- char dl_tag[8];
- char dl_id[24];
-};
-
-#define ORACLE_ASM_DISK_LABEL_MARKED "ORCLDISK"
-#define ORACLE_ASM_DISK_LABEL_OFFSET 32
-
-#define ISODCL(from, to) (to - from + 1)
-struct iso_volume_descriptor {
- char type[ISODCL(1,1)]; /* 711 */
- char id[ISODCL(2,6)];
- char version[ISODCL(7,7)];
- char data[ISODCL(8,2048)];
-};
-
-/*
- * Byte swap functions
- */
-#ifdef __GNUC__
-#define _INLINE_ static __inline__
-#else /* For Watcom C */
-#define _INLINE_ static inline
-#endif
-
-static __u16 blkid_swab16(__u16 val);
-static __u32 blkid_swab32(__u32 val);
-static __u64 blkid_swab64(__u64 val);
-
-#if ((defined __GNUC__) && \
- (defined(__i386__) || defined(__i486__) || defined(__i586__)))
-
-#define _BLKID_HAVE_ASM_BITOPS_
-
-_INLINE_ __u32 blkid_swab32(__u32 val)
-{
-#ifdef EXT2FS_REQUIRE_486
- __asm__("bswap %0" : "=r" (val) : "0" (val));
-#else
- __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */
- "rorl $16,%0\n\t" /* swap words */
- "xchgb %b0,%h0" /* swap higher bytes */
- :"=q" (val)
- : "0" (val));
-#endif
- return val;
-}
-
-_INLINE_ __u16 blkid_swab16(__u16 val)
-{
- __asm__("xchgb %b0,%h0" /* swap bytes */ \
- : "=q" (val) \
- : "0" (val)); \
- return val;
-}
-
-_INLINE_ __u64 blkid_swab64(__u64 val)
-{
- return blkid_swab32(val >> 32) |
- ( ((__u64)blkid_swab32((__u32)val)) << 32 );
-}
-#endif
-
-#if !defined(_BLKID_HAVE_ASM_BITOPS_)
-
-_INLINE_ __u16 blkid_swab16(__u16 val)
-{
- return (val >> 8) | (val << 8);
-}
-
-_INLINE_ __u32 blkid_swab32(__u32 val)
-{
- return (val>>24) | ((val>>8) & 0xFF00) |
- ((val<<8) & 0xFF0000) | (val<<24);
-}
-
-_INLINE_ __u64 blkid_swab64(__u64 val)
-{
- return blkid_swab32(val >> 32) |
- ( ((__u64)blkid_swab32((__u32)val)) << 32 );
-}
-#endif
-
-
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define blkid_le16(x) blkid_swab16(x)
-#define blkid_le32(x) blkid_swab32(x)
-#define blkid_le64(x) blkid_swab64(x)
-#define blkid_be16(x) (x)
-#define blkid_be32(x) (x)
-#define blkid_be64(x) (x)
-#else
-#define blkid_le16(x) (x)
-#define blkid_le32(x) (x)
-#define blkid_le64(x) (x)
-#define blkid_be16(x) blkid_swab16(x)
-#define blkid_be32(x) blkid_swab32(x)
-#define blkid_be64(x) blkid_swab64(x)
-#endif
-
-#undef _INLINE_
-
-#endif /* _BLKID_PROBE_H */
diff --git a/e2fsprogs/blkid/read.c b/e2fsprogs/blkid/read.c
deleted file mode 100644
index bb02a2e..0000000
--- a/e2fsprogs/blkid/read.c
+++ /dev/null
@@ -1,462 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * read.c - read the blkid cache from disk, to avoid scanning all devices
- *
- * Copyright (C) 2001, 2003 Theodore Y. Ts'o
- * Copyright (C) 2001 Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "blkidP.h"
-#include "../uuid/uuid.h"
-
-#ifdef HAVE_STRTOULL
-#define __USE_ISOC9X
-#define STRTOULL strtoull /* defined in stdlib.h if you try hard enough */
-#else
-/* FIXME: need to support real strtoull here */
-#define STRTOULL strtoul
-#endif
-
-#include <stdlib.h>
-
-#ifdef TEST_PROGRAM
-#define blkid_debug_dump_dev(dev) (debug_dump_dev(dev))
-static void debug_dump_dev(blkid_dev dev);
-#endif
-
-/*
- * File format:
- *
- * <device [<NAME="value"> ...]>device_name</device>
- *
- * The following tags are required for each entry:
- * <ID="id"> unique (within this file) ID number of this device
- * <TIME="time"> (ascii time_t) time this entry was last read from disk
- * <TYPE="type"> (detected) type of filesystem/data for this partition
- *
- * The following tags may be present, depending on the device contents
- * <LABEL="label"> (user supplied) label (volume name, etc)
- * <UUID="uuid"> (generated) universally unique identifier (serial no)
- */
-
-static char *skip_over_blank(char *cp)
-{
- while (*cp && isspace(*cp))
- cp++;
- return cp;
-}
-
-static char *skip_over_word(char *cp)
-{
- char ch;
-
- while ((ch = *cp)) {
- /* If we see a backslash, skip the next character */
- if (ch == '\\') {
- cp++;
- if (*cp == '\0')
- break;
- cp++;
- continue;
- }
- if (isspace(ch) || ch == '<' || ch == '>')
- break;
- cp++;
- }
- return cp;
-}
-
-static char *strip_line(char *line)
-{
- char *p;
-
- line = skip_over_blank(line);
-
- p = line + strlen(line) - 1;
-
- while (*line) {
- if (isspace(*p))
- *p-- = '\0';
- else
- break;
- }
-
- return line;
-}
-
-/*
- * Start parsing a new line from the cache.
- *
- * line starts with "<device" return 1 -> continue parsing line
- * line starts with "<foo", empty, or # return 0 -> skip line
- * line starts with other, return -BLKID_ERR_CACHE -> error
- */
-static int parse_start(char **cp)
-{
- char *p;
-
- p = strip_line(*cp);
-
- /* Skip comment or blank lines. We can't just NUL the first '#' char,
- * in case it is inside quotes, or escaped.
- */
- if (*p == '\0' || *p == '#')
- return 0;
-
- if (!strncmp(p, "<device", 7)) {
- DBG(DEBUG_READ, printf("found device header: %8s\n", p));
- p += 7;
-
- *cp = p;
- return 1;
- }
-
- if (*p == '<')
- return 0;
-
- return -BLKID_ERR_CACHE;
-}
-
-/* Consume the remaining XML on the line (cosmetic only) */
-static int parse_end(char **cp)
-{
- *cp = skip_over_blank(*cp);
-
- if (!strncmp(*cp, "</device>", 9)) {
- DBG(DEBUG_READ, printf("found device trailer %9s\n", *cp));
- *cp += 9;
- return 0;
- }
-
- return -BLKID_ERR_CACHE;
-}
-
-/*
- * Allocate a new device struct with device name filled in. Will handle
- * finding the device on lines of the form:
- * <device foo=bar>devname</device>
- * <device>devname<foo>bar</foo></device>
- */
-static int parse_dev(blkid_cache cache, blkid_dev *dev, char **cp)
-{
- char *start, *tmp, *end, *name;
- int ret;
-
- if ((ret = parse_start(cp)) <= 0)
- return ret;
-
- start = tmp = strchr(*cp, '>');
- if (!start) {
- DBG(DEBUG_READ,
- printf("blkid: short line parsing dev: %s\n", *cp));
- return -BLKID_ERR_CACHE;
- }
- start = skip_over_blank(start + 1);
- end = skip_over_word(start);
-
- DBG(DEBUG_READ, printf("device should be %*s\n", end - start, start));
-
- if (**cp == '>')
- *cp = end;
- else
- (*cp)++;
-
- *tmp = '\0';
-
- if (!(tmp = strrchr(end, '<')) || parse_end(&tmp) < 0) {
- DBG(DEBUG_READ,
- printf("blkid: missing </device> ending: %s\n", end));
- } else if (tmp)
- *tmp = '\0';
-
- if (end - start <= 1) {
- DBG(DEBUG_READ, printf("blkid: empty device name: %s\n", *cp));
- return -BLKID_ERR_CACHE;
- }
-
- name = blkid_strndup(start, end-start);
- if (name == NULL)
- return -BLKID_ERR_MEM;
-
- DBG(DEBUG_READ, printf("found dev %s\n", name));
-
- if (!(*dev = blkid_get_dev(cache, name, BLKID_DEV_CREATE)))
- return -BLKID_ERR_MEM;
-
- free(name);
- return 1;
-}
-
-/*
- * Extract a tag of the form NAME="value" from the line.
- */
-static int parse_token(char **name, char **value, char **cp)
-{
- char *end;
-
- if (!name || !value || !cp)
- return -BLKID_ERR_PARAM;
-
- if (!(*value = strchr(*cp, '=')))
- return 0;
-
- **value = '\0';
- *name = strip_line(*cp);
- *value = skip_over_blank(*value + 1);
-
- if (**value == '"') {
- end = strchr(*value + 1, '"');
- if (!end) {
- DBG(DEBUG_READ,
- printf("unbalanced quotes at: %s\n", *value));
- *cp = *value;
- return -BLKID_ERR_CACHE;
- }
- (*value)++;
- *end = '\0';
- end++;
- } else {
- end = skip_over_word(*value);
- if (*end) {
- *end = '\0';
- end++;
- }
- }
- *cp = end;
-
- return 1;
-}
-
-/*
- * Extract a tag of the form <NAME>value</NAME> from the line.
- */
-/*
-static int parse_xml(char **name, char **value, char **cp)
-{
- char *end;
-
- if (!name || !value || !cp)
- return -BLKID_ERR_PARAM;
-
- *name = strip_line(*cp);
-
- if ((*name)[0] != '<' || (*name)[1] == '/')
- return 0;
-
- FIXME: finish this.
-}
-*/
-
-/*
- * Extract a tag from the line.
- *
- * Return 1 if a valid tag was found.
- * Return 0 if no tag found.
- * Return -ve error code.
- */
-static int parse_tag(blkid_cache cache, blkid_dev dev, char **cp)
-{
- char *name;
- char *value;
- int ret;
-
- if (!cache || !dev)
- return -BLKID_ERR_PARAM;
-
- if ((ret = parse_token(&name, &value, cp)) <= 0 /* &&
- (ret = parse_xml(&name, &value, cp)) <= 0 */)
- return ret;
-
- /* Some tags are stored directly in the device struct */
- if (!strcmp(name, "DEVNO"))
- dev->bid_devno = STRTOULL(value, 0, 0);
- else if (!strcmp(name, "PRI"))
- dev->bid_pri = strtol(value, 0, 0);
- else if (!strcmp(name, "TIME"))
- /* FIXME: need to parse a long long eventually */
- dev->bid_time = strtol(value, 0, 0);
- else
- ret = blkid_set_tag(dev, name, value, strlen(value));
-
- DBG(DEBUG_READ, printf(" tag: %s=\"%s\"\n", name, value));
-
- return ret < 0 ? ret : 1;
-}
-
-/*
- * Parse a single line of data, and return a newly allocated dev struct.
- * Add the new device to the cache struct, if one was read.
- *
- * Lines are of the form <device [TAG="value" ...]>/dev/foo</device>
- *
- * Returns -ve value on error.
- * Returns 0 otherwise.
- * If a valid device was read, *dev_p is non-NULL, otherwise it is NULL
- * (e.g. comment lines, unknown XML content, etc).
- */
-static int blkid_parse_line(blkid_cache cache, blkid_dev *dev_p, char *cp)
-{
- blkid_dev dev;
- int ret;
-
- if (!cache || !dev_p)
- return -BLKID_ERR_PARAM;
-
- *dev_p = NULL;
-
- DBG(DEBUG_READ, printf("line: %s\n", cp));
-
- if ((ret = parse_dev(cache, dev_p, &cp)) <= 0)
- return ret;
-
- dev = *dev_p;
-
- while ((ret = parse_tag(cache, dev, &cp)) > 0) {
- ;
- }
-
- if (dev->bid_type == NULL) {
- DBG(DEBUG_READ,
- printf("blkid: device %s has no TYPE\n",dev->bid_name));
- blkid_free_dev(dev);
- }
-
- DBG(DEBUG_READ, blkid_debug_dump_dev(dev));
-
- return ret;
-}
-
-/*
- * Parse the specified filename, and return the data in the supplied or
- * a newly allocated cache struct. If the file doesn't exist, return a
- * new empty cache struct.
- */
-void blkid_read_cache(blkid_cache cache)
-{
- FILE *file;
- char buf[4096];
- int fd, lineno = 0;
- struct stat st;
-
- if (!cache)
- return;
-
- /*
- * If the file doesn't exist, then we just return an empty
- * struct so that the cache can be populated.
- */
- if ((fd = open(cache->bic_filename, O_RDONLY)) < 0)
- return;
- if (fstat(fd, &st) < 0)
- goto errout;
- if ((st.st_mtime == cache->bic_ftime) ||
- (cache->bic_flags & BLKID_BIC_FL_CHANGED)) {
- DBG(DEBUG_CACHE, printf("skipping re-read of %s\n",
- cache->bic_filename));
- goto errout;
- }
-
- DBG(DEBUG_CACHE, printf("reading cache file %s\n",
- cache->bic_filename));
-
- file = fdopen(fd, "r");
- if (!file)
- goto errout;
-
- while (fgets(buf, sizeof(buf), file)) {
- blkid_dev dev;
- unsigned int end;
-
- lineno++;
- if (buf[0] == 0)
- continue;
- end = strlen(buf) - 1;
- /* Continue reading next line if it ends with a backslash */
- while (buf[end] == '\\' && end < sizeof(buf) - 2 &&
- fgets(buf + end, sizeof(buf) - end, file)) {
- end = strlen(buf) - 1;
- lineno++;
- }
-
- if (blkid_parse_line(cache, &dev, buf) < 0) {
- DBG(DEBUG_READ,
- printf("blkid: bad format on line %d\n", lineno));
- continue;
- }
- }
- fclose(file);
-
- /*
- * Initially we do not need to write out the cache file.
- */
- cache->bic_flags &= ~BLKID_BIC_FL_CHANGED;
- cache->bic_ftime = st.st_mtime;
-
- return;
-errout:
- close(fd);
- return;
-}
-
-#ifdef TEST_PROGRAM
-static void debug_dump_dev(blkid_dev dev)
-{
- struct list_head *p;
-
- if (!dev) {
- printf(" dev: NULL\n");
- return;
- }
-
- printf(" dev: name = %s\n", dev->bid_name);
- printf(" dev: DEVNO=\"0x%0llx\"\n", dev->bid_devno);
- printf(" dev: TIME=\"%lu\"\n", dev->bid_time);
- printf(" dev: PRI=\"%d\"\n", dev->bid_pri);
- printf(" dev: flags = 0x%08X\n", dev->bid_flags);
-
- list_for_each(p, &dev->bid_tags) {
- blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags);
- if (tag)
- printf(" tag: %s=\"%s\"\n", tag->bit_name,
- tag->bit_val);
- else
- printf(" tag: NULL\n");
- }
- puts("");
-}
-
-int main(int argc, char**argv)
-{
- blkid_cache cache = NULL;
- int ret;
-
- blkid_debug_mask = DEBUG_ALL;
- if (argc > 2) {
- fprintf(stderr, "Usage: %s [filename]\n"
- "Test parsing of the cache (filename)\n", argv[0]);
- exit(1);
- }
- if ((ret = blkid_get_cache(&cache, argv[1])) < 0)
- fprintf(stderr, "error %d reading cache file %s\n", ret,
- argv[1] ? argv[1] : BLKID_CACHE_FILE);
-
- blkid_put_cache(cache);
-
- return ret;
-}
-#endif
diff --git a/e2fsprogs/blkid/resolve.c b/e2fsprogs/blkid/resolve.c
deleted file mode 100644
index 7942de2..0000000
--- a/e2fsprogs/blkid/resolve.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * resolve.c - resolve names and tags into specific devices
- *
- * Copyright (C) 2001, 2003 Theodore Ts'o.
- * Copyright (C) 2001 Andreas Dilger
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "blkidP.h"
-#include "probe.h"
-
-/*
- * Find a tagname (e.g. LABEL or UUID) on a specific device.
- */
-char *blkid_get_tag_value(blkid_cache cache, const char *tagname,
- const char *devname)
-{
- blkid_tag found;
- blkid_dev dev;
- blkid_cache c = cache;
- char *ret = NULL;
-
- DBG(DEBUG_RESOLVE, printf("looking for %s on %s\n", tagname, devname));
-
- if (!devname)
- return NULL;
-
- if (!cache) {
- if (blkid_get_cache(&c, NULL) < 0)
- return NULL;
- }
-
- if ((dev = blkid_get_dev(c, devname, BLKID_DEV_NORMAL)) &&
- (found = blkid_find_tag_dev(dev, tagname)))
- ret = blkid_strdup(found->bit_val);
-
- if (!cache)
- blkid_put_cache(c);
-
- return ret;
-}
-
-/*
- * Locate a device name from a token (NAME=value string), or (name, value)
- * pair. In the case of a token, value is ignored. If the "token" is not
- * of the form "NAME=value" and there is no value given, then it is assumed
- * to be the actual devname and a copy is returned.
- */
-char *blkid_get_devname(blkid_cache cache, const char *token,
- const char *value)
-{
- blkid_dev dev;
- blkid_cache c = cache;
- char *t = 0, *v = 0;
- char *ret = NULL;
-
- if (!token)
- return NULL;
-
- if (!cache) {
- if (blkid_get_cache(&c, NULL) < 0)
- return NULL;
- }
-
- DBG(DEBUG_RESOLVE,
- printf("looking for %s%s%s %s\n", token, value ? "=" : "",
- value ? value : "", cache ? "in cache" : "from disk"));
-
- if (!value) {
- if (!strchr(token, '='))
- return blkid_strdup(token);
- blkid_parse_tag_string(token, &t, &v);
- if (!t || !v)
- goto errout;
- token = t;
- value = v;
- }
-
- dev = blkid_find_dev_with_tag(c, token, value);
- if (!dev)
- goto errout;
-
- ret = blkid_strdup(blkid_dev_devname(dev));
-
-errout:
- free(t);
- free(v);
- if (!cache) {
- blkid_put_cache(c);
- }
- return ret;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char **argv)
-{
- char *value;
- blkid_cache cache;
-
- blkid_debug_mask = DEBUG_ALL;
- if (argc != 2 && argc != 3) {
- fprintf(stderr, "Usage:\t%s tagname=value\n"
- "\t%s tagname devname\n"
- "Find which device holds a given token or\n"
- "Find what the value of a tag is in a device\n",
- argv[0], argv[0]);
- exit(1);
- }
- if (blkid_get_cache(&cache, bb_dev_null) < 0) {
- fprintf(stderr, "cannot get blkid cache\n");
- exit(1);
- }
-
- if (argv[2]) {
- value = blkid_get_tag_value(cache, argv[1], argv[2]);
- printf("%s has tag %s=%s\n", argv[2], argv[1],
- value ? value : "<missing>");
- } else {
- value = blkid_get_devname(cache, argv[1], NULL);
- printf("%s has tag %s\n", value ? value : "<none>", argv[1]);
- }
- blkid_put_cache(cache);
- return value ? 0 : 1;
-}
-#endif
diff --git a/e2fsprogs/blkid/save.c b/e2fsprogs/blkid/save.c
deleted file mode 100644
index cdbaabc..0000000
--- a/e2fsprogs/blkid/save.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * save.c - write the cache struct to disk
- *
- * Copyright (C) 2001 by Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-#ifdef HAVE_SYS_MKDEV_H
-#include <sys/mkdev.h>
-#endif
-#ifdef HAVE_ERRNO_H
-#include <errno.h>
-#endif
-#include "blkidP.h"
-
-static int save_dev(blkid_dev dev, FILE *file)
-{
- struct list_head *p;
-
- if (!dev || dev->bid_name[0] != '/')
- return 0;
-
- DBG(DEBUG_SAVE,
- printf("device %s, type %s\n", dev->bid_name, dev->bid_type));
-
- fprintf(file,
- "<device DEVNO=\"0x%04lx\" TIME=\"%lu\"",
- (unsigned long) dev->bid_devno, dev->bid_time);
- if (dev->bid_pri)
- fprintf(file, " PRI=\"%d\"", dev->bid_pri);
- list_for_each(p, &dev->bid_tags) {
- blkid_tag tag = list_entry(p, struct blkid_struct_tag, bit_tags);
- fprintf(file, " %s=\"%s\"", tag->bit_name,tag->bit_val);
- }
- fprintf(file, ">%s</device>\n", dev->bid_name);
-
- return 0;
-}
-
-/*
- * Write out the cache struct to the cache file on disk.
- */
-int blkid_flush_cache(blkid_cache cache)
-{
- struct list_head *p;
- char *tmp = NULL;
- const char *opened = NULL;
- const char *filename;
- FILE *file = NULL;
- int fd, ret = 0;
- struct stat st;
-
- if (!cache)
- return -BLKID_ERR_PARAM;
-
- if (list_empty(&cache->bic_devs) ||
- !(cache->bic_flags & BLKID_BIC_FL_CHANGED)) {
- DBG(DEBUG_SAVE, printf("skipping cache file write\n"));
- return 0;
- }
-
- filename = cache->bic_filename ? cache->bic_filename: BLKID_CACHE_FILE;
-
- /* If we can't write to the cache file, then don't even try */
- if (((ret = stat(filename, &st)) < 0 && errno != ENOENT) ||
- (ret == 0 && access(filename, W_OK) < 0)) {
- DBG(DEBUG_SAVE,
- printf("can't write to cache file %s\n", filename));
- return 0;
- }
-
- /*
- * Try and create a temporary file in the same directory so
- * that in case of error we don't overwrite the cache file.
- * If the cache file doesn't yet exist, it isn't a regular
- * file (e.g. /dev/null or a socket), or we couldn't create
- * a temporary file then we open it directly.
- */
- if (ret == 0 && S_ISREG(st.st_mode)) {
- tmp = xmalloc(strlen(filename) + 8);
- sprintf(tmp, "%s-XXXXXX", filename);
- fd = mkstemp(tmp);
- if (fd >= 0) {
- file = fdopen(fd, "w");
- opened = tmp;
- }
- fchmod(fd, 0644);
- }
-
- if (!file) {
- file = fopen(filename, "w");
- opened = filename;
- }
-
- DBG(DEBUG_SAVE,
- printf("writing cache file %s (really %s)\n",
- filename, opened));
-
- if (!file) {
- ret = errno;
- goto errout;
- }
-
- list_for_each(p, &cache->bic_devs) {
- blkid_dev dev = list_entry(p, struct blkid_struct_dev, bid_devs);
- if (!dev->bid_type)
- continue;
- if ((ret = save_dev(dev, file)) < 0)
- break;
- }
-
- if (ret >= 0) {
- cache->bic_flags &= ~BLKID_BIC_FL_CHANGED;
- ret = 1;
- }
-
- fclose(file);
- if (opened != filename) {
- if (ret < 0) {
- unlink(opened);
- DBG(DEBUG_SAVE,
- printf("unlinked temp cache %s\n", opened));
- } else {
- char *backup;
-
- backup = xmalloc(strlen(filename) + 5);
- sprintf(backup, "%s.old", filename);
- unlink(backup);
- link(filename, backup);
- free(backup);
- rename(opened, filename);
- DBG(DEBUG_SAVE,
- printf("moved temp cache %s\n", opened));
- }
- }
-
-errout:
- free(tmp);
- return ret;
-}
-
-#ifdef TEST_PROGRAM
-int main(int argc, char **argv)
-{
- blkid_cache cache = NULL;
- int ret;
-
- blkid_debug_mask = DEBUG_ALL;
- if (argc > 2) {
- fprintf(stderr, "Usage: %s [filename]\n"
- "Test loading/saving a cache (filename)\n", argv[0]);
- exit(1);
- }
-
- if ((ret = blkid_get_cache(&cache, bb_dev_null)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
- if ((ret = blkid_probe_all(cache)) < 0) {
- fprintf(stderr, "error (%d) probing devices\n", ret);
- exit(1);
- }
- cache->bic_filename = blkid_strdup(argv[1]);
-
- if ((ret = blkid_flush_cache(cache)) < 0) {
- fprintf(stderr, "error (%d) saving cache\n", ret);
- exit(1);
- }
-
- blkid_put_cache(cache);
-
- return ret;
-}
-#endif
diff --git a/e2fsprogs/blkid/tag.c b/e2fsprogs/blkid/tag.c
deleted file mode 100644
index 9e862a5..0000000
--- a/e2fsprogs/blkid/tag.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * tag.c - allocation/initialization/free routines for tag structs
- *
- * Copyright (C) 2001 Andreas Dilger
- * Copyright (C) 2003 Theodore Ts'o
- *
- * %Begin-Header%
- * This file may be redistributed under the terms of the
- * GNU Lesser General Public License.
- * %End-Header%
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "blkidP.h"
-
-static blkid_tag blkid_new_tag(void)
-{
- blkid_tag tag;
-
- if (!(tag = (blkid_tag) calloc(1, sizeof(struct blkid_struct_tag))))
- return NULL;
-
- INIT_LIST_HEAD(&tag->bit_tags);
- INIT_LIST_HEAD(&tag->bit_names);
-
- return tag;
-}
-
-#ifdef CONFIG_BLKID_DEBUG
-void blkid_debug_dump_tag(blkid_tag tag)
-{
- if (!tag) {
- printf(" tag: NULL\n");
- return;
- }
-
- printf(" tag: %s=\"%s\"\n", tag->bit_name, tag->bit_val);
-}
-#endif
-
-void blkid_free_tag(blkid_tag tag)
-{
- if (!tag)
- return;
-
- DBG(DEBUG_TAG, printf(" freeing tag %s=%s\n", tag->bit_name,
- tag->bit_val ? tag->bit_val : "(NULL)"));
- DBG(DEBUG_TAG, blkid_debug_dump_tag(tag));
-
- list_del(&tag->bit_tags); /* list of tags for this device */
- list_del(&tag->bit_names); /* list of tags with this type */
-
- free(tag->bit_name);
- free(tag->bit_val);
- free(tag);
-}
-
-/*
- * Find the desired tag on a device. If value is NULL, then the
- * first such tag is returned, otherwise return only exact tag if found.
- */
-blkid_tag blkid_find_tag_dev(blkid_dev dev, const char *type)
-{
- struct list_head *p;
-
- if (!dev || !type)
- return NULL;
-
- list_for_each(p, &dev->bid_tags) {
- blkid_tag tmp = list_entry(p, struct blkid_struct_tag,
- bit_tags);
-
- if (!strcmp(tmp->bit_name, type))
- return tmp;
- }
- return NULL;
-}
-
-/*
- * Find the desired tag type in the cache.
- * We return the head tag for this tag type.
- */
-static blkid_tag blkid_find_head_cache(blkid_cache cache, const char *type)
-{
- blkid_tag head = NULL, tmp;
- struct list_head *p;
-
- if (!cache || !type)
- return NULL;
-
- list_for_each(p, &cache->bic_tags) {
- tmp = list_entry(p, struct blkid_struct_tag, bit_tags);
- if (!strcmp(tmp->bit_name, type)) {
- DBG(DEBUG_TAG,
- printf(" found cache tag head %s\n", type));
- head = tmp;
- break;
- }
- }
- return head;
-}
-
-/*
- * Set a tag on an existing device.
- *
- * If value is NULL, then delete the tagsfrom the device.
- */
-int blkid_set_tag(blkid_dev dev, const char *name,
- const char *value, const int vlength)
-{
- blkid_tag t = 0, head = 0;
- char *val = 0;
-
- if (!dev || !name)
- return -BLKID_ERR_PARAM;
-
- if (!(val = blkid_strndup(value, vlength)) && value)
- return -BLKID_ERR_MEM;
- t = blkid_find_tag_dev(dev, name);
- if (!value) {
- blkid_free_tag(t);
- } else if (t) {
- if (!strcmp(t->bit_val, val)) {
- /* Same thing, exit */
- free(val);
- return 0;
- }
- free(t->bit_val);
- t->bit_val = val;
- } else {
- /* Existing tag not present, add to device */
- if (!(t = blkid_new_tag()))
- goto errout;
- t->bit_name = blkid_strdup(name);
- t->bit_val = val;
- t->bit_dev = dev;
-
- list_add_tail(&t->bit_tags, &dev->bid_tags);
-
- if (dev->bid_cache) {
- head = blkid_find_head_cache(dev->bid_cache,
- t->bit_name);
- if (!head) {
- head = blkid_new_tag();
- if (!head)
- goto errout;
-
- DBG(DEBUG_TAG,
- printf(" creating new cache tag head %s\n", name));
- head->bit_name = blkid_strdup(name);
- if (!head->bit_name)
- goto errout;
- list_add_tail(&head->bit_tags,
- &dev->bid_cache->bic_tags);
- }
- list_add_tail(&t->bit_names, &head->bit_names);
- }
- }
-
- /* Link common tags directly to the device struct */
- if (!strcmp(name, "TYPE"))
- dev->bid_type = val;
- else if (!strcmp(name, "LABEL"))
- dev->bid_label = val;
- else if (!strcmp(name, "UUID"))
- dev->bid_uuid = val;
-
- if (dev->bid_cache)
- dev->bid_cache->bic_flags |= BLKID_BIC_FL_CHANGED;
- return 0;
-
-errout:
- blkid_free_tag(t);
- if (!t)
- free(val);
- blkid_free_tag(head);
- return -BLKID_ERR_MEM;
-}
-
-
-/*
- * Parse a "NAME=value" string. This is slightly different than
- * parse_token, because that will end an unquoted value at a space, while
- * this will assume that an unquoted value is the rest of the token (e.g.
- * if we are passed an already quoted string from the command-line we don't
- * have to both quote and escape quote so that the quotes make it to
- * us).
- *
- * Returns 0 on success, and -1 on failure.
- */
-int blkid_parse_tag_string(const char *token, char **ret_type, char **ret_val)
-{
- char *name, *value, *cp;
-
- DBG(DEBUG_TAG, printf("trying to parse '%s' as a tag\n", token));
-
- if (!token || !(cp = strchr(token, '=')))
- return -1;
-
- name = blkid_strdup(token);
- if (!name)
- return -1;
- value = name + (cp - token);
- *value++ = '\0';
- if (*value == '"' || *value == '\'') {
- char c = *value++;
- if (!(cp = strrchr(value, c)))
- goto errout; /* missing closing quote */
- *cp = '\0';
- }
- value = blkid_strdup(value);
- if (!value)
- goto errout;
-
- *ret_type = name;
- *ret_val = value;
-
- return 0;
-
-errout:
- free(name);
- return -1;
-}
-
-/*
- * Tag iteration routines for the public libblkid interface.
- *
- * These routines do not expose the list.h implementation, which are a
- * contamination of the namespace, and which force us to reveal far, far
- * too much of our internal implemenation. I'm not convinced I want
- * to keep list.h in the long term, anyway. It's fine for kernel
- * programming, but performance is not the #1 priority for this
- * library, and I really don't like the tradeoff of type-safety for
- * performance for this application. [tytso:20030125.2007EST]
- */
-
-/*
- * This series of functions iterate over all tags in a device
- */
-#define TAG_ITERATE_MAGIC 0x01a5284c
-
-struct blkid_struct_tag_iterate {
- int magic;
- blkid_dev dev;
- struct list_head *p;
-};
-
-blkid_tag_iterate blkid_tag_iterate_begin(blkid_dev dev)
-{
- blkid_tag_iterate iter;
-
- iter = xmalloc(sizeof(struct blkid_struct_tag_iterate));
- iter->magic = TAG_ITERATE_MAGIC;
- iter->dev = dev;
- iter->p = dev->bid_tags.next;
- return iter;
-}
-
-/*
- * Return 0 on success, -1 on error
- */
-extern int blkid_tag_next(blkid_tag_iterate iter,
- const char **type, const char **value)
-{
- blkid_tag tag;
-
- *type = 0;
- *value = 0;
- if (!iter || iter->magic != TAG_ITERATE_MAGIC ||
- iter->p == &iter->dev->bid_tags)
- return -1;
- tag = list_entry(iter->p, struct blkid_struct_tag, bit_tags);
- *type = tag->bit_name;
- *value = tag->bit_val;
- iter->p = iter->p->next;
- return 0;
-}
-
-void blkid_tag_iterate_end(blkid_tag_iterate iter)
-{
- if (!iter || iter->magic != TAG_ITERATE_MAGIC)
- return;
- iter->magic = 0;
- free(iter);
-}
-
-/*
- * This function returns a device which matches a particular
- * type/value pair. If there is more than one device that matches the
- * search specification, it returns the one with the highest priority
- * value. This allows us to give preference to EVMS or LVM devices.
- *
- * XXX there should also be an interface which uses an iterator so we
- * can get all of the devices which match a type/value search parameter.
- */
-extern blkid_dev blkid_find_dev_with_tag(blkid_cache cache,
- const char *type,
- const char *value)
-{
- blkid_tag head;
- blkid_dev dev;
- int pri;
- struct list_head *p;
-
- if (!cache || !type || !value)
- return NULL;
-
- blkid_read_cache(cache);
-
- DBG(DEBUG_TAG, printf("looking for %s=%s in cache\n", type, value));
-
-try_again:
- pri = -1;
- dev = 0;
- head = blkid_find_head_cache(cache, type);
-
- if (head) {
- list_for_each(p, &head->bit_names) {
- blkid_tag tmp = list_entry(p, struct blkid_struct_tag,
- bit_names);
-
- if (!strcmp(tmp->bit_val, value) &&
- tmp->bit_dev->bid_pri > pri) {
- dev = tmp->bit_dev;
- pri = dev->bid_pri;
- }
- }
- }
- if (dev && !(dev->bid_flags & BLKID_BID_FL_VERIFIED)) {
- dev = blkid_verify(cache, dev);
- if (dev && (dev->bid_flags & BLKID_BID_FL_VERIFIED))
- goto try_again;
- }
-
- if (!dev && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) {
- if (blkid_probe_all(cache) < 0)
- return NULL;
- goto try_again;
- }
- return dev;
-}
-
-#ifdef TEST_PROGRAM
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#else
-extern char *optarg;
-extern int optind;
-#endif
-
-void usage(char *prog)
-{
- fprintf(stderr, "Usage: %s [-f blkid_file] [-m debug_mask] device "
- "[type value]\n",
- prog);
- fprintf(stderr, "\tList all tags for a device and exit\n", prog);
- exit(1);
-}
-
-int main(int argc, char **argv)
-{
- blkid_tag_iterate iter;
- blkid_cache cache = NULL;
- blkid_dev dev;
- int c, ret, found;
- int flags = BLKID_DEV_FIND;
- char *tmp;
- char *file = NULL;
- char *devname = NULL;
- char *search_type = NULL;
- char *search_value = NULL;
- const char *type, *value;
-
- while ((c = getopt (argc, argv, "m:f:")) != EOF)
- switch (c) {
- case 'f':
- file = optarg;
- break;
- case 'm':
- blkid_debug_mask = strtoul (optarg, &tmp, 0);
- if (*tmp) {
- fprintf(stderr, "Invalid debug mask: %d\n",
- optarg);
- exit(1);
- }
- break;
- case '?':
- usage(argv[0]);
- }
- if (argc > optind)
- devname = argv[optind++];
- if (argc > optind)
- search_type = argv[optind++];
- if (argc > optind)
- search_value = argv[optind++];
- if (!devname || (argc != optind))
- usage(argv[0]);
-
- if ((ret = blkid_get_cache(&cache, file)) != 0) {
- fprintf(stderr, "%s: error creating cache (%d)\n",
- argv[0], ret);
- exit(1);
- }
-
- dev = blkid_get_dev(cache, devname, flags);
- if (!dev) {
- fprintf(stderr, "%s: cannot find device in blkid cache\n");
- exit(1);
- }
- if (search_type) {
- found = blkid_dev_has_tag(dev, search_type, search_value);
- printf("Device %s: (%s, %s) %s\n", blkid_dev_devname(dev),
- search_type, search_value ? search_value : "NULL",
- found ? "FOUND" : "NOT FOUND");
- return !found;
- }
- printf("Device %s...\n", blkid_dev_devname(dev));
-
- iter = blkid_tag_iterate_begin(dev);
- while (blkid_tag_next(iter, &type, &value) == 0) {
- printf("\tTag %s has value %s\n", type, value);
- }
- blkid_tag_iterate_end(iter);
-
- blkid_put_cache(cache);
- return 0;
-}
-#endif