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 "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 = 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