/* 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
#define xdr_uint32_t xdr_u_int32_t
#endif
+/* Some limits on what the inspection code will read, for safety. */
+
+/* Small text configuration files.
+ *
+ * The upper limit is for general files that we grep or download. The
+ * largest such file is probably "txtsetup.sif" from Windows CDs
+ * (~500K). This number has to be larger than any legitimate file and
+ * smaller than the protocol message size.
+ *
+ * The lower limit is for files parsed by Augeas on the daemon side,
+ * where Augeas is running in reduced memory and can potentially
+ * create a lot of metadata so we really need to be careful about
+ * those.
+ */
+#define MAX_SMALL_FILE_SIZE (2 * 1000 * 1000)
+#define MAX_AUGEAS_FILE_SIZE (100 * 1000)
+
+/* Maximum Windows Registry hive that we will download to /tmp. Some
+ * registries can be legitimately very large.
+ */
+#define MAX_REGISTRY_SIZE (100 * 1000 * 1000)
+
+/* Maximum RPM or dpkg database we will download to /tmp. RPM
+ * 'Packages' database can get very large: 70 MB is roughly the
+ * standard size for a new Fedora install, and after lots of package
+ * installation/removal I have seen well over 100 MB databases.
+ */
+#define MAX_PKG_DB_SIZE (300 * 1000 * 1000)
+
+/* Maximum size of Windows explorer.exe. 2.6MB on Windows 7. */
+#define MAX_WINDOWS_EXPLORER_SIZE (4 * 1000 * 1000)
+
/* Network configuration of the appliance. Note these addresses are
* only meaningful within the context of the running appliance. QEMU
* translates network connections to these magic addresses into
/* 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. */
char *qemu_help, *qemu_version; /* Output of qemu -help, qemu -version. */
char **cmdline; /* Qemu command line. */
- int cmdline_size;
+ size_t cmdline_size;
int verbose;
int trace;
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? */
+ int pgroup; /* Create process group for children? */
+
char *last_error;
int last_errnum; /* errno, or 0 if there was no errno */
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;
/* 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;
+
+ /* User cancelled transfer. Not signal-atomic, but it doesn't
+ * matter for this case because we only care if it is != 0.
+ */
+ int user_cancel;
};
/* Per-filesystem data stored for inspect_os. */
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_DISTRO_MEEGO,
OS_DISTRO_LINUX_MINT,
OS_DISTRO_MANDRIVA,
+ OS_DISTRO_SLACKWARE,
+ OS_DISTRO_CENTOS,
+ OS_DISTRO_SCIENTIFIC_LINUX,
};
enum inspect_os_package_format {
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;
+ char *windows_current_control_set;
+ char **drive_mappings;
+ 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;
};
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_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);
+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);
#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 size_t guestfs___checkpoint_cmdline (guestfs_h *g);
+extern void guestfs___rollback_cmdline (guestfs_h *g, size_t 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);
+#if defined(HAVE_PCRE) && 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);
+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);
+extern char *guestfs___first_line_of_file (guestfs_h *g, const char *filename);
+extern int guestfs___first_egrep_of_file (guestfs_h *g, const char *filename, const char *eregex, int iflag, char **ret);
+typedef int (*guestfs___db_dump_callback) (guestfs_h *g, const unsigned char *key, size_t keylen, const unsigned char *value, size_t valuelen, void *opaque);
+extern int guestfs___read_db_dump (guestfs_h *g, const char *dumpfile, void *opaque, guestfs___db_dump_callback callback);
+extern int guestfs___check_installer_root (guestfs_h *g, struct inspect_fs *fs);
+extern int guestfs___check_linux_root (guestfs_h *g, struct inspect_fs *fs);
+extern int guestfs___check_freebsd_root (guestfs_h *g, struct inspect_fs *fs);
+extern int guestfs___check_windows_root (guestfs_h *g, struct inspect_fs *fs);
+#endif
#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