]>
Commit | Line | Data |
---|---|---|
13a286d5 MR |
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 | */ | |
4459bf38 | 12 | #include "qemu/osdep.h" |
13a286d5 MR |
13 | #include <glib.h> |
14 | #include "qga/guest-agent-core.h" | |
15 | ||
16 | struct GACommandState { | |
17 | GSList *groups; | |
18 | }; | |
19 | ||
20 | typedef struct GACommandGroup { | |
21 | void (*init)(void); | |
22 | void (*cleanup)(void); | |
23 | } GACommandGroup; | |
24 | ||
25 | /* handle init/cleanup for stateful guest commands */ | |
26 | ||
27 | void ga_command_state_add(GACommandState *cs, | |
28 | void (*init)(void), | |
29 | void (*cleanup)(void)) | |
30 | { | |
f3a06403 | 31 | GACommandGroup *cg = g_new0(GACommandGroup, 1); |
13a286d5 MR |
32 | cg->init = init; |
33 | cg->cleanup = cleanup; | |
34 | cs->groups = g_slist_append(cs->groups, cg); | |
35 | } | |
36 | ||
37 | static void ga_command_group_init(gpointer opaque, gpointer unused) | |
38 | { | |
39 | GACommandGroup *cg = opaque; | |
40 | ||
41 | g_assert(cg); | |
42 | if (cg->init) { | |
43 | cg->init(); | |
44 | } | |
45 | } | |
46 | ||
47 | void ga_command_state_init_all(GACommandState *cs) | |
48 | { | |
49 | g_assert(cs); | |
50 | g_slist_foreach(cs->groups, ga_command_group_init, NULL); | |
51 | } | |
52 | ||
53 | static void ga_command_group_cleanup(gpointer opaque, gpointer unused) | |
54 | { | |
55 | GACommandGroup *cg = opaque; | |
56 | ||
57 | g_assert(cg); | |
58 | if (cg->cleanup) { | |
59 | cg->cleanup(); | |
60 | } | |
61 | } | |
62 | ||
63 | void ga_command_state_cleanup_all(GACommandState *cs) | |
64 | { | |
65 | g_assert(cs); | |
66 | g_slist_foreach(cs->groups, ga_command_group_cleanup, NULL); | |
67 | } | |
68 | ||
69 | GACommandState *ga_command_state_new(void) | |
70 | { | |
f3a06403 | 71 | GACommandState *cs = g_new0(GACommandState, 1); |
13a286d5 MR |
72 | cs->groups = NULL; |
73 | return cs; | |
74 | } |