Coverage report for src/xs_internal.c.gcov
-: 0:Source:xs_internal.c
-: 0:Graph:./libvirt_la-xs_internal.gcno
-: 0:Data:./libvirt_la-xs_internal.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:/*
-: 2: * xs_internal.c: access to Xen Store
-: 3: *
-: 4: * Copyright (C) 2006 Red Hat, Inc.
-: 5: *
-: 6: * See COPYING.LIB for the License of this software
-: 7: *
-: 8: * Daniel Veillard <veillard@redhat.com>
-: 9: */
-: 10:
-: 11:#include <stdio.h>
-: 12:#include <string.h>
-: 13:#include <unistd.h>
-: 14:#include <stdlib.h>
-: 15:#include <fcntl.h>
-: 16:#include <sys/mman.h>
-: 17:#include <sys/ioctl.h>
-: 18:
-: 19:#include <stdint.h>
-: 20:
-: 21:#include <xen/dom0_ops.h>
-: 22:#include <xen/version.h>
-: 23:#include <xen/xen.h>
-: 24:
-: 25:#include <xs.h>
-: 26:
-: 27:#include "internal.h"
-: 28:#include "driver.h"
-: 29:#include "xs_internal.h"
-: 30:#include "xen_internal.h" /* for xenHypervisorCheckID */
-: 31:
-: 32:#define XEN_HYPERVISOR_SOCKET "/proc/xen/privcmd"
-: 33:
-: 34:#ifndef PROXY
-: 35:static virDriver xenStoreDriver = {
-: 36: VIR_DRV_XEN_STORE,
-: 37: "XenStore",
-: 38: (DOM0_INTERFACE_VERSION >> 24) * 1000000 +
-: 39: ((DOM0_INTERFACE_VERSION >> 16) & 0xFF) * 1000 +
-: 40: (DOM0_INTERFACE_VERSION & 0xFFFF),
-: 41: NULL, /* init */
-: 42: xenStoreOpen, /* open */
-: 43: xenStoreClose, /* close */
-: 44: NULL, /* type */
-: 45: NULL, /* version */
-: 46: NULL, /* nodeGetInfo */
-: 47: xenStoreListDomains, /* listDomains */
-: 48: NULL, /* numOfDomains */
-: 49: NULL, /* domainCreateLinux */
-: 50: NULL, /* domainLookupByID */
-: 51: NULL, /* domainLookupByUUID */
-: 52: xenStoreDomainLookupByName, /* domainLookupByName */
-: 53: NULL, /* domainSuspend */
-: 54: NULL, /* domainResume */
-: 55: xenStoreDomainShutdown, /* domainShutdown */
-: 56: xenStoreDomainReboot, /* domainReboot */
-: 57: NULL, /* domainDestroy */
-: 58: NULL, /* domainFree */
-: 59: NULL, /* domainGetName */
-: 60: NULL, /* domainGetID */
-: 61: NULL, /* domainGetUUID */
-: 62: NULL, /* domainGetOSType */
-: 63: xenStoreDomainGetMaxMemory, /* domainGetMaxMemory */
-: 64: NULL, /* domainSetMaxMemory */
-: 65: xenStoreDomainSetMemory, /* domainSetMemory */
-: 66: xenStoreGetDomainInfo, /* domainGetInfo */
-: 67: NULL, /* domainSave */
-: 68: NULL, /* domainRestore */
-: 69: NULL, /* domainSetVcpus */
-: 70: NULL, /* domainPinVcpu */
-: 71: NULL, /* domainGetVcpus */
-: 72: NULL, /* domainDumpXML */
-: 73:};
-: 74:
-: 75:/**
-: 76: * xenStoreRegister:
-: 77: *
-: 78: * Registers the xenStore driver
-: 79: */
-: 80:void xenStoreRegister(void)
function xenStoreRegister called 0 returned 0% blocks executed 0%
#####: 81:{
#####: 82: virRegisterDriver(&xenStoreDriver);
call 0 never executed
#####: 83:}
-: 84:#endif /* ! PROXY */
-: 85:
-: 86:/**
-: 87: * virXenStoreError:
-: 88: * @conn: the connection if available
-: 89: * @error: the error number
-: 90: * @info: extra information string
-: 91: *
-: 92: * Handle an error at the xend store interface
-: 93: */
-: 94:static void
-: 95:virXenStoreError(virConnectPtr conn, virErrorNumber error, const char *info)
function virXenStoreError called 0 returned 0% blocks executed 0%
#####: 96:{
-: 97: const char *errmsg;
-: 98:
#####: 99: if (error == VIR_ERR_OK)
branch 0 never executed
branch 1 never executed
#####: 100: return;
-: 101:
#####: 102: errmsg = __virErrorMsg(error, info);
call 0 never executed
#####: 103: __virRaiseError(conn, NULL, VIR_FROM_XENSTORE, error, VIR_ERR_ERROR,
call 0 never executed
-: 104: errmsg, info, NULL, 0, 0, errmsg, info);
-: 105:}
-: 106:
-: 107:/************************************************************************
-: 108: * *
-: 109: * Helper internal APIs *
-: 110: * *
-: 111: ************************************************************************/
-: 112:#ifndef PROXY
-: 113:/**
-: 114: * virConnectDoStoreList:
-: 115: * @conn: pointer to the hypervisor connection
-: 116: * @path: the absolute path of the directory in the store to list
-: 117: * @nb: OUT pointer to the number of items found
-: 118: *
-: 119: * Internal API querying the Xenstore for a list
-: 120: *
-: 121: * Returns a string which must be freed by the caller or NULL in case of error
-: 122: */
-: 123:static char **
-: 124:virConnectDoStoreList(virConnectPtr conn, const char *path,
-: 125: unsigned int *nb)
function virConnectDoStoreList called 0 returned 0% blocks executed 0%
#####: 126:{
#####: 127: if ((conn == NULL) || (conn->xshandle == NULL) || (path == NULL) ||
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
-: 128: (nb == NULL))
#####: 129: return (NULL);
-: 130:
#####: 131: return xs_directory(conn->xshandle, 0, path, nb);
call 0 never executed
-: 132:}
-: 133:#endif /* ! PROXY */
-: 134:
-: 135:/**
-: 136: * virDomainDoStoreQuery:
-: 137: * @conn: pointer to the hypervisor connection
-: 138: * @domid: id of the domain
-: 139: * @path: the relative path of the data in the store to retrieve
-: 140: *
-: 141: * Internal API querying the Xenstore for a string value.
-: 142: *
-: 143: * Returns a string which must be freed by the caller or NULL in case of error
-: 144: */
-: 145:static char *
-: 146:virDomainDoStoreQuery(virConnectPtr conn, int domid, const char *path)
function virDomainDoStoreQuery called 3 returned 100% blocks executed 43%
3: 147:{
-: 148: char s[256];
3: 149: unsigned int len = 0;
-: 150:
3: 151: if (!conn || conn->xshandle == NULL)
branch 0 taken 0% (fallthrough)
branch 1 taken 100%
branch 2 never executed
branch 3 never executed
3: 152: return (NULL);
-: 153:
#####: 154: snprintf(s, 255, "/local/domain/%d/%s", domid, path);
call 0 never executed
#####: 155: s[255] = 0;
-: 156:
#####: 157: return xs_read(conn->xshandle, 0, &s[0], &len);
call 0 never executed
-: 158:}
-: 159:
-: 160:#ifndef PROXY
-: 161:/**
-: 162: * virDomainDoStoreWrite:
-: 163: * @domain: a domain object
-: 164: * @path: the relative path of the data in the store to retrieve
-: 165: *
-: 166: * Internal API setting up a string value in the Xenstore
-: 167: * Requires write access to the XenStore
-: 168: *
-: 169: * Returns 0 in case of success, -1 in case of failure
-: 170: */
-: 171:static int
-: 172:virDomainDoStoreWrite(virDomainPtr domain, const char *path,
-: 173: const char *value)
function virDomainDoStoreWrite called 0 returned 0% blocks executed 0%
#####: 174:{
-: 175: char s[256];
-: 176:
#####: 177: int ret = -1;
-: 178:
#####: 179: if (!VIR_IS_CONNECTED_DOMAIN(domain))
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
branch 6 never executed
branch 7 never executed
#####: 180: return (-1);
#####: 181: if (domain->conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 182: return (-1);
#####: 183: if (domain->conn->flags & VIR_CONNECT_RO)
branch 0 never executed
branch 1 never executed
#####: 184: return (-1);
-: 185:
#####: 186: snprintf(s, 255, "/local/domain/%d/%s", domain->handle, path);
call 0 never executed
#####: 187: s[255] = 0;
-: 188:
#####: 189: if (xs_write(domain->conn->xshandle, 0, &s[0], value, strlen(value)))
call 0 never executed
call 1 never executed
branch 2 never executed
branch 3 never executed
#####: 190: ret = 0;
-: 191:
#####: 192: return (ret);
-: 193:}
-: 194:
-: 195:/**
-: 196: * virDomainGetVM:
-: 197: * @domain: a domain object
-: 198: *
-: 199: * Internal API extracting a xenstore vm path.
-: 200: *
-: 201: * Returns the new string or NULL in case of error
-: 202: */
-: 203:char *
-: 204:virDomainGetVM(virDomainPtr domain)
function virDomainGetVM called 0 returned 0% blocks executed 0%
#####: 205:{
-: 206: char *vm;
-: 207: char query[200];
-: 208: unsigned int len;
-: 209:
#####: 210: if (!VIR_IS_CONNECTED_DOMAIN(domain))
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
branch 6 never executed
branch 7 never executed
#####: 211: return (NULL);
#####: 212: if (domain->conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 213: return (NULL);
-: 214:
#####: 215: snprintf(query, 199, "/local/domain/%d/vm", virDomainGetID(domain));
call 0 never executed
call 1 never executed
#####: 216: query[199] = 0;
-: 217:
#####: 218: vm = xs_read(domain->conn->xshandle, 0, &query[0], &len);
call 0 never executed
-: 219:
#####: 220: return (vm);
-: 221:}
-: 222:
-: 223:/**
-: 224: * virDomainGetVMInfo:
-: 225: * @domain: a domain object
-: 226: * @vm: the xenstore vm path
-: 227: * @name: the value's path
-: 228: *
-: 229: * Internal API extracting one information the device used
-: 230: * by the domain from xensttore
-: 231: *
-: 232: * Returns the new string or NULL in case of error
-: 233: */
-: 234:char *
-: 235:virDomainGetVMInfo(virDomainPtr domain, const char *vm, const char *name)
function virDomainGetVMInfo called 0 returned 0% blocks executed 0%
#####: 236:{
-: 237: char s[256];
#####: 238: char *ret = NULL;
#####: 239: unsigned int len = 0;
-: 240:
#####: 241: if (!VIR_IS_CONNECTED_DOMAIN(domain))
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
branch 6 never executed
branch 7 never executed
#####: 242: return (NULL);
#####: 243: if (domain->conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 244: return (NULL);
-: 245:
#####: 246: snprintf(s, 255, "%s/%s", vm, name);
call 0 never executed
#####: 247: s[255] = 0;
-: 248:
#####: 249: ret = xs_read(domain->conn->xshandle, 0, &s[0], &len);
call 0 never executed
-: 250:
#####: 251: return (ret);
-: 252:}
-: 253:
-: 254:/**
-: 255: * virConnectCheckStoreID:
-: 256: * @conn: pointer to the hypervisor connection
-: 257: * @id: the id number as returned from Xenstore
-: 258: *
-: 259: * the xenstore sometimes list non-running domains, double check
-: 260: * from the hypervisor if we have direct access
-: 261: *
-: 262: * Returns -1 if the check failed, 0 if successful or not possible to check
-: 263: */
-: 264:static int
-: 265:virConnectCheckStoreID(virConnectPtr conn, int id)
function virConnectCheckStoreID called 0 returned 0% blocks executed 0%
#####: 266:{
#####: 267: if (conn->handle >= 0) {
branch 0 never executed
branch 1 never executed
-: 268: int tmp;
-: 269:
#####: 270: tmp = xenHypervisorCheckID(conn, id);
call 0 never executed
#####: 271: if (tmp < 0)
branch 0 never executed
branch 1 never executed
#####: 272: return (-1);
-: 273: }
#####: 274: return (0);
-: 275:}
-: 276:#endif /* ! PROXY */
-: 277:
-: 278:/************************************************************************
-: 279: * *
-: 280: * Canonical internal APIs *
-: 281: * *
-: 282: ************************************************************************/
-: 283:/**
-: 284: * xenStoreOpen:
-: 285: * @conn: pointer to the connection block
-: 286: * @name: URL for the target, NULL for local
-: 287: * @flags: combination of virDrvOpenFlag(s)
-: 288: *
-: 289: * Connects to the Xen hypervisor.
-: 290: *
-: 291: * Returns 0 or -1 in case of error.
-: 292: */
-: 293:int
-: 294:xenStoreOpen(virConnectPtr conn, const char *name, int flags)
function xenStoreOpen called 0 returned 0% blocks executed 0%
#####: 295:{
#####: 296: if ((name != NULL) && (strcasecmp(name, "xen")))
branch 0 never executed
branch 1 never executed
call 2 never executed
branch 3 never executed
branch 4 never executed
#####: 297: return(-1);
-: 298:
-: 299:#ifdef PROXY
-: 300: conn->xshandle = xs_daemon_open_readonly();
-: 301:#else
#####: 302: if (flags & VIR_DRV_OPEN_RO)
branch 0 never executed
branch 1 never executed
#####: 303: conn->xshandle = xs_daemon_open_readonly();
call 0 never executed
-: 304: else
#####: 305: conn->xshandle = xs_daemon_open();
call 0 never executed
-: 306:#endif /* ! PROXY */
-: 307:
#####: 308: if (conn->xshandle == NULL) {
branch 0 never executed
branch 1 never executed
#####: 309: if (!(flags & VIR_DRV_OPEN_QUIET))
branch 0 never executed
branch 1 never executed
#####: 310: virXenStoreError(conn, VIR_ERR_NO_XEN,
call 0 never executed
-: 311: "failed to connect to Xen Store");
#####: 312: return (-1);
-: 313: }
#####: 314: return (0);
-: 315:}
-: 316:
-: 317:/**
-: 318: * xenStoreClose:
-: 319: * @conn: pointer to the connection block
-: 320: *
-: 321: * Close the connection to the Xen hypervisor.
-: 322: *
-: 323: * Returns 0 in case of success or -1 in case of error.
-: 324: */
-: 325:int
-: 326:xenStoreClose(virConnectPtr conn)
function xenStoreClose called 0 returned 0% blocks executed 0%
#####: 327:{
#####: 328: if (conn == NULL) {
branch 0 never executed
branch 1 never executed
#####: 329: virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call 0 never executed
#####: 330: return(-1);
-: 331: }
#####: 332: if (conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 333: return(-1);
-: 334:
#####: 335: xs_daemon_close(conn->xshandle);
call 0 never executed
#####: 336: return (0);
-: 337:}
-: 338:
-: 339:#ifndef PROXY
-: 340:/**
-: 341: * xenStoreGetDomainInfo:
-: 342: * @domain: pointer to the domain block
-: 343: * @info: the place where information should be stored
-: 344: *
-: 345: * Do an hypervisor call to get the related set of domain information.
-: 346: *
-: 347: * Returns 0 in case of success, -1 in case of error.
-: 348: */
-: 349:int
-: 350:xenStoreGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info)
function xenStoreGetDomainInfo called 0 returned 0% blocks executed 0%
#####: 351:{
-: 352: char *tmp, **tmp2;
-: 353: unsigned int nb_vcpus;
-: 354: char request[200];
-: 355:
#####: 356: if (!VIR_IS_CONNECTED_DOMAIN(domain))
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
branch 6 never executed
branch 7 never executed
#####: 357: return (-1);
-: 358:
#####: 359: if ((domain == NULL) || (domain->conn == NULL) || (info == NULL)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 360: virXenStoreError(domain ? domain->conn : NULL, VIR_ERR_INVALID_ARG,
branch 0 never executed
branch 1 never executed
call 2 never executed
-: 361: __FUNCTION__);
#####: 362: return(-1);
-: 363: }
#####: 364: if (domain->conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 365: return(-1);
-: 366:
#####: 367: tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "running");
call 0 never executed
#####: 368: if (tmp != NULL) {
branch 0 never executed
branch 1 never executed
#####: 369: if (tmp[0] == '1')
branch 0 never executed
branch 1 never executed
#####: 370: info->state = VIR_DOMAIN_RUNNING;
#####: 371: free(tmp);
call 0 never executed
-: 372: } else {
#####: 373: info->state = VIR_DOMAIN_NONE;
-: 374: }
#####: 375: tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "memory/target");
call 0 never executed
#####: 376: if (tmp != NULL) {
branch 0 never executed
branch 1 never executed
#####: 377: info->memory = atol(tmp);
call 0 never executed
#####: 378: info->maxMem = atol(tmp);
call 0 never executed
#####: 379: free(tmp);
call 0 never executed
-: 380: } else {
#####: 381: info->memory = 0;
#####: 382: info->maxMem = 0;
-: 383: }
-: 384:#if 0
-: 385: /* doesn't seems to work */
-: 386: tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "cpu_time");
-: 387: if (tmp != NULL) {
-: 388: info->cpuTime = atol(tmp);
-: 389: free(tmp);
-: 390: } else {
-: 391: info->cpuTime = 0;
-: 392: }
-: 393:#endif
#####: 394: snprintf(request, 199, "/local/domain/%d/cpu", domain->handle);
call 0 never executed
#####: 395: request[199] = 0;
#####: 396: tmp2 = virConnectDoStoreList(domain->conn, request, &nb_vcpus);
call 0 never executed
#####: 397: if (tmp2 != NULL) {
branch 0 never executed
branch 1 never executed
#####: 398: info->nrVirtCpu = nb_vcpus;
#####: 399: free(tmp2);
call 0 never executed
-: 400: }
#####: 401: return (0);
-: 402:}
-: 403:
-: 404:/**
-: 405: * xenStoreDomainSetMemory:
-: 406: * @domain: pointer to the domain block
-: 407: * @memory: the max memory size in kilobytes.
-: 408: *
-: 409: * Change the maximum amount of memory allowed in the xen store
-: 410: *
-: 411: * Returns 0 in case of success, -1 in case of error.
-: 412: */
-: 413:int
-: 414:xenStoreDomainSetMemory(virDomainPtr domain, unsigned long memory)
function xenStoreDomainSetMemory called 0 returned 0% blocks executed 0%
#####: 415:{
-: 416: int ret;
-: 417: char value[20];
-: 418:
#####: 419: if ((domain == NULL) || (domain->conn == NULL) || (memory < 4096)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 420: virXenStoreError(domain ? domain->conn : NULL, VIR_ERR_INVALID_ARG,
branch 0 never executed
branch 1 never executed
call 2 never executed
-: 421: __FUNCTION__);
#####: 422: return(-1);
-: 423: }
#####: 424: snprintf(value, 19, "%lu", memory);
call 0 never executed
#####: 425: value[19] = 0;
#####: 426: ret = virDomainDoStoreWrite(domain, "memory/target", &value[0]);
call 0 never executed
#####: 427: if (ret < 0)
branch 0 never executed
branch 1 never executed
#####: 428: return (-1);
#####: 429: return (0);
-: 430:}
-: 431:
-: 432:/**
-: 433: * xenStoreDomainGetMaxMemory:
-: 434: * @domain: pointer to the domain block
-: 435: *
-: 436: * Ask the xenstore for the maximum memory allowed for a domain
-: 437: *
-: 438: * Returns the memory size in kilobytes or 0 in case of error.
-: 439: */
-: 440:unsigned long
-: 441:xenStoreDomainGetMaxMemory(virDomainPtr domain)
function xenStoreDomainGetMaxMemory called 0 returned 0% blocks executed 0%
#####: 442:{
-: 443: char *tmp;
#####: 444: unsigned long ret = 0;
-: 445:
#####: 446: if (!VIR_IS_CONNECTED_DOMAIN(domain))
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
branch 4 never executed
branch 5 never executed
branch 6 never executed
branch 7 never executed
#####: 447: return (ret);
-: 448:
#####: 449: tmp = virDomainDoStoreQuery(domain->conn, domain->handle, "memory/target");
call 0 never executed
#####: 450: if (tmp != NULL) {
branch 0 never executed
branch 1 never executed
#####: 451: ret = (unsigned long) atol(tmp);
call 0 never executed
#####: 452: free(tmp);
call 0 never executed
-: 453: }
#####: 454: return(ret);
-: 455:}
-: 456:
-: 457:/**
-: 458: * xenStoreNumOfDomains:
-: 459: * @conn: pointer to the hypervisor connection
-: 460: *
-: 461: * Provides the number of active domains.
-: 462: *
-: 463: * Returns the number of domain found or -1 in case of error
-: 464: */
-: 465:int
-: 466:xenStoreNumOfDomains(virConnectPtr conn)
function xenStoreNumOfDomains called 0 returned 0% blocks executed 0%
#####: 467:{
-: 468: unsigned int num;
-: 469: char **idlist;
#####: 470: int ret = -1;
-: 471:
#####: 472: if ((conn == NULL) || (conn->xshandle == NULL)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 473: virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call 0 never executed
#####: 474: return(-1);
-: 475: }
#####: 476: idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num);
call 0 never executed
#####: 477: if (idlist) {
branch 0 never executed
branch 1 never executed
#####: 478: free(idlist);
call 0 never executed
#####: 479: ret = num;
-: 480: }
#####: 481: return(ret);
-: 482:}
-: 483:
-: 484:/**
-: 485: * xenStoreListDomains:
-: 486: * @conn: pointer to the hypervisor connection
-: 487: * @ids: array to collect the list of IDs of active domains
-: 488: * @maxids: size of @ids
-: 489: *
-: 490: * Collect the list of active domains, and store their ID in @maxids
-: 491: *
-: 492: * Returns the number of domain found or -1 in case of error
-: 493: */
-: 494:int
-: 495:xenStoreListDomains(virConnectPtr conn, int *ids, int maxids)
function xenStoreListDomains called 0 returned 0% blocks executed 0%
#####: 496:{
#####: 497: char **idlist = NULL, *endptr;
-: 498: unsigned int num, i;
-: 499: int ret;
-: 500: long id;
-: 501:
#####: 502: if ((conn == NULL) || (ids == NULL)) {
branch 0 never executed
branch 1 never executed
#####: 503: virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call 0 never executed
#####: 504: return(-1);
-: 505: }
#####: 506: if (conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 507: return(-1);
-: 508:
#####: 509: idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num);
call 0 never executed
#####: 510: if (idlist == NULL)
branch 0 never executed
branch 1 never executed
#####: 511: return(-1);
-: 512:
#####: 513: for (ret = 0, i = 0; (i < num) && (ret < maxids); i++) {
branch 0 never executed
branch 1 never executed
#####: 514: id = strtol(idlist[i], &endptr, 10);
call 0 never executed
#####: 515: if ((endptr == idlist[i]) || (*endptr != 0)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 516: ret = -1;
#####: 517: break;
-: 518: }
#####: 519: if (virConnectCheckStoreID(conn, (int) id) < 0)
call 0 never executed
branch 1 never executed
branch 2 never executed
#####: 520: continue;
#####: 521: ids[ret++] = (int) id;
-: 522: }
#####: 523: return(ret);
-: 524:}
-: 525:
-: 526:/**
-: 527: * xenStoreDomainLookupByName:
-: 528: * @conn: A xend instance
-: 529: * @name: The name of the domain
-: 530: *
-: 531: * Try to lookup a domain on the Xen Store based on its name.
-: 532: *
-: 533: * Returns a new domain object or NULL in case of failure
-: 534: */
-: 535:virDomainPtr
-: 536:xenStoreDomainLookupByName(virConnectPtr conn, const char *name)
function xenStoreDomainLookupByName called 0 returned 0% blocks executed 0%
#####: 537:{
#####: 538: virDomainPtr ret = NULL;
-: 539: unsigned int num, i, len;
#####: 540: long id = -1;
#####: 541: char **idlist = NULL, *endptr;
#####: 542: char prop[200], *tmp, *path = NULL;
#####: 543: int found = 0;
#####: 544: struct xend_domain *xenddomain = NULL;
-: 545:
#####: 546: if ((conn == NULL) || (name == NULL)) {
branch 0 never executed
branch 1 never executed
#####: 547: virXenStoreError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call 0 never executed
#####: 548: return(NULL);
-: 549: }
#####: 550: if (conn->xshandle == NULL)
branch 0 never executed
branch 1 never executed
#####: 551: return(NULL);
-: 552:
#####: 553: idlist = xs_directory(conn->xshandle, 0, "/local/domain", &num);
call 0 never executed
#####: 554: if (idlist == NULL)
branch 0 never executed
branch 1 never executed
#####: 555: goto done;
-: 556:
#####: 557: for (i = 0; i < num; i++) {
branch 0 never executed
branch 1 never executed
#####: 558: id = strtol(idlist[i], &endptr, 10);
call 0 never executed
#####: 559: if ((endptr == idlist[i]) || (*endptr != 0)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
-: 560: goto done;
-: 561: }
#####: 562: if (virConnectCheckStoreID(conn, (int) id) < 0)
call 0 never executed
branch 1 never executed
branch 2 never executed
#####: 563: continue;
#####: 564: snprintf(prop, 199, "/local/domain/%s/name", idlist[i]);
call 0 never executed
#####: 565: prop[199] = 0;
#####: 566: tmp = xs_read(conn->xshandle, 0, prop, &len);
call 0 never executed
#####: 567: if (tmp != NULL) {
branch 0 never executed
branch 1 never executed
#####: 568: found = !strcmp(name, tmp);
call 0 never executed
#####: 569: free(tmp);
call 0 never executed
#####: 570: if (found)
branch 0 never executed
branch 1 never executed
#####: 571: break;
-: 572: }
-: 573: }
#####: 574: path = xs_get_domain_path(conn->xshandle, (unsigned int) id);
call 0 never executed
-: 575:
#####: 576: if (!found)
branch 0 never executed
branch 1 never executed
#####: 577: return(NULL);
-: 578:
#####: 579: ret = virGetDomain(conn, name, NULL);
call 0 never executed
#####: 580: if (ret == NULL) {
branch 0 never executed
branch 1 never executed
#####: 581: virXenStoreError(conn, VIR_ERR_NO_MEMORY, "Allocating domain");
call 0 never executed
#####: 582: if (path != NULL)
branch 0 never executed
branch 1 never executed
#####: 583: free(path);
call 0 never executed
-: 584: goto done;
-: 585: }
#####: 586: ret->handle = id;
#####: 587: ret->path = path;
-: 588:
#####: 589:done:
#####: 590: if (xenddomain != NULL)
branch 0 never executed
branch 1 never executed
#####: 591: free(xenddomain);
call 0 never executed
#####: 592: if (idlist != NULL)
branch 0 never executed
branch 1 never executed
#####: 593: free(idlist);
call 0 never executed
-: 594:
#####: 595: return(ret);
-: 596:}
-: 597:
-: 598:/**
-: 599: * xenStoreDomainShutdown:
-: 600: * @domain: pointer to the Domain block
-: 601: *
-: 602: * Shutdown the domain, the OS is requested to properly shutdown
-: 603: * and the domain may ignore it. It will return immediately
-: 604: * after queuing the request.
-: 605: *
-: 606: * Returns 0 in case of success, -1 in case of error.
-: 607: */
-: 608:int
-: 609:xenStoreDomainShutdown(virDomainPtr domain)
function xenStoreDomainShutdown called 0 returned 0% blocks executed 0%
#####: 610:{
#####: 611: if ((domain == NULL) || (domain->conn == NULL)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 612: virXenStoreError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
branch 0 never executed
branch 1 never executed
call 2 never executed
-: 613: __FUNCTION__);
#####: 614: return(-1);
-: 615: }
-: 616: /*
-: 617: * this is very hackish, the domU kernel probes for a special
-: 618: * node in the xenstore and launch the shutdown command if found.
-: 619: */
#####: 620: return(virDomainDoStoreWrite(domain, "control/shutdown", "halt"));
call 0 never executed
-: 621:}
-: 622:
-: 623:/**
-: 624: * xenStoreDomainReboot:
-: 625: * @domain: pointer to the Domain block
-: 626: * @flags: extra flags for the reboot operation, not used yet
-: 627: *
-: 628: * Reboot the domain, the OS is requested to properly shutdown
-: 629: * and reboot but the domain may ignore it. It will return immediately
-: 630: * after queuing the request.
-: 631: *
-: 632: * Returns 0 in case of success, -1 in case of error.
-: 633: */
-: 634:int
-: 635:xenStoreDomainReboot(virDomainPtr domain, unsigned int flags ATTRIBUTE_UNUSED)
function xenStoreDomainReboot called 0 returned 0% blocks executed 0%
#####: 636:{
#####: 637: if ((domain == NULL) || (domain->conn == NULL)) {
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 638: virXenStoreError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
branch 0 never executed
branch 1 never executed
call 2 never executed
-: 639: __FUNCTION__);
#####: 640: return(-1);
-: 641: }
-: 642: /*
-: 643: * this is very hackish, the domU kernel probes for a special
-: 644: * node in the xenstore and launch the shutdown command if found.
-: 645: */
#####: 646: return(virDomainDoStoreWrite(domain, "control/shutdown", "reboot"));
call 0 never executed
-: 647:}
-: 648:#endif /* ! PROXY */
-: 649:
-: 650:/**
-: 651: * xenStoreDomainGetVNCPort:
-: 652: * @conn: the hypervisor connection
-: 653: * @domid: id of the domain
-: 654: *
-: 655: * Return the port number on which the domain is listening for VNC
-: 656: * connections.
-: 657: *
-: 658: * Returns the port number, -1 in case of error
-: 659: */
function xenStoreDomainGetVNCPort called 1 returned 100% blocks executed 38%
1: 660:int xenStoreDomainGetVNCPort(virConnectPtr conn, int domid) {
-: 661: char *tmp;
1: 662: int ret = -1;
-: 663:
1: 664: tmp = virDomainDoStoreQuery(conn, domid, "console/vnc-port");
call 0 returned 100%
1: 665: if (tmp != NULL) {
branch 0 taken 0% (fallthrough)
branch 1 taken 100%
-: 666: char *end;
#####: 667: ret = strtol(tmp, &end, 10);
call 0 never executed
#####: 668: if (ret == 0 && end == tmp)
branch 0 never executed
branch 1 never executed
branch 2 never executed
branch 3 never executed
#####: 669: ret = -1;
#####: 670: free(tmp);
call 0 never executed
-: 671: }
1: 672: return(ret);
-: 673:}
-: 674:
-: 675:/**
-: 676: * xenStoreDomainGetConsolePath:
-: 677: * @conn: the hypervisor connection
-: 678: * @domid: id of the domain
-: 679: *
-: 680: * Return the path to the psuedo TTY on which the guest domain's
-: 681: * serial console is attached.
-: 682: *
-: 683: * Returns the path to the serial console. It is the callers
-: 684: * responsibilty to free() the return string. Returns NULL
-: 685: * on error
-: 686: */
function xenStoreDomainGetConsolePath called 2 returned 100% blocks executed 100%
2: 687:char * xenStoreDomainGetConsolePath(virConnectPtr conn, int domid) {
2: 688: return virDomainDoStoreQuery(conn, domid, "console/tty");
call 0 returned 100%
-: 689:}