qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

guest-agent-command-state.c (1712B)


      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 }