Guest boots, and basic select/callbacks work.

This commit is contained in:
Richard Jones
2009-04-02 20:07:21 +01:00
parent e94fca28c7
commit 88f69eb031
7 changed files with 721 additions and 321 deletions

1
.gitignore vendored
View File

@@ -1,5 +1,6 @@
.deps
.libs
*.bak
*.la
*.lo
*.o

View File

@@ -35,13 +35,12 @@ fs_DATA = $(INITRAMFSIMG) $(VMLINUZ)
$(VMLINUZ) $(INITRAMFSIMG): initramfs.timestamp
initramfs.timestamp: make-initramfs.sh.in daemon/guestfsd
#initramfs.timestamp: make-initramfs.sh.in daemon/guestfsd
initramfs.timestamp: make-initramfs.sh.in
rm -f $@
$(builddir)/make-initramfs.sh
bash $(builddir)/make-initramfs.sh
touch $@
.PHONY: daemon/guestfsd
# Make clean.
CLEANFILES = $(fs_DATA) initramfs.timestamp emptydisk

View File

@@ -16,21 +16,16 @@ main (int argc, char *argv[])
}
g = guestfs_create ();
if (!g) {
perror ("guestfs_create");
exit (1);
}
if (!g) exit (1);
guestfs_set_exit_on_error (g, 1);
guestfs_set_verbose (g, 1);
guestfs_add_drive (g, argv[1]);
guestfs_launch (g);
guestfs_wait_ready (g);
guestfs_free (g);
guestfs_close (g);
return 0;
}

View File

@@ -483,9 +483,9 @@ two are provided for you:
=over 4
=item libguestfs-poll
=item libguestfs-select
A simple main loop that is implemented using L<poll(2)>.
A simple main loop that is implemented using L<select(2)>.
This is the default main loop unless you call C<guestfs_set_main_loop>
or C<guestfs_glib_set_main_loop>.
@@ -562,8 +562,8 @@ function, eg. C<g_main_loop_quit>. In those cases, ignore this call.
=head2 WRITING A CUSTOM MAIN LOOP
This isn't documented. Please see the libguestfs-poll and libguestfs-glib
implementations.
This isn't documented. Please see the libguestfs-select and
libguestfs-glib implementations.
=head1 SEE ALSO

View File

@@ -18,3 +18,4 @@
lib_LTLIBRARIES = libguestfs.la
libguestfs_la_SOURCES = guestfs.c guestfs.h
libguestfs_la_CFLAGS = -Wall -Werror

File diff suppressed because it is too large Load Diff

View File

@@ -19,36 +19,80 @@
#ifndef GUESTFS_H_
#define GUESTFS_H_
/* For API documentation, please read the manual page guestfs(3). */
/* IMPORTANT NOTE!
* All API documentation is in the manual page --> guestfs(3) <--
* Go and read it now, I'll wait.
*/
typedef struct guestfs_h guestfs_h;
/* Create and destroy the guest handle. */
/* Connection management. */
extern guestfs_h *guestfs_create (void);
extern void guestfs_free (guestfs_h *g);
extern void guestfs_close (guestfs_h *g);
extern int guestfs_launch (guestfs_h *g);
extern int guestfs_wait_ready (guestfs_h *g);
extern int guestfs_kill_subprocess (guestfs_h *g);
/* Guest configuration. */
/* Configuration management. */
extern int guestfs_config (guestfs_h *g,
const char *qemu_param, const char *qemu_value);
extern int guestfs_add_drive (guestfs_h *g, const char *filename);
extern int guestfs_add_cdrom (guestfs_h *g, const char *filename);
/* Steps to start up the guest. */
extern int guestfs_launch (guestfs_h *g);
extern int guestfs_wait_ready (guestfs_h *g);
/* Kill the guest subprocess. */
extern void guestfs_kill_subprocess (guestfs_h *g);
/* Error handling. */
typedef void (*guestfs_abort_fn) (void);
extern void guestfs_set_out_of_memory_handler (guestfs_h *g, guestfs_abort_fn);
extern guestfs_abort_fn guestfs_get_out_of_memory_handler (guestfs_h *g);
typedef void (*guestfs_error_handler_cb) (guestfs_h *g, void *data, const char *msg);
typedef void (*guestfs_abort_cb) (void);
extern void guestfs_set_exit_on_error (guestfs_h *g, int exit_on_error);
extern int guestfs_get_exit_on_error (guestfs_h *g);
extern void guestfs_set_error_handler (guestfs_h *g, guestfs_error_handler_cb cb, void *data);
extern guestfs_error_handler_cb guestfs_get_error_handler (guestfs_h *g, void **data_rtn);
extern void guestfs_set_out_of_memory_handler (guestfs_h *g, guestfs_abort_cb);
extern guestfs_abort_cb guestfs_get_out_of_memory_handler (guestfs_h *g);
extern void guestfs_set_verbose (guestfs_h *g, int verbose);
extern int guestfs_get_verbose (guestfs_h *g);
/* Actions. XXX Will be auto-generated */
extern int guestfs_sync (guestfs_h *g);
/* Low-level event API. */
typedef void (*guestfs_reply_cb) (guestfs_h *g, void *data /* , ... */);
typedef void (*guestfs_log_message_cb) (guestfs_h *g, void *data, char *buf, int len);
typedef void (*guestfs_subprocess_quit_cb) (guestfs_h *g, void *data);
typedef void (*guestfs_launch_done_cb) (guestfs_h *g, void *data /* , ... */);
extern void guestfs_set_reply_callback (guestfs_h *g, guestfs_reply_cb cb, void *opaque);
extern void guestfs_set_log_message_callback (guestfs_h *g, guestfs_log_message_cb cb, void *opaque);
extern void guestfs_set_subprocess_quit_callback (guestfs_h *g, guestfs_subprocess_quit_cb cb, void *opaque);
extern void guestfs_set_launch_done_callback (guestfs_h *g, guestfs_launch_done_cb cb, void *opaque);
/* Main loop. */
#define GUESTFS_HANDLE_READABLE 0x1
#define GUESTFS_HANDLE_WRITABLE 0x2
#define GUESTFS_HANDLE_HANGUP 0x4
#define GUESTFS_HANDLE_ERROR 0x8
typedef void (*guestfs_handle_event_cb) (void *data, int watch, int fd, int events);
typedef int (*guestfs_add_handle_cb) (guestfs_h *g, int fd, int events, guestfs_handle_event_cb cb, void *data);
typedef int (*guestfs_remove_handle_cb) (guestfs_h *g, int watch);
typedef void (*guestfs_handle_timeout_cb) (void *data, int timer);
typedef int (*guestfs_add_timeout_cb) (guestfs_h *g, int interval, guestfs_handle_timeout_cb cb, void *data);
typedef int (*guestfs_remove_timeout_cb) (guestfs_h *g, int timer);
typedef void (*guestfs_main_loop_run_cb) (guestfs_h *g);
typedef void (*guestfs_main_loop_quit_cb) (guestfs_h *g);
struct guestfs_main_loop {
guestfs_add_handle_cb add_handle;
guestfs_remove_handle_cb remove_handle;
guestfs_add_timeout_cb add_timeout;
guestfs_remove_timeout_cb remove_timeout;
guestfs_main_loop_run_cb main_loop_run;
guestfs_main_loop_quit_cb main_loop_quit;
};
typedef struct guestfs_main_loop guestfs_main_loop;
extern void guestfs_set_main_loop (guestfs_main_loop *);
extern void guestfs_main_loop_run (void);
extern void guestfs_main_loop_quit (void);
#endif /* GUESTFS_H_ */