From: Karel Zak Date: Mon, 14 May 2007 22:52:07 +0000 (+0200) Subject: mount: fsprobe: add libvolume_id support X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4e33ad025411157535b3eda347c20a03db47c62;p=util-linux mount: fsprobe: add libvolume_id support Signed-off-by: Matthias Koenig Signed-off-by: Kay Sievers Signed-off-by: Karel Zak --- diff --git a/mount/Makefile.am b/mount/Makefile.am index fb330133..fa60830d 100644 --- a/mount/Makefile.am +++ b/mount/Makefile.am @@ -44,6 +44,15 @@ if HAVE_SELINUX mount_LDADD += -lselinux endif +if HAVE_VOLUME_ID +mount_SOURCES += fsprobe_volumeid.c +umount_SOURCES += fsprobe_volumeid.c +swapon_SOURCES += fsprobe_volumeid.c +mount_LDADD += -lvolume_id +umount_LDADD += -lvolume_id +swapon_LDADD += -lvolume_id +endif + if HAVE_PIVOT_ROOT sbin_PROGRAMS += pivot_root man_MANS += pivot_root.8 diff --git a/mount/fsprobe_volumeid.c b/mount/fsprobe_volumeid.c new file mode 100644 index 00000000..8c13987a --- /dev/null +++ b/mount/fsprobe_volumeid.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fsprobe.h" +#include "realpath.h" +#include "mount_paths.h" +#include "sundries.h" + +enum probe_type { + VOLUME_ID_NONE, + VOLUME_ID_LABEL, + VOLUME_ID_UUID, + VOLUME_ID_TYPE, +}; + +static char *probe(const char *device, enum probe_type type) +{ + int fd; + uint64_t size; + struct volume_id *id; + char *value = NULL; + + fd = open(device, O_RDONLY); + if (fd < 0) + return NULL; + + id = volume_id_open_fd(fd); + if (!id) + return NULL; + + /* TODO: use blkdev_get_size() */ + if (ioctl(fd, BLKGETSIZE64, &size) != 0) + size = 0; + + if (volume_id_probe_all(id, 0, size) == 0) { + switch(type) { + case VOLUME_ID_LABEL: + value = xstrdup(id->label); + break; + case VOLUME_ID_UUID: + value = xstrdup(id->uuid); + break; + case VOLUME_ID_TYPE: + value = xstrdup(id->type); + break; + default: + break; + } + } + + volume_id_close(id); + return value; +} + +void +fsprobe_init(void) +{ +} + +void +fsprobe_exit(void) +{ +} + +int +fsprobe_known_fstype(const char *fstype) +{ + /* TODO + if (volume_id_get_prober_by_type(fstype) != NULL) + return 1; + */ + return 0; +} + +const char * +fsprobe_get_uuid_by_devname(const char *devname) +{ + return probe(devname, VOLUME_ID_UUID); +} + +const char * +fsprobe_get_label_by_devname(const char *devname) +{ + return probe(devname, VOLUME_ID_LABEL); +} + +const char * +fsprobe_get_fstype_by_devname(const char *devname) +{ + return probe(devname, VOLUME_ID_TYPE); +} + +const char * +fsprobe_get_devname_by_uuid(const char *uuid) +{ + char dev[PATH_MAX]; + + if (!uuid) + return NULL; + + snprintf(dev, sizeof(dev), PATH_DEV_BYUUID "/%s", uuid); + return canonicalize(dev); +} + +const char * +fsprobe_get_devname_by_label(const char *label) +{ + char dev[PATH_MAX]; + + if (!label) + return NULL; + + snprintf(dev, sizeof(dev), PATH_DEV_BYLABEL "/%s", label); + return canonicalize(dev); +} + diff --git a/mount/mount.8 b/mount/mount.8 index 8ed5a11b..be6e5376 100644 --- a/mount/mount.8 +++ b/mount/mount.8 @@ -477,9 +477,8 @@ If no option is given, or if the .B auto type is specified, mount will try to guess the desired type. -If mount was compiled with the blkid library, the guessing is done -by this library. Otherwise, mount guesses itself by probing the -superblock; if that does not turn up anything that looks familiar, +Mount uses the blkid or volume_id library for guessing the filesystem +type; if that does not turn up anything that looks familiar, mount will try to read the file .IR /etc/filesystems , or, if that does not exist, diff --git a/mount/mount_paths.h b/mount/mount_paths.h index 9093b10e..d726d063 100644 --- a/mount/mount_paths.h +++ b/mount/mount_paths.h @@ -15,4 +15,8 @@ #define ETC_FILESYSTEMS "/etc/filesystems" #define PROC_FILESYSTEMS "/proc/filesystems" +/* udev paths */ +#define PATH_DEV_BYLABEL "/dev/disk/by-label" +#define PATH_DEV_BYUUID "/dev/disk/by-uuid" + #endif /* MOUNT_PATHS_H */