root / qga / guest-agent-command-state.c @ 48ff7a62
History | View | Annotate | Download (1.6 kB)
1 |
/*
|
---|---|
2 |
* QEMU Guest Agent command state interfaces
|
3 |
*
|
4 |
* Copyright IBM Corp. 2011
|
5 |
*
|
6 |
* Authors:
|
7 |
* Michael Roth <mdroth@linux.vnet.ibm.com>
|
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 |
} |