[git commit master 1/1] blkid: optional support for TYPE="fstype"

Denys Vlasenko vda.linux at googlemail.com
Wed Dec 29 23:40:11 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=90615a0c5c326fa3cf78fc719f7b16207f47395a
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Adapted from patch created by T4ndeta <t4ndeta at gmail.com>

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/volume_id.h                       |    1 +
 util-linux/Config.src                     |    7 +++
 util-linux/blkid.c                        |    7 +++-
 util-linux/volume_id/cramfs.c             |    2 +-
 util-linux/volume_id/ext.c                |   10 +++--
 util-linux/volume_id/fat.c                |    2 +-
 util-linux/volume_id/get_devname.c        |   59 ++++++++++++++++++++++-------
 util-linux/volume_id/hfs.c                |    2 +-
 util-linux/volume_id/iso9660.c            |    2 +-
 util-linux/volume_id/jfs.c                |    2 +-
 util-linux/volume_id/linux_raid.c         |    2 +-
 util-linux/volume_id/linux_swap.c         |    2 +-
 util-linux/volume_id/luks.c               |    2 +-
 util-linux/volume_id/ntfs.c               |    2 +-
 util-linux/volume_id/ocfs2.c              |    2 +-
 util-linux/volume_id/reiserfs.c           |    2 +-
 util-linux/volume_id/romfs.c              |    2 +-
 util-linux/volume_id/sysv.c               |    4 +-
 util-linux/volume_id/udf.c                |    3 +-
 util-linux/volume_id/volume_id_internal.h |    4 +-
 util-linux/volume_id/xfs.c                |    2 +-
 21 files changed, 84 insertions(+), 37 deletions(-)

diff --git a/include/volume_id.h b/include/volume_id.h
index 77e874d..4a78cd1 100644
--- a/include/volume_id.h
+++ b/include/volume_id.h
@@ -28,3 +28,4 @@ void display_uuid_cache(void);
  *    *fsname is replaced if device with such UUID or LABEL is found
  */
 int resolve_mount_spec(char **fsname);
+int add_to_uuid_cache(const char *device);
diff --git a/util-linux/Config.src b/util-linux/Config.src
index c71b4de..dbf2b0d 100644
--- a/util-linux/Config.src
+++ b/util-linux/Config.src
@@ -40,6 +40,13 @@ config BLKID
 	  WARNING:
 	  With all submodules selected, it will add ~8k to busybox.
 
+config FEATURE_BLKID_TYPE
+	bool "Print filesystem type"
+	default n
+	depends on BLKID
+	help
+	  Show TYPE="filesystem type"
+
 config DMESG
 	bool "dmesg"
 	default y
diff --git a/util-linux/blkid.c b/util-linux/blkid.c
index 53f13a9..fe88fb3 100644
--- a/util-linux/blkid.c
+++ b/util-linux/blkid.c
@@ -13,8 +13,13 @@
 //TODO: extend to take BLOCKDEV args, and show TYPE="fstype"
 
 int blkid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int blkid_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+int blkid_main(int argc UNUSED_PARAM, char **argv)
 {
+	while (*++argv) {
+		/* Note: bogus device names don't cause any error messages */
+		add_to_uuid_cache(*argv);
+	}
+
 	display_uuid_cache();
 	return 0;
 }
diff --git a/util-linux/volume_id/cramfs.c b/util-linux/volume_id/cramfs.c
index b84a6f0..28e9970 100644
--- a/util-linux/volume_id/cramfs.c
+++ b/util-linux/volume_id/cramfs.c
@@ -51,7 +51,7 @@ int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/)
 		volume_id_set_label_string(id, cs->name, 16);
 
 //		volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//		id->type = "cramfs";
+		IF_FEATURE_BLKID_TYPE(id->type = "cramfs";)
 		return 0;
 	}
 
diff --git a/util-linux/volume_id/ext.c b/util-linux/volume_id/ext.c
index 80c217f..b5194a7 100644
--- a/util-linux/volume_id/ext.c
+++ b/util-linux/volume_id/ext.c
@@ -65,10 +65,12 @@ int FAST_FUNC volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/)
 	volume_id_set_uuid(id, es->uuid, UUID_DCE);
 	dbg("ext: label '%s' uuid '%s'", id->label, id->uuid);
 
