[Libguestfs] [PATCH 1/5] common/utils: Move ‘full_path’ and ‘is_reg’ (etc) into utils (from visit).

Richard W.M. Jones rjones at redhat.com
Tue Sep 26 12:16:11 UTC 2017


I also renamed the functions with the correct ‘guestfs_int_*’
namespace.

The corresponding change is made for OCaml C_utils and Visit.

No functional change, just code motion.
---
 cat/ls.c                                  |  23 ++++---
 common/mlutils/c_utils-c.c                |  32 +++++++++
 common/mlutils/c_utils.ml                 |  10 +++
 common/mlutils/c_utils.mli                |  19 ++++++
 common/mlvisit/Makefile.am                |   6 +-
 common/mlvisit/visit-c.c                  |  32 ---------
 common/mlvisit/visit.ml                   |  11 ---
 common/mlvisit/visit.mli                  |  19 ------
 common/mlvisit/visit_tests.ml             |   1 +
 common/utils/guestfs-utils.h              |   8 +++
 common/utils/utils.c                      | 109 ++++++++++++++++++++++++++++++
 common/visit/visit.c                      |  82 ++--------------------
 common/visit/visit.h                      |  10 ---
 diff/diff.c                               |  36 ++++++----
 sysprep/sysprep_operation_backup_files.ml |   1 +
 15 files changed, 225 insertions(+), 174 deletions(-)

diff --git a/cat/ls.c b/cat/ls.c
index d71b800f0..9f0641892 100644
--- a/cat/ls.c
+++ b/cat/ls.c
@@ -47,6 +47,7 @@
 
 #include "options.h"
 #include "display-options.h"
+#include "guestfs-utils.h"
 #include "visit.h"
 
 /* Currently open libguestfs handle. */
