Generate progress messages during launch.
[libguestfs.git] / src / guestfs-internal.h
index 10c9503..3a63f2e 100644 (file)
@@ -1,5 +1,5 @@
 /* libguestfs
- * Copyright (C) 2009-2010 Red Hat Inc.
+ * Copyright (C) 2009-2011 Red Hat Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #ifndef GUESTFS_INTERNAL_H_
 #define GUESTFS_INTERNAL_H_
 
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+
+#ifdef HAVE_PCRE
+#include <pcre.h>
+#endif
+
 #define STREQ(a,b) (strcmp((a),(b)) == 0)
 #define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
 #define STRNEQ(a,b) (strcmp((a),(b)) != 0)
 /* GuestFS handle and connection. */
 enum state { CONFIG, LAUNCHING, READY, BUSY, NO_HANDLE };
 
+/* Attach method. */
+enum attach_method { ATTACH_METHOD_APPLIANCE = 0, ATTACH_METHOD_UNIX };
+
+/* Event. */
+struct event {
+  uint64_t event_bitmask;
+  guestfs_event_callback cb;
+  void *opaque;
+
+  /* opaque2 is not exposed through the API, but is used internally to
+   * emulate the old-style callback API.
+   */
+  void *opaque2;
+};
+
 struct guestfs_h
 {
   struct guestfs_h *next;      /* Linked list of open handles. */
@@ -109,26 +131,24 @@ struct guestfs_h
   char *qemu;                  /* Qemu binary. */
   char *append;                        /* Append to kernel command line. */
 
+  enum attach_method attach_method;
+  char *attach_method_arg;
+
   int memsize;                 /* Size of RAM (megabytes). */
 
   int selinux;                  /* selinux enabled? */
 
   char *last_error;
+  int last_errnum;              /* errno, or 0 if there was no errno */
 
   /* Callbacks. */
   guestfs_abort_cb           abort_cb;
   guestfs_error_handler_cb   error_cb;
   void *                     error_cb_data;
-  guestfs_log_message_cb     log_message_cb;
-  void *                     log_message_cb_data;
-  guestfs_subprocess_quit_cb subprocess_quit_cb;
-  void *                     subprocess_quit_cb_data;
-  guestfs_launch_done_cb     launch_done_cb;
-  void *                     launch_done_cb_data;
-  guestfs_close_cb           close_cb;
-  void *                     close_cb_data;
-  guestfs_progress_cb        progress_cb;
-  void *                     progress_cb_data;
+
+  /* Events. */
+  struct event *events;
+  size_t nr_events;
 
   int msg_next_serial;
 
@@ -140,6 +160,12 @@ struct guestfs_h
 
   /* Private data area. */
   struct hash_table *pda;
+  struct pda_entry *pda_next;
+
+  /* Used by src/actions.c:trace_* functions. */
+  FILE *trace_fp;
+  char *trace_buf;
+  size_t trace_len;
 };
 
 /* Per-filesystem data stored for inspect_os. */
