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 "qemu/osdep.h" |
13 | #include "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 = g_new0(GACommandGroup, 1); |
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 = g_new0(GACommandState, 1); |
71 | cs->groups = NULL; |
72 | return cs; |
73 | } |
74 | |
75 | void ga_command_state_free(GACommandState *cs) |
76 | { |
77 | g_slist_free_full(cs->groups, g_free); |
78 | g_free(cs); |
79 | } |
80 | |