@@ -481,19 +482,19 @@ show_file (const char *dir, const char *name,
   /* Display the basic fields. */
   output_start_line ();
 
-  if (is_reg (stat->st_mode))
+  if (guestfs_int_is_reg (stat->st_mode))
     filetype = "-";
-  else if (is_dir (stat->st_mode))
+  else if (guestfs_int_is_dir (stat->st_mode))
     filetype = "d";
-  else if (is_chr (stat->st_mode))
+  else if (guestfs_int_is_chr (stat->st_mode))
     filetype = "c";
-  else if (is_blk (stat->st_mode))
+  else if (guestfs_int_is_blk (stat->st_mode))
     filetype = "b";
-  else if (is_fifo (stat->st_mode))
+  else if (guestfs_int_is_fifo (stat->st_mode))
     filetype = "p";
-  else if (is_lnk (stat->st_mode))
+  else if (guestfs_int_is_lnk (stat->st_mode))
     filetype = "l";
-  else if (is_sock (stat->st_mode))
+  else if (guestfs_int_is_sock (stat->st_mode))
     filetype = "s";
   else
     filetype = "u";
@@ -527,10 +528,12 @@ show_file (const char *dir, const char *name,
     output_xattrs (xattrs);
   */
 
-  path = full_path (dir, name);
+  path = guestfs_int_full_path (dir, name);
+  if (!path)
+    error (EXIT_FAILURE, errno, "guestfs_int_full_path");
 
   if (checksum) {
-    if (is_reg (stat->st_mode)) {
+    if (guestfs_int_is_reg (stat->st_mode)) {
       csum = guestfs_checksum (g, checksum, path);
       if (!csum)
         exit (EXIT_FAILURE);
@@ -542,7 +545,7 @@ show_file (const char *dir, const char *name,
 
   output_string (path);
 
-  if (is_lnk (stat->st_mode))
+  if (guestfs_int_is_lnk (stat->st_mode))
     /* XXX Fix this for NTFS. */
     link = guestfs_readlink (g, path);
   if (link)
diff --git a/common/mlutils/c_utils-c.c b/common/mlutils/c_utils-c.c
index 50841de42..2e8aeff9b 100644
--- a/common/mlutils/c_utils-c.c
+++ b/common/mlutils/c_utils-c.c
@@ -75,3 +75,35 @@ guestfs_int_mlutils_shell_unquote (value strv)
   free (ret);
   CAMLreturn (retv);
 }
+
+#define is(t)                                                   \
+  value                                                         \
+  guestfs_int_mlutils_is_##t (value iv)                         \
+  {                                                             \
+    return Val_bool (guestfs_int_is_##t (Int64_val (iv)));      \
+  }
+is(reg)
+is(dir)
+is(chr)
+is(blk)
+is(fifo)
+is(lnk)
+is(sock)
+
+value
+guestfs_int_mlutils_full_path (value dirv, value namev)
+{
+  CAMLparam2 (dirv, namev);
+  CAMLlocal1 (rv);
+  const char *name = NULL;
+  char *ret;
+
+  if (namev != Val_int (0))
+    name = String_val (Field (namev, 0));
+
+  ret = guestfs_int_full_path (String_val (dirv), name);
+  rv = caml_copy_string (ret);
+  free (ret);
+
+  CAMLreturn (rv);
+}
diff --git a/common/mlutils/c_utils.ml b/common/mlutils/c_utils.ml
index e4263962d..00a6fff4e 100644
--- a/common/mlutils/c_utils.ml
+++ b/common/mlutils/c_utils.ml
@@ -24,3 +24,13 @@ external drive_name : int -> string = "guestfs_int_mlutils_drive_name"
 external drive_index : string -> int = "guestfs_int_mlutils_drive_index"
 
 external shell_unquote : string -> string = "guestfs_int_mlutils_shell_unquote"
+
+external is_reg : int64 -> bool = "guestfs_int_mlutils_is_reg" "noalloc"
+external is_dir : int64 -> bool = "guestfs_int_mlutils_is_dir" "noalloc"
+external is_chr : int64 -> bool = "guestfs_int_mlutils_is_chr" "noalloc"
+external is_blk : int64 -> bool = "guestfs_int_mlutils_is_blk" "noalloc"
+external is_fifo : int64 -> bool = "guestfs_int_mlutils_is_fifo" "noalloc"
+external is_lnk : int64 -> bool = "guestfs_int_mlutils_is_lnk" "noalloc"
+external is_sock : int64 -> bool = "guestfs_int_mlutils_is_sock" "noalloc"
+
+external full_path : string -> string option -> string = "guestfs_int_mlutils_full_path"
diff --git a/common/mlutils/c_utils.mli b/common/mlutils/c_utils.mli
index 7824f9658..68edc47a9 100644
--- a/common/mlutils/c_utils.mli
+++ b/common/mlutils/c_utils.mli
@@ -28,3 +28,22 @@ val shell_unquote : string -> string
     This is just intended to deal with quoting in configuration files
     (like ones under /etc/sysconfig), and it doesn't deal with some
     situations such as $variable interpolation. *)
+
+val is_reg : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a regular file. *)
+val is_dir : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a directory. *)
+val is_chr : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a character device. *)
+val is_blk : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a block device. *)
+val is_fifo : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a FIFO. *)
+val is_lnk : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a symbolic link. *)
+val is_sock : int64 -> bool
+(** Returns true if [G.statns.st_mode] represents a Unix domain socket. *)
+
+val full_path : string -> string option -> string
+(** This can be called with the [dir] and [name] parameters from
+    [visitor_function] to return the full canonical path. *)
diff --git a/common/mlvisit/Makefile.am b/common/mlvisit/Makefile.am
index fcf3bc0be..6466efbe0 100644
--- a/common/mlvisit/Makefile.am
+++ b/common/mlvisit/Makefile.am
@@ -70,6 +70,7 @@ XOBJECTS = $(BOBJECTS:.cmo=.cmx)
 # installed copy of libguestfs.
 OCAMLPACKAGES = \
 	-package str,unix \
+	-I $(top_builddir)/common/mlutils \
 	-I $(top_builddir)/lib/.libs \
 	-I $(top_builddir)/gnulib/lib/.libs \
 	-I $(top_builddir)/ocaml \
@@ -108,10 +109,13 @@ visit_tests_THEOBJECTS = $(visit_tests_XOBJECTS)
 visit_tests.cmx: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS)
 endif
 
