On Tue, 5 Jul 2011 08:21:37 -0500 Michael Roth <mdr...@linux.vnet.ibm.com> wrote:
> > Signed-off-by: Michael Roth <mdr...@linux.vnet.ibm.com> > --- > Makefile | 4 ++- > configure | 1 + > qga/guest-agent-command-state.c | 73 > +++++++++++++++++++++++++++++++++++++++ > qga/guest-agent-core.h | 25 +++++++++++++ > 4 files changed, 102 insertions(+), 1 deletions(-) > create mode 100644 qga/guest-agent-command-state.c > create mode 100644 qga/guest-agent-core.h I'm not sure there's much value in having this as a separate patch, maybe it should be folded in the next one. > > diff --git a/Makefile b/Makefile > index cbd2d77..6c3ba71 100644 > --- a/Makefile > +++ b/Makefile > @@ -181,6 +181,8 @@ test-visitor: test-visitor.o qfloat.o qint.o qdict.o > qstring.o qlist.o qbool.o $ > test-qmp-commands.o: $(addprefix $(qapi-dir)/, test-qapi-types.c > test-qapi-types.h test-qapi-visit.c test-qapi-visit.h test-qmp-marshal.c > test-qmp-commands.h) > test-qmp-commands: test-qmp-commands.o qfloat.o qint.o qdict.o qstring.o > qlist.o qbool.o $(qapi-obj-y) error.o osdep.o qemu-malloc.o $(oslib-obj-y) > qjson.o json-streamer.o json-lexer.o json-parser.o qerror.o qemu-error.o > qemu-tool.o $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o > $(qapi-dir)/test-qmp-marshal.o module.o > > +QGALIB=qga/guest-agent-command-state.o > + > QEMULIBS=libhw32 libhw64 libuser libdis libdis-user > > clean: > @@ -189,7 +191,7 @@ clean: > rm -f qemu-options.def > rm -f *.o *.d *.a *.lo $(TOOLS) TAGS cscope.* *.pod *~ */*~ > rm -Rf .libs > - rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d > net/*.o net/*.d fsdev/*.o fsdev/*.d ui/*.o ui/*.d qapi/*.o qapi/*.d > + rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d > net/*.o net/*.d fsdev/*.o fsdev/*.d ui/*.o ui/*.d qapi/*.o qapi/*.d qga/*.o > qga/*.d > rm -f qemu-img-cmds.h > rm -f trace.c trace.h trace.c-timestamp trace.h-timestamp > rm -f trace-dtrace.dtrace trace-dtrace.dtrace-timestamp > diff --git a/configure b/configure > index 02c552e..6a03002 100755 > --- a/configure > +++ b/configure > @@ -3487,6 +3487,7 @@ DIRS="$DIRS pc-bios/spapr-rtas" > DIRS="$DIRS roms/seabios roms/vgabios" > DIRS="$DIRS fsdev ui" > DIRS="$DIRS qapi" > +DIRS="$DIRS qga" > FILES="Makefile tests/Makefile" > FILES="$FILES tests/cris/Makefile tests/cris/.gdbinit" > FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps" > diff --git a/qga/guest-agent-command-state.c b/qga/guest-agent-command-state.c > new file mode 100644 > index 0000000..bc6e0bd > --- /dev/null > +++ b/qga/guest-agent-command-state.c > @@ -0,0 +1,73 @@ > +/* > + * QEMU Guest Agent command state interfaces > + * > + * Copyright IBM Corp. 2011 > + * > + * Authors: > + * Michael Roth <mdr...@linux.vnet.ibm.com> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > +#include <glib.h> > +#include "qga/guest-agent-core.h" > + > +struct GACommandState { > + GSList *groups; > +}; > + > +typedef struct GACommandGroup { > + void (*init)(void); > + void (*cleanup)(void); > +} GACommandGroup; > + > +/* handle init/cleanup for stateful guest commands */ > + > +void ga_command_state_add(GACommandState *cs, > + void (*init)(void), > + void (*cleanup)(void)) > +{ > + GACommandGroup *cg = qemu_mallocz(sizeof(GACommandGroup)); > + cg->init = init; > + cg->cleanup = cleanup; > + cs->groups = g_slist_append(cs->groups, cg); > +} > + > +static void ga_command_group_init(gpointer opaque, gpointer unused) > +{ > + GACommandGroup *cg = opaque; > + > + g_assert(cg); > + if (cg->init) { > + cg->init(); > + } > +} > + > +void ga_command_state_init_all(GACommandState *cs) > +{ > + g_assert(cs); > + g_slist_foreach(cs->groups, ga_command_group_init, NULL); > +} > + > +static void ga_command_group_cleanup(gpointer opaque, gpointer unused) > +{ > + GACommandGroup *cg = opaque; > + > + g_assert(cg); > + if (cg->cleanup) { > + cg->cleanup(); > + } > +} > + > +void ga_command_state_cleanup_all(GACommandState *cs) > +{ > + g_assert(cs); > + g_slist_foreach(cs->groups, ga_command_group_cleanup, NULL); > +} > + > +GACommandState *ga_command_state_new(void) > +{ > + GACommandState *cs = qemu_mallocz(sizeof(GACommandState)); > + cs->groups = NULL; > + return cs; > +} > diff --git a/qga/guest-agent-core.h b/qga/guest-agent-core.h > new file mode 100644 > index 0000000..688f120 > --- /dev/null > +++ b/qga/guest-agent-core.h > @@ -0,0 +1,25 @@ > +/* > + * QEMU Guest Agent core declarations > + * > + * Copyright IBM Corp. 2011 > + * > + * Authors: > + * Adam Litke <agli...@linux.vnet.ibm.com> > + * Michael Roth <mdr...@linux.vnet.ibm.com> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > +#include "qapi/qmp-core.h" > +#include "qemu-common.h" > + > +#define QGA_VERSION "1.0" > + > +typedef struct GACommandState GACommandState; > + > +void ga_command_state_add(GACommandState *cs, > + void (*init)(void), > + void (*cleanup)(void)); > +void ga_command_state_init_all(GACommandState *cs); > +void ga_command_state_cleanup_all(GACommandState *cs); > +GACommandState *ga_command_state_new(void);