Statistics
| Branch: | Revision:

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
}