-OCAMLLINKFLAGS = mlguestfs.$(MLARCHIVE) $(LINK_CUSTOM_OCAMLC_ONLY)
+OCAMLLINKFLAGS = \
+	mlcutils.$(MLARCHIVE) \
+	mlguestfs.$(MLARCHIVE) $(LINK_CUSTOM_OCAMLC_ONLY)
 
 visit_tests_DEPENDENCIES = \
 	$(visit_tests_THEOBJECTS) \
+	../mlutils/mlcutils.$(MLARCHIVE) \
 	$(MLVISIT_CMA) \
 	$(top_srcdir)/ocaml-link.sh
 visit_tests_LINK = \
diff --git a/common/mlvisit/visit-c.c b/common/mlvisit/visit-c.c
index 4cd1c6cea..fcd0428f7 100644
--- a/common/mlvisit/visit-c.c
+++ b/common/mlvisit/visit-c.c
@@ -133,38 +133,6 @@ visitor_function_wrapper (const char *dir,
   CAMLreturnT (int, 0);
 }
 
-value
-guestfs_int_mllib_full_path (value dirv, value namev)
-{
-  CAMLparam2 (dirv, namev);
-  CAMLlocal1 (rv);
-  const char *name = NULL;
-  char *ret;
-
-  if (namev != Val_int (0))
-    name = String_val (Field (namev, 0));
-
-  ret = full_path (String_val (dirv), name);
-  rv = caml_copy_string (ret);
-  free (ret);
-
-  CAMLreturn (rv);
-}
-
-#define is(t)                                           \
-  value                                                 \
-  guestfs_int_mllib_is_##t (value iv)                   \
-  {                                                     \
-    return Val_bool (is_##t (Int64_val (iv)));          \
-  }
-is(reg)
-is(dir)
-is(chr)
-is(blk)
-is(fifo)
-is(lnk)
-is(sock)
-
 /* The functions below are copied from ocaml/guestfs-c-actions.c. */
 
 static value
diff --git a/common/mlvisit/visit.ml b/common/mlvisit/visit.ml
index c979e3e9e..da2e122ed 100644
--- a/common/mlvisit/visit.ml
+++ b/common/mlvisit/visit.ml
@@ -23,14 +23,3 @@ external c_visit : int64 -> string -> visitor_function -> unit =
 
 let visit g dir f =
   c_visit (Guestfs.c_pointer g) dir f
-
-external full_path : string -> string option -> string =
-  "guestfs_int_mllib_full_path"
-
-external is_reg : int64 -> bool = "guestfs_int_mllib_is_reg" "noalloc"
-external is_dir : int64 -> bool = "guestfs_int_mllib_is_dir" "noalloc"
-external is_chr : int64 -> bool = "guestfs_int_mllib_is_chr" "noalloc"
-external is_blk : int64 -> bool = "guestfs_int_mllib_is_blk" "noalloc"
-external is_fifo : int64 -> bool = "guestfs_int_mllib_is_fifo" "noalloc"
-external is_lnk : int64 -> bool = "guestfs_int_mllib_is_lnk" "noalloc"
-external is_sock : int64 -> bool = "guestfs_int_mllib_is_sock" "noalloc"
diff --git a/common/mlvisit/visit.mli b/common/mlvisit/visit.mli
index 57ff85fa9..cba85785e 100644
--- a/common/mlvisit/visit.mli
+++ b/common/mlvisit/visit.mli
@@ -50,22 +50,3 @@ val visit : Guestfs.t -> string -> visitor_function -> unit
 
     If the visit function returns normally you can assume there
     was no error. *)
-
-val full_path : string -> string option -> string
-(** This can be called with the [dir] and [name] parameters from
-    [visitor_function] to return the full canonical path. *)
-
-val is_reg : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a regular file. *)
-val is_dir : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a directory. *)
-val is_chr : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a character device. *)
-val is_blk : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a block device. *)
-val is_fifo : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a FIFO. *)
-val is_lnk : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a symbolic link. *)
-val is_sock : int64 -> bool
-(** Returns true if [G.statns.st_mode] represents a Unix domain socket. *)
diff --git a/common/mlvisit/visit_tests.ml b/common/mlvisit/visit_tests.ml
index f5d2b57d3..7b0f01347 100644
--- a/common/mlvisit/visit_tests.ml
+++ b/common/mlvisit/visit_tests.ml
@@ -20,6 +20,7 @@
 
 open Printf
 