-//	if ((le32_to_cpu(es->feature_compat) & EXT3_FEATURE_COMPAT_HAS_JOURNAL) != 0)
-//		id->type = "ext3";
-//	else
-//		id->type = "ext2";
+#if ENABLE_FEATURE_BLKID_TYPE
+	if ((le32_to_cpu(es->feature_compat) & EXT3_FEATURE_COMPAT_HAS_JOURNAL) != 0)
+		id->type = "ext3";
+	else
+		id->type = "ext2";
+#endif
 
 	return 0;
 }
diff --git a/util-linux/volume_id/fat.c b/util-linux/volume_id/fat.c
index b0f427c..904fbb2 100644
--- a/util-linux/volume_id/fat.c
+++ b/util-linux/volume_id/fat.c
@@ -332,7 +332,7 @@ int FAST_FUNC volume_id_probe_vfat(struct volume_id *id /*,uint64_t fat_partitio
 
  ret:
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "vfat";
+	IF_FEATURE_BLKID_TYPE(id->type = "vfat";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/get_devname.c b/util-linux/volume_id/get_devname.c
index bf32e6a..7c99305 100644
--- a/util-linux/volume_id/get_devname.c
+++ b/util-linux/volume_id/get_devname.c
@@ -19,14 +19,22 @@ static struct uuidCache_s {
 	char *device;
 	char *label;
 	char *uc_uuid; /* prefix makes it easier to grep for */
+	IF_FEATURE_BLKID_TYPE(const char *type;)
 } *uuidCache;
 
+#if !ENABLE_FEATURE_BLKID_TYPE
+#define get_label_uuid(fd, label, uuid, type) \
+	get_label_uuid(fd, label, uuid)
+#define uuidcache_addentry(device, label, uuid, type) \
+	uuidcache_addentry(device, label, uuid)
+#endif
+
 /* Returns !0 on error.
  * Otherwise, returns malloc'ed strings for label and uuid
  * (and they can't be NULL, although they can be "").
  * NB: closes fd. */
 static int
-get_label_uuid(int fd, char **label, char **uuid)
+get_label_uuid(int fd, char **label, char **uuid, const char **type)
 {
 	int rv = 1;
 	uint64_t size;
@@ -44,7 +52,12 @@ get_label_uuid(int fd, char **label, char **uuid)
 	if (vid->label[0] != '\0' || vid->uuid[0] != '\0') {
 		*label = xstrndup(vid->label, sizeof(vid->label));
 		*uuid  = xstrndup(vid->uuid, sizeof(vid->uuid));
+#if ENABLE_FEATURE_BLKID_TYPE
+		*type = vid->type;
+		dbg("found label '%s', uuid '%s', type '%s'", *label, *uuid, *type);
+#else
 		dbg("found label '%s', uuid '%s'", *label, *uuid);
+#endif
 		rv = 0;
 	}
  ret:
@@ -54,7 +67,7 @@ get_label_uuid(int fd, char **label, char **uuid)
 
 /* NB: we take ownership of (malloc'ed) label and uuid */
 static void
-uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid)
+uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid, const char *type)
 {
 	struct uuidCache_s *last;
 
@@ -72,6 +85,7 @@ uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uu
 	last->device = device;
 	last->label = label;
 	last->uc_uuid = uuid;
+	IF_FEATURE_BLKID_TYPE(last->type = type;)
 }
 
 /* If get_label_uuid() on device_name returns success,
@@ -83,10 +97,6 @@ uuidcache_check_device(const char *device,
 		void *userData UNUSED_PARAM,
 		int depth UNUSED_PARAM)
 {
-	char *uuid = uuid; /* for compiler */
-	char *label = label;
-	int fd;
-
 	/* note: this check rejects links to devices, among other nodes */
 	if (!S_ISBLK(statbuf->st_mode))
 		return TRUE;
@@ -99,21 +109,15 @@ uuidcache_check_device(const char *device,
 	if (major(statbuf->st_rdev) == 2)
 		return TRUE;
 
-	fd = open(device, O_RDONLY);
-	if (fd < 0)
-		return TRUE;
+	add_to_uuid_cache(device);
 
-	/* get_label_uuid() closes fd in all cases (success & failure) */
-	if (get_label_uuid(fd, &label, &uuid) == 0) {
-		/* uuidcache_addentry() takes ownership of all three params */
-		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid);
-	}
 	return TRUE;
 }
 
 static void
 uuidcache_init(void)
 {
+	dbg("DBG: uuidCache=%x, uuidCache");
 	if (uuidCache)
 		return;
 
@@ -223,11 +227,38 @@ void display_uuid_cache(void)
 			printf(" LABEL=\"%s\"", u->label);
 		if (u->uc_uuid[0])
 			printf(" UUID=\"%s\"", u->uc_uuid);
+#if ENABLE_FEATURE_BLKID_TYPE
+	if (u->type)
+		printf(" TYPE=\"%s\"", u->type);
+#endif
 		bb_putchar('\n');
 		u = u->next;
 	}
 }
 
