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 o...@ohmu.fi
---
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@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list