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);
}
-