From 53ea0055668938fc7b77431d54f36f9daa6da03f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
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 \
--
2.7.4