This can be used by storage pools to figure out which actions are available on various paths (for example subvolumes when running on btrfs.) Signed-off-by: Oskari Saarenmaa <os@xxxxxxx> --- src/libvirt_private.syms | 1 + src/util/virfile.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/util/virfile.h | 1 + 3 files changed, 49 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 35f0f1b..d0238cf 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1370,6 +1370,7 @@ virFileExists; virFileFclose; virFileFdopen; virFileFindMountPoint; +virFileFsType; virFileHasSuffix; virFileIsAbsPath; virFileIsDir; diff --git a/src/util/virfile.c b/src/util/virfile.c index feac3c9..44871d6 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -1133,6 +1133,45 @@ cleanup: return ret; } +/* search /proc/mounts for the filesystem type of the given path; + * return pointer to malloc'ed string of type if found, otherwise + * return NULL. + */ +char * +virFileFsType(const char *path) +{ + FILE *f; + struct mntent mb; + char mntbuf[1024]; + char *real = NULL, *ret = NULL; + size_t lookup_len, longest = 0; + + if ((real = realpath(path, NULL)) == NULL) + return NULL; + lookup_len = strlen(real); + + f = setmntent("/proc/mounts", "r"); + if (!f) { + VIR_FREE(real); + return NULL; + } + + while (getmntent_r(f, &mb, mntbuf, sizeof(mntbuf))) { + size_t mnt_dir_len = strlen(mb.mnt_dir); + if (lookup_len >= mnt_dir_len && mnt_dir_len >= longest) { + if (memcmp(mb.mnt_dir, real, mnt_dir_len) == 0) { + longest = mnt_dir_len; + VIR_FREE(ret); + ignore_value(VIR_STRDUP_QUIET(ret, mb.mnt_type)); + } + } + } + endmntent(f); + VIR_FREE(real); + + return ret; +} + #else /* defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R */ char * @@ -1143,6 +1182,14 @@ virFileFindMountPoint(const char *type ATTRIBUTE_UNUSED) return NULL; } +char * +virFileFsType(const char *path) +{ + errno = ENOSYS; + + return NULL; +} + #endif /* defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R */ int diff --git a/src/util/virfile.h b/src/util/virfile.h index 72d35ce..3c01247 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -221,6 +221,7 @@ int virFileOpenTty(int *ttymaster, int rawmode); char *virFileFindMountPoint(const char *type); +char *virFileFsType(const char *path); void virFileWaitForDevices(void); -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list