@@ -147,16 +173,28 @@ enum inspect_fs_content {
   FS_CONTENT_UNKNOWN = 0,
   FS_CONTENT_LINUX_ROOT,
   FS_CONTENT_WINDOWS_ROOT,
+  FS_CONTENT_WINDOWS_VOLUME_WITH_APPS,
+  FS_CONTENT_WINDOWS_VOLUME,
   FS_CONTENT_LINUX_BOOT,
   FS_CONTENT_LINUX_USR,
   FS_CONTENT_LINUX_USR_LOCAL,
   FS_CONTENT_LINUX_VAR,
+  FS_CONTENT_FREEBSD_ROOT,
+  FS_CONTENT_INSTALLER,
+};
+
+enum inspect_os_format {
+  OS_FORMAT_UNKNOWN = 0,
+  OS_FORMAT_INSTALLED,
+  OS_FORMAT_INSTALLER,
+  /* in future: supplemental disks */
 };
 
 enum inspect_os_type {
   OS_TYPE_UNKNOWN = 0,
   OS_TYPE_LINUX,
   OS_TYPE_WINDOWS,
+  OS_TYPE_FREEBSD,
 };
 
 enum inspect_os_distro {
@@ -166,6 +204,34 @@ enum inspect_os_distro {
   OS_DISTRO_REDHAT_BASED,
   OS_DISTRO_RHEL,
   OS_DISTRO_WINDOWS,
+  OS_DISTRO_PARDUS,
+  OS_DISTRO_ARCHLINUX,
+  OS_DISTRO_GENTOO,
+  OS_DISTRO_UBUNTU,
+  OS_DISTRO_MEEGO,
+  OS_DISTRO_LINUX_MINT,
+  OS_DISTRO_MANDRIVA,
+  OS_DISTRO_SLACKWARE,
+};
+
+enum inspect_os_package_format {
+  OS_PACKAGE_FORMAT_UNKNOWN = 0,
+  OS_PACKAGE_FORMAT_RPM,
+  OS_PACKAGE_FORMAT_DEB,
+  OS_PACKAGE_FORMAT_PACMAN,
+  OS_PACKAGE_FORMAT_EBUILD,
+  OS_PACKAGE_FORMAT_PISI
+};
+
+enum inspect_os_package_management {
+  OS_PACKAGE_MANAGEMENT_UNKNOWN = 0,
+  OS_PACKAGE_MANAGEMENT_YUM,
+  OS_PACKAGE_MANAGEMENT_UP2DATE,
+  OS_PACKAGE_MANAGEMENT_APT,
+  OS_PACKAGE_MANAGEMENT_PACMAN,
+  OS_PACKAGE_MANAGEMENT_PORTAGE,
+  OS_PACKAGE_MANAGEMENT_PISI,
+  OS_PACKAGE_MANAGEMENT_URPMI,
 };
 
 struct inspect_fs {
@@ -176,11 +242,19 @@ struct inspect_fs {
   enum inspect_fs_content content;
   enum inspect_os_type type;
   enum inspect_os_distro distro;
+  enum inspect_os_package_format package_format;
+  enum inspect_os_package_management package_management;
   char *product_name;
+  char *product_variant;
   int major_version;
   int minor_version;
   char *arch;
+  char *hostname;
   char *windows_systemroot;
+  enum inspect_os_format format;
+  int is_live_disk;
+  int is_netinst_disk;
+  int is_multipart_disk;
   struct inspect_fstab_entry *fstab;
   size_t nr_fstab;
 };
@@ -192,36 +266,76 @@ struct inspect_fstab_entry {
 
 struct guestfs_message_header;
 struct guestfs_message_error;
+struct guestfs_progress;
 
 extern void guestfs_error (guestfs_h *g, const char *fs, ...)
   __attribute__((format (printf,2,3)));
+extern void guestfs_error_errno (guestfs_h *g, int errnum, const char *fs, ...)
+  __attribute__((format (printf,3,4)));
 extern void guestfs_perrorf (guestfs_h *g, const char *fs, ...)
   __attribute__((format (printf,2,3)));
 extern void *guestfs_safe_realloc (guestfs_h *g, void *ptr, int nbytes);
 extern char *guestfs_safe_strdup (guestfs_h *g, const char *str);
 extern char *guestfs_safe_strndup (guestfs_h *g, const char *str, size_t n);
 extern void *guestfs_safe_memdup (guestfs_h *g, void *ptr, size_t size);
+extern char *guestfs_safe_asprintf (guestfs_h *g, const char *fs, ...)
+  __attribute__((format (printf,2,3)));
+extern void guestfs___warning (guestfs_h *g, const char *fs, ...)
+  __attribute__((format (printf,2,3)));
+extern void guestfs___debug (guestfs_h *g, const char *fs, ...)
+  __attribute__((format (printf,2,3)));
+extern void guestfs___trace (guestfs_h *g, const char *fs, ...)
+  __attribute__((format (printf,2,3)));
+extern const char *guestfs___persistent_tmpdir (void);
 extern void guestfs___print_timestamped_argv (guestfs_h *g, const char *argv[]);
 extern void guestfs___print_timestamped_message (guestfs_h *g, const char *fs, ...);
 extern void guestfs___free_inspect_info (guestfs_h *g);
 extern int guestfs___set_busy (guestfs_h *g);
 extern int guestfs___end_busy (guestfs_h *g);
-extern int guestfs___send (guestfs_h *g, int proc_nr, xdrproc_t xdrp, char *args);
+extern int guestfs___send (guestfs_h *g, int proc_nr, uint64_t progress_hint, uint64_t optargs_bitmask, xdrproc_t xdrp, char *args);
 extern int guestfs___recv (guestfs_h *g, const char *fn, struct guestfs_message_header *hdr, struct guestfs_message_error *err, xdrproc_t xdrp, char *ret);
+extern int guestfs___recv_discard (guestfs_h *g, const char *fn);
 extern int guestfs___send_file (guestfs_h *g, const char *filename);
 extern int guestfs___recv_file (guestfs_h *g, const char *filename);
 extern int guestfs___send_to_daemon (guestfs_h *g, const void *v_buf, size_t n);
 extern int guestfs___recv_from_daemon (guestfs_h *g, uint32_t *size_rtn, void **buf_rtn);
 extern int guestfs___accept_from_daemon (guestfs_h *g);
+extern void guestfs___progress_message_callback (guestfs_h *g, const struct guestfs_progress *message);
 extern int guestfs___build_appliance (guestfs_h *g, char **kernel, char **initrd, char **appliance);
+extern void guestfs___launch_send_progress (guestfs_h *g, int perdozen);
 extern void guestfs___print_BufferIn (FILE *out, const char *buf, size_t buf_size);
-
-#define error guestfs_error
+extern void guestfs___print_BufferOut (FILE *out, const char *buf, size_t buf_size);
+#ifdef HAVE_PCRE
+extern int guestfs___match (guestfs_h *g, const char *str, const pcre *re);
+extern char *guestfs___match1 (guestfs_h *g, const char *str, const pcre *re);
+extern int guestfs___match2 (guestfs_h *g, const char *str, const pcre *re, char **ret1, char **ret2);
+extern int guestfs___match3 (guestfs_h *g, const char *str, const pcre *re, char **ret1, char **ret2, char **ret3);
+#endif
+extern int guestfs___feature_available (guestfs_h *g, const char *feature);
+extern void guestfs___free_string_list (char **);
+extern int guestfs___checkpoint_cmdline (guestfs_h *g);
+extern void guestfs___rollback_cmdline (guestfs_h *g, int pos);
+extern void guestfs___call_callbacks_void (guestfs_h *g, uint64_t event);
+extern void guestfs___call_callbacks_message (guestfs_h *g, uint64_t event, const char *buf, size_t buf_len);
+extern void guestfs___call_callbacks_array (guestfs_h *g, uint64_t event, const uint64_t *array, size_t array_len);
+
+#define error(g,...) guestfs_error_errno((g),0,__VA_ARGS__)
 #define perrorf guestfs_perrorf
+#define warning(g,...) guestfs___warning((g),__VA_ARGS__)
+#define debug(g,...) \
+  do { if ((g)->verbose) guestfs___debug ((g),__VA_ARGS__); } while (0)
+#define safe_calloc guestfs_safe_calloc
 #define safe_malloc guestfs_safe_malloc
 #define safe_realloc guestfs_safe_realloc
 #define safe_strdup guestfs_safe_strdup
 #define safe_strndup guestfs_safe_strndup
 #define safe_memdup guestfs_safe_memdup
+#define safe_asprintf guestfs_safe_asprintf
+#ifdef HAVE_PCRE
+#define match guestfs___match
+#define match1 guestfs___match1
+#define match2 guestfs___match2
+#define match3 guestfs___match3
+#endif
 
 #endif /* GUESTFS_INTERNAL_H_ */