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:}