+int add_to_uuid_cache(const char *device)
+{
+	char *uuid = uuid; /* for compiler */
+	char *label = label;
+#if ENABLE_FEATURE_BLKID_TYPE
+	const char *type = type;
+#endif
+	int fd;
+
+	fd = open(device, O_RDONLY);
+	if (fd < 0)
+		return 0;
+
+	/* get_label_uuid() closes fd in all cases (success & failure) */
+	if (get_label_uuid(fd, &label, &uuid, &type) == 0) {
+		/* uuidcache_addentry() takes ownership of all four params */
+		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid, type);
+		return 1;
+	}
+	return 0;
+}
+
+
 /* Used by mount and findfs */
 
 char *get_devname_from_label(const char *spec)
diff --git a/util-linux/volume_id/hfs.c b/util-linux/volume_id/hfs.c
index cf75851..f3f19db 100644
--- a/util-linux/volume_id/hfs.c
+++ b/util-linux/volume_id/hfs.c
@@ -195,7 +195,7 @@ int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/
 
 	volume_id_set_uuid(id, hfs->finder_info.id, UUID_HFS);
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "hfs";
+	IF_FEATURE_BLKID_TYPE(id->type = "hfs";)
 
 	return 0;
 
diff --git a/util-linux/volume_id/iso9660.c b/util-linux/volume_id/iso9660.c
index 1519de4..1d7693a 100644
--- a/util-linux/volume_id/iso9660.c
+++ b/util-linux/volume_id/iso9660.c
@@ -114,7 +114,7 @@ int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/)
 
  found:
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "iso9660";
+	IF_FEATURE_BLKID_TYPE(id->type = "iso9660";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/jfs.c b/util-linux/volume_id/jfs.c
index eb7a448..5333af2 100644
--- a/util-linux/volume_id/jfs.c
+++ b/util-linux/volume_id/jfs.c
@@ -54,7 +54,7 @@ int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/)
 	volume_id_set_uuid(id, js->uuid, UUID_DCE);
 
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "jfs";
+	IF_FEATURE_BLKID_TYPE(id->type = "jfs";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/linux_raid.c b/util-linux/volume_id/linux_raid.c
index e1c8636..761e54f 100644
--- a/util-linux/volume_id/linux_raid.c
+++ b/util-linux/volume_id/linux_raid.c
@@ -75,7 +75,7 @@ int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/,
 
 	dbg("found raid signature");
 //	volume_id_set_usage(id, VOLUME_ID_RAID);
-//	id->type = "linux_raid_member";
+	IF_FEATURE_BLKID_TYPE(id->type = "linux_raid_member";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/linux_swap.c b/util-linux/volume_id/linux_swap.c
index 0aa43f3..62d5885 100644
--- a/util-linux/volume_id/linux_swap.c
+++ b/util-linux/volume_id/linux_swap.c
@@ -73,7 +73,7 @@ int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/)
 
 found:
 //	volume_id_set_usage(id, VOLUME_ID_OTHER);
-//	id->type = "swap";
+	IF_FEATURE_BLKID_TYPE(id->type = "swap";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/luks.c b/util-linux/volume_id/luks.c
index 8ab09e3..f9b3766 100644
--- a/util-linux/volume_id/luks.c
+++ b/util-linux/volume_id/luks.c
@@ -94,7 +94,7 @@ int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/)
 
 //	volume_id_set_usage(id, VOLUME_ID_CRYPTO);
 	volume_id_set_uuid(id, header->uuid, UUID_DCE_STRING);
-//	id->type = "crypto_LUKS";
+	IF_FEATURE_BLKID_TYPE(id->type = "crypto_LUKS";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/ntfs.c b/util-linux/volume_id/ntfs.c
index 17b1fe8..547f141 100644
--- a/util-linux/volume_id/ntfs.c
+++ b/util-linux/volume_id/ntfs.c
@@ -188,7 +188,7 @@ int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/)
 
  found:
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "ntfs";
+	IF_FEATURE_BLKID_TYPE(id->type = "ntfs";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/ocfs2.c b/util-linux/volume_id/ocfs2.c
index e6c4559..fcdb151 100644
--- a/util-linux/volume_id/ocfs2.c
+++ b/util-linux/volume_id/ocfs2.c
@@ -101,6 +101,6 @@ int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/)
 	volume_id_set_label_string(id, os->s_label, OCFS2_MAX_VOL_LABEL_LEN < VOLUME_ID_LABEL_SIZE ?
 					OCFS2_MAX_VOL_LABEL_LEN : VOLUME_ID_LABEL_SIZE);
 	volume_id_set_uuid(id, os->s_uuid, UUID_DCE);
-//	id->type = "ocfs2";
+	IF_FEATURE_BLKID_TYPE(id->type = "ocfs2";)
 	return 0;
 }
