Re: mount: fsprobe

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2007-05-15 at 13:50 +0200, Karel Zak wrote:
> This series of patches implements fsprobe interface to the mount
> command, adds libvolume_id support and removes old FS detection code. 
> 
> There is not changes to getfs*() (fstab.c) code. I'll clean up this
> interface separately.
> 
> My plan is add more tests for the mount, but probably later (during
> beta & release-candidate period).
> 
> Please, Kay and Matthias (and others) review.

I've tested the --with-fsprobe=volume_id. It works great. Thanks a lot
for the cleanup of the patch, and the internal spec parsing.

The next version of libvolume_id will export the encoding function for
the symlinks names, so slashes in labels and other chars, that don't
really fit into symlink names, will work as expected with LABEL=.
The patch is attached for reference, I'll send it again when the new
library version is released.


Thanks,
Kay
diff --git a/configure.ac b/configure.ac
index e3ae318..c407f45 100644
--- a/configure.ac
+++ b/configure.ac
@@ -68,8 +68,8 @@ if test x$with_fsprobe = xblkid; then
     fsprobe=blkid
   fi
 elif test x$with_fsprobe = xvolume_id; then
-  AC_CHECK_LIB(volume_id, volume_id_open_fd)
-  if test x$ac_cv_lib_volume_id_volume_id_open_fd = xyes; then
+  AC_CHECK_LIB(volume_id, volume_id_encode_string)
+  if test x$ac_cv_lib_volume_id_volume_id_encode_string = xyes; then
     fsprobe=volume_id
   fi
 fi
diff --git a/mount/fsprobe_volumeid.c b/mount/fsprobe_volumeid.c
index 8c13987..4b58e72 100644
--- a/mount/fsprobe_volumeid.c
+++ b/mount/fsprobe_volumeid.c
@@ -20,11 +20,13 @@ enum probe_type {
 	VOLUME_ID_TYPE,
 };
 
-static char *probe(const char *device, enum probe_type type)
+static char
+*probe(const char *device, enum probe_type type)
 {
 	int fd;
 	uint64_t size;
 	struct volume_id *id;
+	const char *val;
 	char *value = NULL;
 
 	fd = open(device, O_RDONLY);
@@ -42,13 +44,16 @@ static char *probe(const char *device, e
 	if (volume_id_probe_all(id, 0, size) == 0) {
 		switch(type) {
 		case VOLUME_ID_LABEL:
-			value  = xstrdup(id->label);
+			if (volume_id_get_label(id, &val))
+				value  = xstrdup(val);
 			break;
 		case VOLUME_ID_UUID:
-			value  = xstrdup(id->uuid);
+			if (volume_id_get_uuid(id, &val))
+				value  = xstrdup(val);
 			break;
 		case VOLUME_ID_TYPE:
-			value  = xstrdup(id->type);
+			if (volume_id_get_type(id, &val))
+				value  = xstrdup(val);
 			break;
 		default:
 			break;
@@ -72,10 +77,8 @@ fsprobe_exit(void)
 int
 fsprobe_known_fstype(const char *fstype)
 {
-	/* TODO 
 	if (volume_id_get_prober_by_type(fstype) != NULL)
 		return 1;
-	*/
 	return 0;
 }
 
@@ -101,11 +104,15 @@ const char *
 fsprobe_get_devname_by_uuid(const char *uuid)
 {
 	char dev[PATH_MAX];
+	size_t len;
 
 	if (!uuid)
 		return NULL;
 
-	snprintf(dev, sizeof(dev), PATH_DEV_BYUUID "/%s", uuid);
+	strcpy(dev, PATH_DEV_BYUUID "/");
+	len = strlen(PATH_DEV_BYUUID "/");
+	if (!volume_id_encode_string(uuid, &dev[len], sizeof(dev) - len) != 0)
+		return NULL;
 	return canonicalize(dev);
 }
 
@@ -113,11 +120,13 @@ const char *
 fsprobe_get_devname_by_label(const char *label)
 {
 	char dev[PATH_MAX];
+	size_t len;
 
 	if (!label)
 		return NULL;
-
-	snprintf(dev, sizeof(dev), PATH_DEV_BYLABEL "/%s", label);
+	strcpy(dev, PATH_DEV_BYLABEL "/");
+	len = strlen(PATH_DEV_BYLABEL "/");
+	if (!volume_id_encode_string(label, &dev[len], sizeof(dev) - len) != 0)
+		return NULL;
 	return canonicalize(dev);
 }
-

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux