X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Fguestfs-internal.h;h=10c950389631b1da7680620e9b404a41d79788eb;hp=aa78c3a8e3e933d0e403bdac8791ec9c80f831c7;hb=06fef60db5c7a96cb59aa92c4708e10333345e90;hpb=ade327a7af869d4d70e28e2a596473943e0299dd diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index aa78c3a..10c9503 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -1,5 +1,5 @@ /* libguestfs - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2010 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 @@ -29,4 +29,199 @@ #define STRCASENEQLEN(a,b,n) (strncasecmp((a),(b),(n)) != 0) #define STRPREFIX(a,b) (strncmp((a),(b),strlen((b))) == 0) +#ifdef HAVE_GETTEXT +#include "gettext.h" +#define _(str) dgettext(PACKAGE, (str)) +#define N_(str) dgettext(PACKAGE, (str)) +#else +#define _(str) str +#define N_(str) str +#endif + +#define TMP_TEMPLATE_ON_STACK(var) \ + const char *ttos_tmpdir = guestfs_tmpdir (); \ + char var[strlen (ttos_tmpdir) + 32]; \ + sprintf (var, "%s/libguestfsXXXXXX", ttos_tmpdir) \ + +#define UNIX_PATH_MAX 108 + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifdef __APPLE__ +#define xdr_uint32_t xdr_u_int32_t +#endif + +/* 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 + * userspace calls on the host (eg. connect(2)). qemu-doc has a nice + * diagram which is also useful to refer to. + * + * NETWORK: The network. + * + * ROUTER: The address of the "host", ie. this library. + * + * [Note: If you change NETWORK and ROUTER then you also have to + * change the network configuration in appliance/init]. + * + * GUESTFWD_ADDR, GUESTFWD_PORT: The guestfwd feature of qemu + * magically connects this pseudo-address to the guestfwd channel. In + * typical Linux configurations of libguestfs, guestfwd is not + * actually used any more. + */ +#define NETWORK "169.254.0.0/16" +#define ROUTER "169.254.2.2" + +/* GuestFS handle and connection. */ +enum state { CONFIG, LAUNCHING, READY, BUSY, NO_HANDLE }; + +struct guestfs_h +{ + struct guestfs_h *next; /* Linked list of open handles. */ + + /* State: see the state machine diagram in the man page guestfs(3). */ + enum state state; + + int fd[2]; /* Stdin/stdout of qemu. */ + int sock; /* Daemon communications socket. */ + pid_t pid; /* Qemu PID. */ + pid_t recoverypid; /* Recovery process PID. */ + + struct timeval launch_t; /* The time that we called guestfs_launch. */ + + char *tmpdir; /* Temporary directory containing socket. */ + + char *qemu_help, *qemu_version; /* Output of qemu -help, qemu -version. */ + + char **cmdline; /* Qemu command line. */ + int cmdline_size; + + int verbose; + int trace; + int autosync; + int direct; + int recovery_proc; + int enable_network; + + char *path; /* Path to kernel, initrd. */ + char *qemu; /* Qemu binary. */ + char *append; /* Append to kernel command line. */ + + int memsize; /* Size of RAM (megabytes). */ + + int selinux; /* selinux enabled? */ + + char *last_error; + + /* 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; + + int msg_next_serial; + + /* Information gathered by inspect_os. Must be freed by calling + * guestfs___free_inspect_info. + */ + struct inspect_fs *fses; + size_t nr_fses; + + /* Private data area. */ + struct hash_table *pda; +}; + +/* Per-filesystem data stored for inspect_os. */ +enum inspect_fs_content { + FS_CONTENT_UNKNOWN = 0, + FS_CONTENT_LINUX_ROOT, + FS_CONTENT_WINDOWS_ROOT, + FS_CONTENT_LINUX_BOOT, + FS_CONTENT_LINUX_USR, + FS_CONTENT_LINUX_USR_LOCAL, + FS_CONTENT_LINUX_VAR, +}; + +enum inspect_os_type { + OS_TYPE_UNKNOWN = 0, + OS_TYPE_LINUX, + OS_TYPE_WINDOWS, +}; + +enum inspect_os_distro { + OS_DISTRO_UNKNOWN = 0, + OS_DISTRO_DEBIAN, + OS_DISTRO_FEDORA, + OS_DISTRO_REDHAT_BASED, + OS_DISTRO_RHEL, + OS_DISTRO_WINDOWS, +}; + +struct inspect_fs { + int is_root; + char *device; + int is_mountable; + int is_swap; + enum inspect_fs_content content; + enum inspect_os_type type; + enum inspect_os_distro distro; + char *product_name; + int major_version; + int minor_version; + char *arch; + char *windows_systemroot; + struct inspect_fstab_entry *fstab; + size_t nr_fstab; +}; + +struct inspect_fstab_entry { + char *device; + char *mountpoint; +}; + +struct guestfs_message_header; +struct guestfs_message_error; + +extern void guestfs_error (guestfs_h *g, const char *fs, ...) + __attribute__((format (printf,2,3))); +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 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___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___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 int guestfs___build_appliance (guestfs_h *g, char **kernel, char **initrd, char **appliance); +extern void guestfs___print_BufferIn (FILE *out, const char *buf, size_t buf_size); + +#define error guestfs_error +#define perrorf guestfs_perrorf +#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 + #endif /* GUESTFS_INTERNAL_H_ */