File: event-test.c

package info (click to toggle)
libvirt-glib 5.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 2,592 kB
  • sloc: ansic: 21,146; xml: 591; sh: 471; python: 310; javascript: 30; makefile: 9
file content (191 lines) | stat: -rw-r--r-- 5,241 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#include <config.h>
#include <stdio.h>
#include <string.h>

#include <glib.h>
#include <libvirt/libvirt.h>
#include <libvirt-glib/libvirt-glib.h>

#define STREQ(a,b) (strcmp((a),(b)) == 0)

#ifndef ATTRIBUTE_UNUSED
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
#endif

/* Prototypes */
const char *eventToString(int event);
int myDomainEventCallback1 (virConnectPtr conn, virDomainPtr dom, int event, int detail, void *opaque);
int myDomainEventCallback2 (virConnectPtr conn, virDomainPtr dom, int event, int detail, void *opaque);

void usage(const char *pname);

/* Callback functions */

const char *eventToString(int event) {
    const char *ret = NULL;
    switch(event) {
        case VIR_DOMAIN_EVENT_DEFINED:
            ret ="Defined";
            break;
        case VIR_DOMAIN_EVENT_UNDEFINED:
            ret ="Undefined";
            break;
        case VIR_DOMAIN_EVENT_STARTED:
            ret ="Started";
            break;
        case VIR_DOMAIN_EVENT_SUSPENDED:
            ret ="Suspended";
            break;
        case VIR_DOMAIN_EVENT_RESUMED:
            ret ="Resumed";
            break;
        case VIR_DOMAIN_EVENT_STOPPED:
            ret ="Stopped";
            break;
        default:
            ret ="Unknown Event";
    }
    return ret;
}

static const char *eventDetailToString(int event, int detail) {
    const char *ret = "";
    switch(event) {
    case VIR_DOMAIN_EVENT_DEFINED:
        if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED)
            ret = "Added";
        else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED)
            ret = "Updated";
        break;
    case VIR_DOMAIN_EVENT_UNDEFINED:
        if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED)
            ret = "Removed";
        break;
    case VIR_DOMAIN_EVENT_STARTED:
        switch (detail) {
        case VIR_DOMAIN_EVENT_STARTED_BOOTED:
            ret = "Booted";
            break;
        case VIR_DOMAIN_EVENT_STARTED_MIGRATED:
            ret = "Migrated";
            break;
        case VIR_DOMAIN_EVENT_STARTED_RESTORED:
            ret = "Restored";
            break;
        default:
            break;
        }
        break;
    case VIR_DOMAIN_EVENT_SUSPENDED:
        if (detail == VIR_DOMAIN_EVENT_SUSPENDED_PAUSED)
            ret = "Paused";
        else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED)
            ret = "Migrated";
        break;
    case VIR_DOMAIN_EVENT_RESUMED:
        if (detail == VIR_DOMAIN_EVENT_RESUMED_UNPAUSED)
            ret = "Unpaused";
        else if (detail == VIR_DOMAIN_EVENT_RESUMED_MIGRATED)
            ret = "Migrated";
        break;
    case VIR_DOMAIN_EVENT_STOPPED:
        switch (detail) {
        case VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN:
            ret = "Shutdown";
            break;
        case VIR_DOMAIN_EVENT_STOPPED_DESTROYED:
            ret = "Destroyed";
            break;
        case VIR_DOMAIN_EVENT_STOPPED_CRASHED:
            ret = "Crashed";
            break;
        case VIR_DOMAIN_EVENT_STOPPED_MIGRATED:
            ret = "Migrated";
            break;
        case VIR_DOMAIN_EVENT_STOPPED_SAVED:
            ret = "Saved";
            break;
        case VIR_DOMAIN_EVENT_STOPPED_FAILED:
            ret = "Failed";
            break;
        default:
            break;
        }
        break;
    default:
        break;
    }
    return ret;
}


int myDomainEventCallback1 (virConnectPtr conn ATTRIBUTE_UNUSED,
                            virDomainPtr dom,
                            int event,
                            int detail,
                            void *opaque ATTRIBUTE_UNUSED)
{
    printf("%s EVENT: Domain %s(%d) %s: %s\n", __FUNCTION__,
           virDomainGetName(dom), virDomainGetID(dom),
           eventToString(event),
           eventDetailToString(event, detail));

    return 0;
}

int myDomainEventCallback2 (virConnectPtr conn ATTRIBUTE_UNUSED,
                            virDomainPtr dom,
                            int event,
                            int detail,
                            void *opaque ATTRIBUTE_UNUSED)
{
    printf("%s EVENT: Domain %s(%d) %s: %s\n", __FUNCTION__,
           virDomainGetName(dom), virDomainGetID(dom),
           eventToString(event),
           eventDetailToString(event, detail));

    return 0;
}

/* main test functions */

void usage(const char *pname)
{
    printf("%s uri\n", pname);
}

int main(int argc, char **argv)
{
    GMainLoop *loop;

    gvir_init(&argc, &argv);

    if(argc > 1 && STREQ(argv[1],"--help")) {
        usage(argv[0]);
        return -1;
    }
    loop = g_main_loop_new(g_main_context_default(), 1);

    gvir_event_register();

    virConnectPtr dconn = NULL;
    dconn = virConnectOpen (argv[1] ? argv[1] : NULL);
    if (!dconn) {
        printf("error opening\n");
        return -1;
    }

    g_debug("Registering domain event cbs");

    /* Add 2 callbacks to prove this works with more than just one */
    virConnectDomainEventRegister(dconn, myDomainEventCallback1, NULL, NULL);
    virConnectDomainEventRegister(dconn, myDomainEventCallback2, NULL, NULL);

    g_main_loop_run(loop);

    if (virConnectClose(dconn) < 0)
        printf("error closing\n");

    printf("done\n");
    return 0;
}