+open C_utils
 open Visit
 
 module G = Guestfs
diff --git a/common/utils/guestfs-utils.h b/common/utils/guestfs-utils.h
index 5758059ec..452611620 100644
--- a/common/utils/guestfs-utils.h
+++ b/common/utils/guestfs-utils.h
@@ -62,6 +62,14 @@ extern void guestfs_int_fadvise_noreuse (int fd);
 //extern void guestfs_int_fadvise_dontneed (int fd);
 //extern void guestfs_int_fadvise_willneed (int fd);
 extern char *guestfs_int_shell_unquote (const char *str);
+extern int guestfs_int_is_reg (int64_t mode);
+extern int guestfs_int_is_dir (int64_t mode);
+extern int guestfs_int_is_chr (int64_t mode);
+extern int guestfs_int_is_blk (int64_t mode);
+extern int guestfs_int_is_fifo (int64_t mode);
+extern int guestfs_int_is_lnk (int64_t mode);
+extern int guestfs_int_is_sock (int64_t mode);
+extern char *guestfs_int_full_path (const char *dir, const char *name);
 
 /* Not all language bindings know how to deal with Pointer arguments.
  * Those that don't will use this macro which complains noisily and
diff --git a/common/utils/utils.c b/common/utils/utils.c
index 58953e58a..105fd03cf 100644
--- a/common/utils/utils.c
+++ b/common/utils/utils.c
@@ -624,3 +624,112 @@ guestfs_int_shell_unquote (const char *str)
 
   return strdup (str);
 }
+
+/* In the libguestfs API, modes returned by lstat and friends are
+ * defined to contain Linux ABI values.  However since the "current
+ * operating system" might not be Linux, we have to hard-code those
+ * numbers in the functions below.
+ */
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a regular file.
+ */
+int
+guestfs_int_is_reg (int64_t mode)
+{
+  return (mode & 0170000) == 0100000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a directory.
+ */
+int
+guestfs_int_is_dir (int64_t mode)
+{
+  return (mode & 0170000) == 0040000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a char device.
+ */
+int
+guestfs_int_is_chr (int64_t mode)
+{
+  return (mode & 0170000) == 0020000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a block device.
+ */
+int
+guestfs_int_is_blk (int64_t mode)
+{
+  return (mode & 0170000) == 0060000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a named pipe (FIFO).
+ */
+int
+guestfs_int_is_fifo (int64_t mode)
+{
+  return (mode & 0170000) == 0010000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a symbolic link.
+ */
+int
+guestfs_int_is_lnk (int64_t mode)
+{
+  return (mode & 0170000) == 0120000;
+}
+
+/**
+ * Return true if the C<guestfs_statns> or C<guestfs_lstatns>
+ * C<st_mode> field represents a Unix domain socket.
+ */
+int
+guestfs_int_is_sock (int64_t mode)
+{
+  return (mode & 0170000) == 0140000;
+}
+
+/**
+ * Concatenate C<dir> and C<name> to create a path.  This correctly
+ * handles the case of concatenating C<"/" + "filename"> as well
+ * as C<"/dir" + "filename">.  C<name> may be C<NULL>.
+ *
+ * The caller must free the returned path.
+ *
+ * This function sets C<errno> and returns C<NULL> on error.
+ */
+char *
+guestfs_int_full_path (const char *dir, const char *name)
+{
+  int r;
+  char *path;
+  int len;
+
+  len = strlen (dir);
+  if (len > 0 && dir[len - 1] == '/')
+    --len;
+
+  if (STREQ (dir, "/"))
+    r = asprintf (&path, "/%s", name ? name : "");
+  else if (name)
+    r = asprintf (&path, "%.*s/%s", len, dir, name);
+  else
+    r = asprintf (&path, "%.*s", len, dir);
+
+  if (r == -1)
+    return NULL;
+
+  return path;
+}
diff --git a/common/visit/visit.c b/common/visit/visit.c
index 18380ab43..a7ee0f8fa 100644
--- a/common/visit/visit.c
+++ b/common/visit/visit.c
@@ -158,8 +158,12 @@ _visit (guestfs_h *g, int depth, const char *dir,
       return -1;
 
     /* Recursively call visit, but only on directories. */
-    if (is_dir (stats->val[i].st_mode)) {
-      path = full_path (dir, names[i]);
+    if (guestfs_int_is_dir (stats->val[i].st_mode)) {
+      path = guestfs_int_full_path (dir, names[i]);
+      if (!path) {
+        perror ("guestfs_int_full_path");
+        return -1;
+      }
       if (_visit (g, depth + 1, path, f, opaque) == -1)
         return -1;
     }
@@ -167,77 +171,3 @@ _visit (guestfs_h *g, int depth, const char *dir,
 
   return 0;
 }
-
-char *
-full_path (const char *dir, const char *name)
-{
-  int r;
-  char *path;
-  int len;
-
-  len = strlen (dir);
-  if (len > 0 && dir[len - 1] == '/')
-    --len;
-
-  if (STREQ (dir, "/"))
-    r = asprintf (&path, "/%s", name ? name : "");
-  else if (name)
-    r = asprintf (&path, "%.*s/%s", len, dir, name);
-  else
-    r = asprintf (&path, "%.*s", len, dir);
-
-  if (r == -1) {
-    perror ("asprintf");
-    abort ();
-  }
-
-  return path;
-}
-
-/* In the libguestfs API, modes returned by lstat and friends are
- * defined to contain Linux ABI values.  However since the "current
- * operating system" might not be Linux, we have to hard-code those
- * numbers here.
- */
-int
-is_reg (int64_t mode)
-{
-  return (mode & 0170000) == 0100000;
-}
-
-int
-is_dir (int64_t mode)
-{
-  return (mode & 0170000) == 0040000;
-}
-
-int
-is_chr (int64_t mode)
-{
-  return (mode & 0170000) == 0020000;
-}
-
-int
-is_blk (int64_t mode)
-{
-  return (mode & 0170000) == 0060000;
-}
-
-int
-is_fifo (int64_t mode)
-{
-  return (mode & 0170000) == 0010000;
-}
-
-/* symbolic link */
-int
-is_lnk (int64_t mode)
-{
-  return (mode & 0170000) == 0120000;
-}
-
-int
-is_sock (int64_t mode)
-{
-  return (mode & 0170000) == 0140000;
-}
diff --git a/common/visit/visit.h b/common/visit/visit.h
index 3bf0524ff..c8de5adec 100644
--- a/common/visit/visit.h
+++ b/common/visit/visit.h
@@ -23,14 +23,4 @@ typedef int (*visitor_function) (const char *dir, const char *name, const struct
 
 extern int visit (guestfs_h *g, const char *dir, visitor_function f, void *opaque);
 
-extern char *full_path (const char *dir, const char *name);
-
-extern int is_reg (int64_t mode);
-extern int is_dir (int64_t mode);
-extern int is_chr (int64_t mode);
-extern int is_blk (int64_t mode);
-extern int is_fifo (int64_t mode);
-extern int is_lnk (int64_t mode);
-extern int is_sock (int64_t mode);
-
 #endif /* VISIT_H */
diff --git a/diff/diff.c b/diff/diff.c
index ed02f84b7..5851a1c9c 100644
--- a/diff/diff.c
+++ b/diff/diff.c
@@ -49,6 +49,7 @@
 
 #include "options.h"
 #include "display-options.h"
+#include "guestfs-utils.h"
 #include "visit.h"
 
 /* Internal tree structure built for each guest. */
@@ -479,7 +480,11 @@ visit_entry (const char *dir, const char *name,
   struct guestfs_xattr_list *xattrs = NULL;
   size_t i;
 
-  path = full_path (dir, name);
+  path = guestfs_int_full_path (dir, name);
+  if (!path) {
+    perror ("guestfs_int_full_path");
+    goto error;
+  }
 
   /* Copy the stats and xattrs because the visit function will
    * free them after we return.
@@ -491,7 +496,7 @@ visit_entry (const char *dir, const char *name,
   if (xattrs == NULL)
     goto error;
 
-  if (checksum && is_reg (stat->st_mode)) {
+  if (checksum && guestfs_int_is_reg (stat->st_mode)) {
     csum = guestfs_checksum (t->g, checksum, path);
     if (!csum)
       goto error;
@@ -504,13 +509,13 @@ visit_entry (const char *dir, const char *name,
   /* If --dir-links option was NOT passed, flatten nlink field in
    * directories.
    */
-  if (!dir_links && is_dir (stat->st_mode))
+  if (!dir_links && guestfs_int_is_dir (stat->st_mode))
     stat->st_nlink = 0;
 
   /* If --dir-times option was NOT passed, flatten time fields in
    * directories.
    */
-  if (!dir_times && is_dir (stat->st_mode))
+  if (!dir_times && guestfs_int_is_dir (stat->st_mode))
     stat->st_atime_sec = stat->st_mtime_sec = stat->st_ctime_sec =
       stat->st_atime_nsec = stat->st_mtime_nsec = stat->st_ctime_nsec = 0;
 
@@ -652,7 +657,8 @@ changed (guestfs_h *g1, struct file *file1,
 {
   /* Did file content change? */
   if (cst != 0 ||
-      (is_reg (file1->stat->st_mode) && is_reg (file2->stat->st_mode) &&
+      (guestfs_int_is_reg (file1->stat->st_mode) &&
+       guestfs_int_is_reg (file2->stat->st_mode) &&
        (file1->stat->st_mtime_sec != file2->stat->st_mtime_sec ||
         file1->stat->st_ctime_sec != file2->stat->st_ctime_sec ||
         file1->stat->st_size != file2->stat->st_size))) {
@@ -713,8 +719,8 @@ diff (struct file *file1, guestfs_h *g1, struct file *file2, guestfs_h *g2)
   CLEANUP_FREE char *tmpd, *tmpda = NULL, *tmpdb = NULL, *cmd = NULL;
   int r;
 
-  assert (is_reg (file1->stat->st_mode));
-  assert (is_reg (file2->stat->st_mode));
+  assert (guestfs_int_is_reg (file1->stat->st_mode));
+  assert (guestfs_int_is_reg (file2->stat->st_mode));
 
   if (asprintf (&tmpd, "%s/virtdiffXXXXXX", tmpdir) < 0)
     error (EXIT_FAILURE, errno, "asprintf");
@@ -759,19 +765,19 @@ output_file (guestfs_h *g, struct file *file)
   size_t i;
   CLEANUP_FREE char *link = NULL;
 
-  if (is_reg (file->stat->st_mode))
+  if (guestfs_int_is_reg (file->stat->st_mode))
     filetype = "-";
-  else if (is_dir (file->stat->st_mode))
+  else if (guestfs_int_is_dir (file->stat->st_mode))
     filetype = "d";
-  else if (is_chr (file->stat->st_mode))
+  else if (guestfs_int_is_chr (file->stat->st_mode))
     filetype = "c";
-  else if (is_blk (file->stat->st_mode))
+  else if (guestfs_int_is_blk (file->stat->st_mode))
     filetype = "b";
-  else if (is_fifo (file->stat->st_mode))
+  else if (guestfs_int_is_fifo (file->stat->st_mode))
     filetype = "p";
-  else if (is_lnk (file->stat->st_mode))
+  else if (guestfs_int_is_lnk (file->stat->st_mode))
     filetype = "l";
-  else if (is_sock (file->stat->st_mode))
+  else if (guestfs_int_is_sock (file->stat->st_mode))
     filetype = "s";
   else
     filetype = "u";
@@ -807,7 +813,7 @@ output_file (guestfs_h *g, struct file *file)
 
   output_string (file->path);
 
-  if (is_lnk (file->stat->st_mode)) {
+  if (guestfs_int_is_lnk (file->stat->st_mode)) {
     /* XXX Fix this for NTFS. */
     link = guestfs_readlink (g, file->path);
     if (link)
diff --git a/sysprep/sysprep_operation_backup_files.ml b/sysprep/sysprep_operation_backup_files.ml
index 64df8d758..a8b22e1b8 100644
--- a/sysprep/sysprep_operation_backup_files.ml
+++ b/sysprep/sysprep_operation_backup_files.ml
@@ -19,6 +19,7 @@
 open Printf
 
 open Std_utils
+open C_utils
 open Common_utils
 open Common_gettext.Gettext
 open Visit
-- 
2.13.2




More information about the Libguestfs mailing list