diff --git a/util-linux/volume_id/reiserfs.c b/util-linux/volume_id/reiserfs.c
index 3120b29..67b4a18 100644
--- a/util-linux/volume_id/reiserfs.c
+++ b/util-linux/volume_id/reiserfs.c
@@ -107,7 +107,7 @@ int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/)
 
  found:
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "reiserfs";
+	IF_FEATURE_BLKID_TYPE(id->type = "reiserfs";)
 
 	return 0;
 }
diff --git a/util-linux/volume_id/romfs.c b/util-linux/volume_id/romfs.c
index 228e77a..15653be 100644
--- a/util-linux/volume_id/romfs.c
+++ b/util-linux/volume_id/romfs.c
@@ -47,7 +47,7 @@ int FAST_FUNC volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/)
 		}
 
 //		volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//		id->type = "romfs";
+		IF_FEATURE_BLKID_TYPE(id->type = "romfs";)
 		return 0;
 	}
 
diff --git a/util-linux/volume_id/sysv.c b/util-linux/volume_id/sysv.c
index e0fa20a..6eb9646 100644
--- a/util-linux/volume_id/sysv.c
+++ b/util-linux/volume_id/sysv.c
@@ -99,7 +99,7 @@ int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/)
 		if (vs->s_magic == cpu_to_le32(SYSV_MAGIC) || vs->s_magic == cpu_to_be32(SYSV_MAGIC)) {
 //			volume_id_set_label_raw(id, vs->s_fname, 6);
 			volume_id_set_label_string(id, vs->s_fname, 6);
-//			id->type = "sysv";
+			IF_FEATURE_BLKID_TYPE(id->type = "sysv");
 			goto found;
 		}
 	}
@@ -112,7 +112,7 @@ int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/)
 		if (xs->s_magic == cpu_to_le32(XENIX_MAGIC) || xs->s_magic == cpu_to_be32(XENIX_MAGIC)) {
 //			volume_id_set_label_raw(id, xs->s_fname, 6);
 			volume_id_set_label_string(id, xs->s_fname, 6);
-//			id->type = "xenix";
+			IF_FEATURE_BLKID_TYPE(id->type = "xenix";)
 			goto found;
 		}
 	}
diff --git a/util-linux/volume_id/udf.c b/util-linux/volume_id/udf.c
index dd25731..cd63c8d 100644
--- a/util-linux/volume_id/udf.c
+++ b/util-linux/volume_id/udf.c
@@ -167,7 +167,6 @@ anchor:
 
  found:
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "udf";
-
+	IF_FEATURE_BLKID_TYPE(id->type = "udf";)
 	return 0;
 }
diff --git a/util-linux/volume_id/volume_id_internal.h b/util-linux/volume_id/volume_id_internal.h
index 9b808ff..1c64046 100644
--- a/util-linux/volume_id/volume_id_internal.h
+++ b/util-linux/volume_id/volume_id_internal.h
@@ -80,7 +80,9 @@ struct volume_id {
 //	char		type_version[VOLUME_ID_FORMAT_SIZE];
 //	smallint	usage_id;
 //	const char	*usage;
-//	const char	*type;
+#if ENABLE_FEATURE_BLKID_TYPE
+	const char	*type;
+#endif
 };
 
 struct volume_id* FAST_FUNC volume_id_open_node(int fd);
diff --git a/util-linux/volume_id/xfs.c b/util-linux/volume_id/xfs.c
index 1017d07..8474602 100644
--- a/util-linux/volume_id/xfs.c
+++ b/util-linux/volume_id/xfs.c
@@ -54,7 +54,7 @@ int FAST_FUNC volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/)
 	volume_id_set_uuid(id, xs->uuid, UUID_DCE);
 
 //	volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
-//	id->type = "xfs";
+	IF_FEATURE_BLKID_TYPE(id->type = "xfs";)
 
 	return 0;
 }
-- 
1.7.2.2



More information about the busybox-cvs mailing list