]>
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" |
dc03272d | 13 | #include "guest-agent-core.h" |
13a286d5 MR |
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 | { | |
f3a06403 | 30 | GACommandGroup *cg = g_new0(GACommandGroup, 1); |
13a286d5 MR |
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 | { | |
f3a06403 | 70 | GACommandState *cs = g_new0(GACommandState, 1); |
13a286d5 MR |
71 | cs->groups = NULL; |
72 | return cs; | |
73 | } | |
3e3e302f MAL |
74 | |
75 | void ga_command_state_free(GACommandState *cs) | |
76 | { | |
77 | g_slist_free_full(cs->groups, g_free); | |
78 | g_free(cs); | |
79 | } |