From 53ea0055668938fc7b77431d54f36f9daa6da03f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 2 Jun 2016 15:10:04 +0100 Subject: [PATCH] mllib: Add Common_utils.is_partition function. Returns true if the device is a host partition. The only tedious bit of this patch is that now Common_utils depends on Dev_t so we have to add extra objects every time something links with Common_utils. (cherry picked from commit df7a33768eab2381b958ede2c8a40bc9cbc87928) --- builder/Makefile.am | 2 ++ customize/Makefile.am | 2 ++ dib/Makefile.am | 2 ++ get-kernel/Makefile.am | 2 ++ mllib/common_utils.ml | 13 +++++++++++++ mllib/common_utils.mli | 4 ++++ resize/Makefile.am | 2 ++ sparsify/Makefile.am | 2 ++ sysprep/Makefile.am | 2 ++ v2v/Makefile.am | 5 +++++ 10 files changed, 36 insertions(+) diff --git a/builder/Makefile.am b/builder/Makefile.am index f31aef9..54aa10b 100644 --- a/builder/Makefile.am +++ b/builder/Makefile.am @@ -89,6 +89,7 @@ SOURCES_ML = \ builder.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/fsync-c.c \ ../mllib/uri-c.c \ ../mllib/mkdtemp-c.c \ @@ -134,6 +135,7 @@ BOBJECTS = \ $(top_builddir)/mllib/libdir.cmo \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/fsync.cmo \ $(top_builddir)/mllib/planner.cmo \ diff --git a/customize/Makefile.am b/customize/Makefile.am index 033816c..661917a 100644 --- a/customize/Makefile.am +++ b/customize/Makefile.am @@ -69,6 +69,7 @@ SOURCES_C = \ ../fish/uri.c \ ../fish/file-edit.c \ ../fish/file-edit.h \ + ../mllib/dev_t-c.c \ ../mllib/uri-c.c \ crypt-c.c \ perl_edit-c.c @@ -93,6 +94,7 @@ virt_customize_CFLAGS = \ BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/regedit.cmo \ $(top_builddir)/mllib/URI.cmo \ diff --git a/dib/Makefile.am b/dib/Makefile.am index b969677..d1674a9 100644 --- a/dib/Makefile.am +++ b/dib/Makefile.am @@ -33,6 +33,7 @@ SOURCES_ML = \ dib.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/mkdtemp-c.c bin_PROGRAMS = @@ -57,6 +58,7 @@ BOBJECTS = \ $(top_builddir)/mllib/libdir.cmo \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/mkdtemp.cmo \ $(SOURCES_ML:.ml=.cmo) diff --git a/get-kernel/Makefile.am b/get-kernel/Makefile.am index da94ece..9d8fc61 100644 --- a/get-kernel/Makefile.am +++ b/get-kernel/Makefile.am @@ -27,6 +27,7 @@ SOURCES_ML = \ get_kernel.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/uri-c.c \ ../fish/uri.c @@ -56,6 +57,7 @@ BOBJECTS = \ $(top_builddir)/mllib/libdir.cmo \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/URI.cmo \ $(SOURCES_ML:.ml=.cmo) diff --git a/mllib/common_utils.ml b/mllib/common_utils.ml index 2ba8f9a..c29dfa0 100644 --- a/mllib/common_utils.ml +++ b/mllib/common_utils.ml @@ -819,6 +819,19 @@ let is_char_device file = try (Unix.stat file).Unix.st_kind = Unix.S_CHR with Unix.Unix_error _ -> false +let is_partition dev = + try + if not (is_block_device dev) then false + else ( + let rdev = (Unix.stat dev).Unix.st_rdev in + let major = Dev_t.major rdev in + let minor = Dev_t.minor rdev in + let path = sprintf "/sys/dev/block/%d:%d/partition" major minor in + Unix.access path [F_OK]; + true + ) + with Unix.Unix_error _ -> false + (* Annoyingly Sys.is_directory throws an exception on failure * (RHBZ#1022431). *) diff --git a/mllib/common_utils.mli b/mllib/common_utils.mli index ae89fd6..4cfe7d0 100644 --- a/mllib/common_utils.mli +++ b/mllib/common_utils.mli @@ -327,6 +327,10 @@ val is_char_device : string -> bool val is_directory : string -> bool (** These don't throw exceptions, unlike the [Sys] functions. *) +val is_partition : string -> bool +(** Return true if the host device [dev] is a partition. If it's + anything else, or missing, returns false. *) + val absolute_path : string -> string (** Convert any path to an absolute path. *) diff --git a/resize/Makefile.am b/resize/Makefile.am index f4d1626..e9f48da 100644 --- a/resize/Makefile.am +++ b/resize/Makefile.am @@ -30,6 +30,7 @@ SOURCES_ML = \ resize.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/fsync-c.c \ ../fish/progress.c \ ../mllib/progress-c.c \ @@ -58,6 +59,7 @@ BOBJECTS = \ $(top_builddir)/mllib/URI.cmo \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(SOURCES_ML:.ml=.cmo) XOBJECTS = $(BOBJECTS:.cmo=.cmx) diff --git a/sparsify/Makefile.am b/sparsify/Makefile.am index 3da7a7a..9df3e1f 100644 --- a/sparsify/Makefile.am +++ b/sparsify/Makefile.am @@ -37,6 +37,7 @@ SOURCES_ML = \ SOURCES_C = \ ../fish/progress.c \ + ../mllib/dev_t-c.c \ ../mllib/progress-c.c \ statvfs-c.c @@ -57,6 +58,7 @@ virt_sparsify_CFLAGS = \ BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/progress.cmo \ $(SOURCES_ML:.ml=.cmo) diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am index b890bca..e439a88 100644 --- a/sysprep/Makefile.am +++ b/sysprep/Makefile.am @@ -80,6 +80,7 @@ SOURCES_ML = \ main.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/uri-c.c \ ../mllib/mkdtemp-c.c \ ../customize/crypt-c.c \ @@ -106,6 +107,7 @@ virt_sysprep_CFLAGS = \ BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/URI.cmo \ $(top_builddir)/mllib/mkdtemp.cmo \ diff --git a/v2v/Makefile.am b/v2v/Makefile.am index 5d0ce95..5bffbfe 100644 --- a/v2v/Makefile.am +++ b/v2v/Makefile.am @@ -113,6 +113,7 @@ SOURCES_ML = \ v2v.ml SOURCES_C = \ + ../mllib/dev_t-c.c \ ../mllib/mkdtemp-c.c \ domainxml-c.c \ changeuid-c.c \ @@ -137,6 +138,7 @@ virt_v2v_CFLAGS = \ BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/regedit.cmo \ $(top_builddir)/mllib/mkdtemp.cmo \ @@ -187,6 +189,7 @@ virt_v2v_LINK = \ $(OBJECTS) -o $@ virt_v2v_copy_to_local_SOURCES = \ + ../mllib/dev_t-c.c \ domainxml-c.c \ utils-c.c \ xml-c.c @@ -203,6 +206,7 @@ virt_v2v_copy_to_local_CFLAGS = \ COPY_TO_LOCAL_BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/JSON.cmo \ $(top_builddir)/mllib/curl.cmo \ @@ -361,6 +365,7 @@ endif v2v_unit_tests_BOBJECTS = \ $(top_builddir)/mllib/guestfs_config.cmo \ $(top_builddir)/mllib/common_gettext.cmo \ + $(top_builddir)/mllib/dev_t.cmo \ $(top_builddir)/mllib/common_utils.cmo \ $(top_builddir)/mllib/regedit.cmo \ stringMap.cmo \ -- 1.8.3.1