Allow compilation without hivex (RHBZ#723474).
authorRichard W.M. Jones <rjones@redhat.com>
Fri, 21 Oct 2011 11:28:45 +0000 (12:28 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 31 Oct 2011 08:47:15 +0000 (08:47 +0000)
(cherry picked from commit f5172902bc9d92451c83dc3c1a85b5aeb975b43a)

src/guestfs-internal.h
src/inspect.c
src/inspect_fs_windows.c

index 79d8990..b0921cb 100644 (file)
@@ -358,11 +358,12 @@ extern void guestfs___call_callbacks_message (guestfs_h *g, uint64_t event, cons
 extern void guestfs___call_callbacks_array (guestfs_h *g, uint64_t event, const uint64_t *array, size_t array_len);
 extern int guestfs___is_file_nocase (guestfs_h *g, const char *);
 extern int guestfs___is_dir_nocase (guestfs_h *g, const char *);
-#if defined(HAVE_HIVEX)
-extern int guestfs___check_for_filesystem_on (guestfs_h *g, const char *device, int is_block, int is_partnum);
 extern char *guestfs___download_to_tmp (guestfs_h *g, struct inspect_fs *fs, const char *filename, const char *basename, int64_t max_size);
 extern char *guestfs___case_sensitive_path_silently (guestfs_h *g, const char *);
 extern struct inspect_fs *guestfs___search_for_root (guestfs_h *g, const char *root);
+
+#if defined(HAVE_HIVEX)
+extern int guestfs___check_for_filesystem_on (guestfs_h *g, const char *device, int is_block, int is_partnum);
 extern int guestfs___parse_unsigned_int (guestfs_h *g, const char *str);
 extern int guestfs___parse_unsigned_int_ignore_trailing (guestfs_h *g, const char *str);
 extern int guestfs___parse_major_minor (guestfs_h *g, struct inspect_fs *fs);
index ba3e5de..a610d6a 100644 (file)
@@ -508,98 +508,6 @@ guestfs__inspect_get_hostname (guestfs_h *g, const char *root)
   return safe_strdup (g, fs->hostname ? : "unknown");
 }
 
-/* Download a guest file to a local temporary file.  The file is
- * cached in the temporary directory, and is not downloaded again.
- *
- * The name of the temporary (downloaded) file is returned.  The
- * caller must free the pointer, but does *not* need to delete the
- * temporary file.  It will be deleted when the handle is closed.
- *
- * Refuse to download the guest file if it is larger than max_size.
- * On this and other errors, NULL is returned.
- *
- * There is actually one cache per 'struct inspect_fs *' in order
- * to handle the case of multiple roots.
- */
-char *
-guestfs___download_to_tmp (guestfs_h *g, struct inspect_fs *fs,
-                           const char *filename,
-                           const char *basename, int64_t max_size)
-{
-  char *r;
-  int fd;
-  char devfd[32];
-  int64_t size;
-
-  /* Make the basename unique by prefixing it with the fs number. */
-  if (asprintf (&r, "%s/%ld-%s", g->tmpdir, fs - g->fses, basename) == -1) {
-    perrorf (g, "asprintf");
-    return NULL;
-  }
-
-  /* If the file has already been downloaded, return. */
-  if (access (r, R_OK) == 0)
-    return r;
-
-  /* Check size of remote file. */
-  size = guestfs_filesize (g, filename);
-  if (size == -1)
-    /* guestfs_filesize failed and has already set error in handle */
-    goto error;
-  if (size > max_size) {
-    error (g, _("size of %s is unreasonably large (%" PRIi64 " bytes)"),
-           filename, size);
-    goto error;
-  }
-
-  fd = open (r, O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY, 0600);
-  if (fd == -1) {
-    perrorf (g, "open: %s", r);
-    goto error;
-  }
-
-  snprintf (devfd, sizeof devfd, "/dev/fd/%d", fd);
-
-  if (guestfs_download (g, filename, devfd) == -1) {
-    unlink (r);
-    close (fd);
-    goto error;
-  }
-
-  if (close (fd) == -1) {
-    perrorf (g, "close: %s", r);
-    unlink (r);
-    goto error;
-  }
-
-  return r;
-
- error:
-  free (r);
-  return NULL;
-}
-
-struct inspect_fs *
-guestfs___search_for_root (guestfs_h *g, const char *root)
-{
-  if (g->nr_fses == 0) {
-    error (g, _("no inspection data: call guestfs_inspect_os first"));
-    return NULL;
-  }
-
-  size_t i;
-  struct inspect_fs *fs;
-  for (i = 0; i < g->nr_fses; ++i) {
-    fs = &g->fses[i];
-    if (fs->is_root && STREQ (root, fs->device))
-      return fs;
-  }
-
-  error (g, _("%s: root device not found: only call this function with a root device previously returned by guestfs_inspect_os"),
-         root);
-  return NULL;
-}
-
 #else /* no hivex at compile time */
 
 /* XXX These functions should be in an optgroup. */
@@ -780,3 +688,95 @@ guestfs___feature_available (guestfs_h *g, const char *feature)
 
   return r == 0 ? 1 : 0;
 }
+
+/* Download a guest file to a local temporary file.  The file is
+ * cached in the temporary directory, and is not downloaded again.
+ *
+ * The name of the temporary (downloaded) file is returned.  The
+ * caller must free the pointer, but does *not* need to delete the
+ * temporary file.  It will be deleted when the handle is closed.
+ *
+ * Refuse to download the guest file if it is larger than max_size.
+ * On this and other errors, NULL is returned.
+ *
+ * There is actually one cache per 'struct inspect_fs *' in order
+ * to handle the case of multiple roots.
+ */
+char *
+guestfs___download_to_tmp (guestfs_h *g, struct inspect_fs *fs,
+                           const char *filename,
+                           const char *basename, int64_t max_size)
+{
+  char *r;
+  int fd;
+  char devfd[32];
+  int64_t size;
+
+  /* Make the basename unique by prefixing it with the fs number. */
+  if (asprintf (&r, "%s/%ld-%s", g->tmpdir, fs - g->fses, basename) == -1) {
+    perrorf (g, "asprintf");
+    return NULL;
+  }
+
+  /* If the file has already been downloaded, return. */
+  if (access (r, R_OK) == 0)
+    return r;
+
+  /* Check size of remote file. */
+  size = guestfs_filesize (g, filename);
+  if (size == -1)
+    /* guestfs_filesize failed and has already set error in handle */
+    goto error;
+  if (size > max_size) {
+    error (g, _("size of %s is unreasonably large (%" PRIi64 " bytes)"),
+           filename, size);
+    goto error;
+  }
+
+  fd = open (r, O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY, 0600);
+  if (fd == -1) {
+    perrorf (g, "open: %s", r);
+    goto error;
+  }
+
+  snprintf (devfd, sizeof devfd, "/dev/fd/%d", fd);
+
+  if (guestfs_download (g, filename, devfd) == -1) {
+    unlink (r);
+    close (fd);
+    goto error;
+  }
+
+  if (close (fd) == -1) {
+    perrorf (g, "close: %s", r);
+    unlink (r);
+    goto error;
+  }
+
+  return r;
+
+ error:
+  free (r);
+  return NULL;
+}
+
+struct inspect_fs *
+guestfs___search_for_root (guestfs_h *g, const char *root)
+{
+  if (g->nr_fses == 0) {
+    error (g, _("no inspection data: call guestfs_inspect_os first"));
+    return NULL;
+  }
+
+  size_t i;
+  struct inspect_fs *fs;
+  for (i = 0; i < g->nr_fses; ++i) {
+    fs = &g->fses[i];
+    if (fs->is_root && STREQ (root, fs->device))
+      return fs;
+  }
+
+  error (g, _("%s: root device not found: only call this function with a root device previously returned by guestfs_inspect_os"),
+         root);
+  return NULL;
+}
index 7d09fd1..270b761 100644 (file)
@@ -571,6 +571,8 @@ map_registry_disk_blob (guestfs_h *g, const char *blob)
   return ret;
 }
 
+#endif /* defined(HAVE_HIVEX) */
+
 char *
 guestfs___case_sensitive_path_silently (guestfs_h *g, const char *path)
 {
@@ -580,5 +582,3 @@ guestfs___case_sensitive_path_silently (guestfs_h *g, const char *path)
   g->error_cb = old_error_cb;
   return ret;
 }
-
-#endif /* defined(HAVE_HIVEX) */