|
|
1.1 ! root 1: /* ! 2: * QEMU Guest Agent command state interfaces ! 3: * ! 4: * Copyright IBM Corp. 2011 ! 5: * ! 6: * Authors: ! 7: * Michael Roth <[email protected]> ! 8: * ! 9: * This work is licensed under the terms of the GNU GPL, version 2 or later. ! 10: * See the COPYING file in the top-level directory. ! 11: */ ! 12: #include <glib.h> ! 13: #include "qga/guest-agent-core.h" ! 14: ! 15: struct GACommandState { ! 16: GSList *groups; ! 17: }; ! 18: ! 19: typedef struct GACommandGroup { ! 20: void (*init)(void); ! 21: void (*cleanup)(void); ! 22: } GACommandGroup; ! 23: ! 24: /* handle init/cleanup for stateful guest commands */ ! 25: ! 26: void ga_command_state_add(GACommandState *cs, ! 27: void (*init)(void), ! 28: void (*cleanup)(void)) ! 29: { ! 30: GACommandGroup *cg = qemu_mallocz(sizeof(GACommandGroup)); ! 31: cg->init = init; ! 32: cg->cleanup = cleanup; ! 33: cs->groups = g_slist_append(cs->groups, cg); ! 34: } ! 35: ! 36: static void ga_command_group_init(gpointer opaque, gpointer unused) ! 37: { ! 38: GACommandGroup *cg = opaque; ! 39: ! 40: g_assert(cg); ! 41: if (cg->init) { ! 42: cg->init(); ! 43: } ! 44: } ! 45: ! 46: void ga_command_state_init_all(GACommandState *cs) ! 47: { ! 48: g_assert(cs); ! 49: g_slist_foreach(cs->groups, ga_command_group_init, NULL); ! 50: } ! 51: ! 52: static void ga_command_group_cleanup(gpointer opaque, gpointer unused) ! 53: { ! 54: GACommandGroup *cg = opaque; ! 55: ! 56: g_assert(cg); ! 57: if (cg->cleanup) { ! 58: cg->cleanup(); ! 59: } ! 60: } ! 61: ! 62: void ga_command_state_cleanup_all(GACommandState *cs) ! 63: { ! 64: g_assert(cs); ! 65: g_slist_foreach(cs->groups, ga_command_group_cleanup, NULL); ! 66: } ! 67: ! 68: GACommandState *ga_command_state_new(void) ! 69: { ! 70: GACommandState *cs = qemu_mallocz(sizeof(GACommandState)); ! 71: cs->groups = NULL; ! 72: return cs; ! 73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.