File: suspend.c

package info (click to toggle)
libvirt 0.4.6-10%2Blenny2
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 29,084 kB
  • ctags: 8,508
  • sloc: ansic: 75,483; xml: 11,901; sh: 10,518; python: 4,309; makefile: 863; perl: 356; awk: 48; sed: 16
file content (134 lines) | stat: -rw-r--r-- 3,553 bytes parent folder | download | duplicates (2)
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
/**
 * section: Scheduling
 * synopsis: Suspend a domain and then resume its execution
 * purpose: Demonstrate the basic use of the library to suspend and
 *          resume a domain. If no id is given on the command line
 *          this script will suspend and resume the first domain found
 *          which is not Domain 0.
 * usage: suspend [id]
 * test: suspend
 * author: Daniel Veillard
 * copy: see Copyright for the status of this software.
 */

#include <stdlib.h>
#include <stdio.h>
#include <libvirt/libvirt.h>

static virConnectPtr conn = NULL; /* the hypervisor connection */

/**
 * checkDomainState:
 * @dom: the domain
 *
 * Return the current state of a domain or -1 if non-exsitant
 */
static int
checkDomainState(virDomainPtr dom) {
    virDomainInfo info;        /* the information being fetched */
    int ret;

    ret = virDomainGetInfo(dom, &info);
    if (ret < 0) {
        return(-1);
    }
    return(info.state);
}

/**
 * SuspendAndResumeDomain:
 * @id: the id of the domain
 *
 * extract the domain 0 information
 */
static void
SuspendAndResumeDomain(int id) {
    virDomainPtr dom = NULL;   /* the domain being checked */
    int ret, state;

    /* Find the domain of the given id */
    dom = virDomainLookupByID(conn, id);
    if (dom == NULL) {
        fprintf(stderr, "Failed to find Domain %d\n", id);
        goto error;
    }

    /* Check state */
    state = checkDomainState(dom);
    if ((state == VIR_DOMAIN_RUNNING) ||
        (state == VIR_DOMAIN_NOSTATE) ||
        (state == VIR_DOMAIN_BLOCKED)) {
        printf("Suspending domain...\n");
        ret = virDomainSuspend(dom);
        if (ret < 0) {
            fprintf(stderr, "Failed to suspend Domain %d\n", id);
            goto error;
        }
        state = checkDomainState(dom);
        if (state != VIR_DOMAIN_PAUSED) {
            fprintf(stderr, "Domain %d state is not suspended\n", id);
        } else {
            printf("Domain suspended, resuming it...\n");
        }
        ret = virDomainResume(dom);
        if (ret < 0) {
            fprintf(stderr, "Failed to resume Domain %d\n", id);
            goto error;
        }
        state = checkDomainState(dom);
        if ((state == VIR_DOMAIN_RUNNING) ||
            (state == VIR_DOMAIN_NOSTATE) ||
            (state == VIR_DOMAIN_BLOCKED)) {
            printf("Domain resumed\n");
        } else {
            fprintf(stderr, "Domain %d state indicate it is not resumed\n", id);
        }
    } else {
        fprintf(stderr, "Domain %d is not in a state where it should be suspended\n", id);
        goto error;
    }

error:
    if (dom != NULL)
        virDomainFree(dom);
}

int main(int argc, char **argv) {
    int id = 0;

    /* NULL means connect to local Xen hypervisor */
    conn = virConnectOpenReadOnly(NULL);
    if (conn == NULL) {
        fprintf(stderr, "Failed to connect to hypervisor\n");
        goto error;
    }

    if (argc > 1) {
        id = atoi(argv[1]);
    }
    if (id == 0) {
        int i, j, ids[10];
        i = virConnectListDomains(conn, &ids[0], 10);
        if (i < 0) {
            fprintf(stderr, "Failed to list the domains\n");
            goto error;
        }
        for (j = 0;j < i;j++) {
            if (ids[j] != 0) {
                id = ids[j];
                break;
            }
        }
    }
    if (id == 0) {
        fprintf(stderr, "Failed find a running guest domain\n");
        goto error;
    }

    SuspendAndResumeDomain(id);

error:
    if (conn != NULL)
        virConnectClose(conn);
    return(0);
}