Coverage report for src/libvirt.c.gcov

        -:    0:Source:libvirt.c
        -:    0:Graph:./libvirt_la-libvirt.gcno
        -:    0:Data:./libvirt_la-libvirt.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:/*
        -:    2: * libvirt.c: Main interfaces for the libvirt library to handle virtualization
        -:    3: *           domains from a process running in domain 0
        -:    4: *
        -:    5: * Copyright (C) 2005,2006 Red Hat, Inc.
        -:    6: *
        -:    7: * See COPYING.LIB for the License of this software
        -:    8: *
        -:    9: * Daniel Veillard <veillard@redhat.com>
        -:   10: */
        -:   11:
        -:   12:#include "libvirt/libvirt.h"
        -:   13:
        -:   14:#include <stdio.h>
        -:   15:#include <stdlib.h>
        -:   16:#include <string.h>
        -:   17:#include <sys/types.h>
        -:   18:#include <sys/stat.h>
        -:   19:#include <unistd.h>
        -:   20:
        -:   21:#include <libxml/parser.h>
        -:   22:#include <libxml/xpath.h>
        -:   23:
        -:   24:#include <xs.h>
        -:   25:
        -:   26:#include "internal.h"
        -:   27:#include "driver.h"
        -:   28:#include "xen_internal.h"
        -:   29:#include "xend_internal.h"
        -:   30:#include "xs_internal.h"
        -:   31:#include "proxy_internal.h"
        -:   32:#include "xml.h"
        -:   33:#include "test.h"
        -:   34:
        -:   35:/*
        -:   36: * TODO:
        -:   37: * - use lock to protect against concurrent accesses ?
        -:   38: * - use reference counting to garantee coherent pointer state ?
        -:   39: * - memory wrappers for malloc/free ?
        -:   40: */
        -:   41:
        -:   42:static virDriverPtr virDriverTab[MAX_DRIVERS];
        -:   43:static int initialized = 0;
        -:   44:
        -:   45:/**
        -:   46: * virInitialize:
        -:   47: *
        -:   48: * Initialize the library. It's better to call this routine at startup
        -:   49: * in multithreaded applications to avoid potential race when initializing
        -:   50: * the library.
        -:   51: *
        -:   52: * Returns 0 in case of success, -1 in case of error
        -:   53: */
        -:   54:int
        -:   55:virInitialize(void)
function virInitialize called 0 returned 0% blocks executed 0%
    #####:   56:{
        -:   57:    int i;
        -:   58:
    #####:   59:    if (initialized)
branch  0 never executed
branch  1 never executed
    #####:   60:        return(0);
    #####:   61:    initialized = 1;
        -:   62:
        -:   63:    /*
        -:   64:     * should not be needed but...
        -:   65:     */
    #####:   66:    for (i = 0;i < MAX_DRIVERS;i++) 
branch  0 never executed
branch  1 never executed
    #####:   67:         virDriverTab[i] = NULL;
        -:   68:
        -:   69:    /*
        -:   70:     * Note that the order is important the first ones have a higher priority
        -:   71:     */
    #####:   72:    xenHypervisorRegister();
call    0 never executed
    #####:   73:    xenProxyRegister();
call    0 never executed
    #####:   74:    xenDaemonRegister();
call    0 never executed
    #####:   75:    xenStoreRegister();
call    0 never executed
    #####:   76:    testRegister();
call    0 never executed
    #####:   77:    return(0);
        -:   78:}
        -:   79:
        -:   80:
        -:   81:
        -:   82:/**
        -:   83: * virLibConnError:
        -:   84: * @conn: the connection if available
        -:   85: * @error: the error noumber
        -:   86: * @info: extra information string
        -:   87: *
        -:   88: * Handle an error at the connection level
        -:   89: */
        -:   90:static void
        -:   91:virLibConnError(virConnectPtr conn, virErrorNumber error, const char *info)
function virLibConnError called 0 returned 0% blocks executed 0%
    #####:   92:{
        -:   93:    const char *errmsg;
        -:   94:
    #####:   95:    if (error == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:   96:        return;
        -:   97:
    #####:   98:    errmsg = __virErrorMsg(error, info);
call    0 never executed
    #####:   99:    __virRaiseError(conn, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR,
call    0 never executed
        -:  100:                    errmsg, info, NULL, 0, 0, errmsg, info);
        -:  101:}
        -:  102:
        -:  103:/**
        -:  104: * virLibConnError:
        -:  105: * @conn: the connection if available
        -:  106: * @error: the error noumber
        -:  107: * @info: extra information string
        -:  108: *
        -:  109: * Handle an error at the connection level
        -:  110: */
        -:  111:static void
        -:  112:virLibDomainError(virDomainPtr domain, virErrorNumber error,
        -:  113:                  const char *info)
function virLibDomainError called 0 returned 0% blocks executed 0%
    #####:  114:{
    #####:  115:    virConnectPtr conn = NULL;
        -:  116:    const char *errmsg;
        -:  117:
    #####:  118:    if (error == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:  119:        return;
        -:  120:
    #####:  121:    errmsg = __virErrorMsg(error, info);
call    0 never executed
    #####:  122:    if (error != VIR_ERR_INVALID_DOMAIN) {
branch  0 never executed
branch  1 never executed
    #####:  123:        conn = domain->conn;
        -:  124:    }
    #####:  125:    __virRaiseError(conn, domain, VIR_FROM_DOM, error, VIR_ERR_ERROR,
call    0 never executed
        -:  126:                    errmsg, info, NULL, 0, 0, errmsg, info);
        -:  127:}
        -:  128:
        -:  129:/**
        -:  130: * virRegisterDriver:
        -:  131: * @driver: pointer to a driver block
        -:  132: *
        -:  133: * Register a virtualization driver
        -:  134: *
        -:  135: * Returns the driver priority or -1 in case of error.
        -:  136: */
        -:  137:int
        -:  138:virRegisterDriver(virDriverPtr driver)
function virRegisterDriver called 0 returned 0% blocks executed 0%
    #####:  139:{
        -:  140:    int i;
        -:  141:
    #####:  142:    if (!initialized)
branch  0 never executed
branch  1 never executed
    #####:  143:        virInitialize();
call    0 never executed
        -:  144:
    #####:  145:    if (driver == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  146:        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  147:	return(-1);
        -:  148:    }
    #####:  149:    for (i = 0;i < MAX_DRIVERS;i++) {
branch  0 never executed
branch  1 never executed
    #####:  150:        if (virDriverTab[i] == driver)
branch  0 never executed
branch  1 never executed
    #####:  151:	    return(i);
        -:  152:    }
    #####:  153:    for (i = 0;i < MAX_DRIVERS;i++) {
branch  0 never executed
branch  1 never executed
    #####:  154:        if (virDriverTab[i] == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  155:	    virDriverTab[i] = driver;
    #####:  156:	    return(i);
        -:  157:	}
        -:  158:    }
    #####:  159:    virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  160:    return(-1);
        -:  161:}
        -:  162:
        -:  163:/**
        -:  164: * virGetVersion:
        -:  165: * @libVer: return value for the library version (OUT)
        -:  166: * @type: the type of connection/driver looked at
        -:  167: * @typeVer: return value for the version of the hypervisor (OUT)
        -:  168: *
        -:  169: * Provides two information back, @libVer is the version of the library
        -:  170: * while @typeVer will be the version of the hypervisor type @type against
        -:  171: * which the library was compiled. If @type is NULL, "Xen" is assumed, if
        -:  172: * @type is unknown or not availble, an error code will be returned and 
        -:  173: * @typeVer will be 0.
        -:  174: *
        -:  175: * Returns -1 in case of failure, 0 otherwise, and values for @libVer and
        -:  176: *       @typeVer have the format major * 1,000,000 + minor * 1,000 + release.
        -:  177: */
        -:  178:int
        -:  179:virGetVersion(unsigned long *libVer, const char *type,
        -:  180:              unsigned long *typeVer)
function virGetVersion called 0 returned 0% blocks executed 0%
    #####:  181:{
        -:  182:    int i;
        -:  183:
    #####:  184:    if (!initialized)
branch  0 never executed
branch  1 never executed
    #####:  185:        virInitialize();
call    0 never executed
        -:  186:
    #####:  187:    if (libVer == NULL)
branch  0 never executed
branch  1 never executed
    #####:  188:        return (-1);
    #####:  189:    *libVer = LIBVIR_VERSION_NUMBER;
        -:  190:
    #####:  191:    if (typeVer != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  192:        if (type == NULL)
branch  0 never executed
branch  1 never executed
    #####:  193:	    type = "Xen";
    #####:  194:	for (i = 0;i < MAX_DRIVERS;i++) {
branch  0 never executed
branch  1 never executed
    #####:  195:	    if ((virDriverTab[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  196:	        (!strcmp(virDriverTab[i]->name, type))) {
call    0 never executed
    #####:  197:		*typeVer = virDriverTab[i]->ver;
    #####:  198:		break;
        -:  199:	    }
        -:  200:	}
    #####:  201:        if (i >= MAX_DRIVERS) {
branch  0 never executed
branch  1 never executed
    #####:  202:            *typeVer = 0;
    #####:  203:            virLibConnError(NULL, VIR_ERR_NO_SUPPORT, type);
call    0 never executed
    #####:  204:            return (-1);
        -:  205:        }
        -:  206:    }
    #####:  207:    return (0);
        -:  208:}
        -:  209:
        -:  210:/**
        -:  211: * virConnectOpen:
        -:  212: * @name: optional argument currently unused, pass NULL
        -:  213: *
        -:  214: * This function should be called first to get a connection to the 
        -:  215: * Hypervisor and xen store
        -:  216: *
        -:  217: * Returns a pointer to the hypervisor connection or NULL in case of error
        -:  218: */
        -:  219:virConnectPtr
        -:  220:virConnectOpen(const char *name)
function virConnectOpen called 0 returned 0% blocks executed 0%
    #####:  221:{
    #####:  222:    int i, res, for_xen = 0;
    #####:  223:    virConnectPtr ret = NULL;
        -:  224:
    #####:  225:    if (!initialized)
branch  0 never executed
branch  1 never executed
    #####:  226:        virInitialize();
call    0 never executed
        -:  227:
    #####:  228:    if (name == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  229:        name = "Xen";
    #####:  230:	for_xen = 1;
    #####:  231:    } else if (!strncasecmp(name, "xen", 3)) {
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  232:	for_xen = 1;
        -:  233:    }
        -:  234:
    #####:  235:    ret = virGetConnect();
call    0 never executed
    #####:  236:    if (ret == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  237:        virLibConnError(NULL, VIR_ERR_NO_MEMORY, "Allocating connection");
call    0 never executed
    #####:  238:        goto failed;
        -:  239:    }
        -:  240:
    #####:  241:    for (i = 0;i < MAX_DRIVERS;i++) {
branch  0 never executed
branch  1 never executed
    #####:  242:        if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  243:	    res = virDriverTab[i]->open(ret, name, VIR_DRV_OPEN_QUIET);
call    0 never executed
        -:  244:	    /*
        -:  245:	     * For a default connect to Xen make sure we manage to contact
        -:  246:	     * all related drivers.
        -:  247:	     */
    #####:  248:	    if ((res < 0) && (for_xen) &&
branch  0 never executed
branch  1 never executed
call    2 never executed
branch  3 never executed
branch  4 never executed
branch  5 never executed
branch  6 never executed
        -:  249:	        (!strncasecmp(virDriverTab[i]->name, "xen", 3)) &&
        -:  250:		(virDriverTab[i]->no != VIR_DRV_XEN_PROXY))
    #####:  251:		goto failed;
    #####:  252:	    if (res == 0)
branch  0 never executed
branch  1 never executed
    #####:  253:	        ret->drivers[ret->nb_drivers++] = virDriverTab[i];
        -:  254:	}
        -:  255:    }
        -:  256:
    #####:  257:    if (ret->nb_drivers == 0) {
branch  0 never executed
branch  1 never executed
        -:  258:	/* we failed to find an adequate driver */
    #####:  259:	virLibConnError(NULL, VIR_ERR_NO_SUPPORT, name);
call    0 never executed
    #####:  260:	goto failed;
        -:  261:    }
        -:  262:
    #####:  263:    return (ret);
        -:  264:
    #####:  265:failed:
    #####:  266:    if (ret != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  267:	for (i = 0;i < ret->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  268:	    if ((ret->drivers[i] != NULL) && (ret->drivers[i]->close != NULL))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  269:	        ret->drivers[i]->close(ret);
call    0 never executed
        -:  270:	}
    #####:  271:	virFreeConnect(ret);
call    0 never executed
        -:  272:    }
    #####:  273:    return (NULL);
        -:  274:}
        -:  275:
        -:  276:/**
        -:  277: * virConnectOpenReadOnly:
        -:  278: * @name: optional argument currently unused, pass NULL
        -:  279: *
        -:  280: * This function should be called first to get a restricted connection to the 
        -:  281: * libbrary functionalities. The set of APIs usable are then restricted
        -:  282: * on the available methods to control the domains.
        -:  283: *
        -:  284: * Returns a pointer to the hypervisor connection or NULL in case of error
        -:  285: */
        -:  286:virConnectPtr
        -:  287:virConnectOpenReadOnly(const char *name)
function virConnectOpenReadOnly called 0 returned 0% blocks executed 0%
    #####:  288:{
        -:  289:    int i, res;
    #####:  290:    virConnectPtr ret = NULL;
        -:  291:
    #####:  292:    if (!initialized)
branch  0 never executed
branch  1 never executed
    #####:  293:        virInitialize();
call    0 never executed
        -:  294:
    #####:  295:    if (name == NULL)
branch  0 never executed
branch  1 never executed
    #####:  296:        name = "Xen";
        -:  297:
    #####:  298:    ret = virGetConnect();
call    0 never executed
    #####:  299:    if (ret == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  300:        virLibConnError(NULL, VIR_ERR_NO_MEMORY, "Allocating connection");
call    0 never executed
    #####:  301:        goto failed;
        -:  302:    }
        -:  303:
    #####:  304:    for (i = 0;i < MAX_DRIVERS;i++) {
branch  0 never executed
branch  1 never executed
    #####:  305:        if ((virDriverTab[i] != NULL) && (virDriverTab[i]->open != NULL)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  306:	    res = virDriverTab[i]->open(ret, name,
call    0 never executed
        -:  307:	                                VIR_DRV_OPEN_QUIET | VIR_DRV_OPEN_RO);
    #####:  308:	    if (res == 0)
branch  0 never executed
branch  1 never executed
    #####:  309:	        ret->drivers[ret->nb_drivers++] = virDriverTab[i];
        -:  310:
        -:  311:	}
        -:  312:    }
    #####:  313:    if (ret->nb_drivers == 0) {
branch  0 never executed
branch  1 never executed
    #####:  314:	if (name == NULL)
branch  0 never executed
branch  1 never executed
    #####:  315:	    virLibConnError(NULL, VIR_ERR_NO_CONNECT,
call    0 never executed
        -:  316:			    "could not connect to Xen Daemon nor Xen Store");
        -:  317:	else
        -:  318:	    /* we failed to find an adequate driver */
    #####:  319:	    virLibConnError(NULL, VIR_ERR_NO_SUPPORT, name);
call    0 never executed
        -:  320:	goto failed;
        -:  321:    }
    #####:  322:    ret->flags = VIR_CONNECT_RO;
        -:  323:
    #####:  324:    return (ret);
        -:  325:
    #####:  326:failed:
    #####:  327:    if (ret != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  328:	for (i = 0;i < ret->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  329:	    if ((ret->drivers[i] != NULL) && (ret->drivers[i]->close != NULL))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  330:	        ret->drivers[i]->close(ret);
call    0 never executed
        -:  331:	}
    #####:  332:	virFreeConnect(ret);
call    0 never executed
        -:  333:    }
    #####:  334:    return (NULL);
        -:  335:}
        -:  336:
        -:  337:/**
        -:  338: * virConnectClose:
        -:  339: * @conn: pointer to the hypervisor connection
        -:  340: *
        -:  341: * This function closes the connection to the Hypervisor. This should
        -:  342: * not be called if further interaction with the Hypervisor are needed
        -:  343: * especially if there is running domain which need further monitoring by
        -:  344: * the application.
        -:  345: *
        -:  346: * Returns 0 in case of success or -1 in case of error.
        -:  347: */
        -:  348:int
        -:  349:virConnectClose(virConnectPtr conn)
function virConnectClose called 0 returned 0% blocks executed 0%
    #####:  350:{
        -:  351:    int i;
        -:  352:
    #####:  353:    if (!VIR_IS_CONNECT(conn))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  354:        return (-1);
    #####:  355:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  356:	if ((conn->drivers[i] != NULL) && (conn->drivers[i]->close != NULL))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  357:	    conn->drivers[i]->close(conn);
call    0 never executed
        -:  358:    }
    #####:  359:    if (virFreeConnect(conn) < 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  360:        return (-1);
    #####:  361:    return (0);
        -:  362:}
        -:  363:
        -:  364:/**
        -:  365: * virConnectGetType:
        -:  366: * @conn: pointer to the hypervisor connection
        -:  367: *
        -:  368: * Get the name of the Hypervisor software used.
        -:  369: *
        -:  370: * Returns NULL in case of error, a static zero terminated string otherwise.
        -:  371: */
        -:  372:const char *
        -:  373:virConnectGetType(virConnectPtr conn)
function virConnectGetType called 0 returned 0% blocks executed 0%
    #####:  374:{
        -:  375:    int i;
        -:  376:    const char *ret;
        -:  377:
    #####:  378:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  379:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  380:        return (NULL);
        -:  381:    }
    #####:  382:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  383:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  384:	    (conn->drivers[i]->type != NULL)) {
    #####:  385:	    ret = conn->drivers[i]->type(conn);
call    0 never executed
    #####:  386:	    if (ret != NULL)
branch  0 never executed
branch  1 never executed
    #####:  387:	        return(ret);
        -:  388:	}
        -:  389:    }
    #####:  390:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  391:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  392:	    (conn->drivers[i]->name != NULL)) {
    #####:  393:	    return(conn->drivers[i]->name);
        -:  394:	}
        -:  395:    }
    #####:  396:    return(NULL);
        -:  397:}
        -:  398:
        -:  399:/**
        -:  400: * virConnectGetVersion:
        -:  401: * @conn: pointer to the hypervisor connection
        -:  402: * @hvVer: return value for the version of the running hypervisor (OUT)
        -:  403: *
        -:  404: * Get the version level of the Hypervisor running. This may work only with 
        -:  405: * hypervisor call, i.e. with priviledged access to the hypervisor, not
        -:  406: * with a Read-Only connection.
        -:  407: *
        -:  408: * Returns -1 in case of error, 0 otherwise. if the version can't be
        -:  409: *    extracted by lack of capacities returns 0 and @hvVer is 0, otherwise
        -:  410: *    @hvVer value is major * 1,000,000 + minor * 1,000 + release
        -:  411: */
        -:  412:int
        -:  413:virConnectGetVersion(virConnectPtr conn, unsigned long *hvVer)
function virConnectGetVersion called 0 returned 0% blocks executed 0%
    #####:  414:{
        -:  415:    int ret, i;
        -:  416:
    #####:  417:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  418:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  419:        return (-1);
        -:  420:    }
        -:  421:
    #####:  422:    if (hvVer == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  423:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  424:        return (-1);
        -:  425:    }
        -:  426:
    #####:  427:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  428:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  429:	    (conn->drivers[i]->version != NULL)) {
    #####:  430:	    ret = conn->drivers[i]->version(conn, hvVer);
call    0 never executed
    #####:  431:	    if (ret == 0)
branch  0 never executed
branch  1 never executed
    #####:  432:	        return(0);
        -:  433:	}
        -:  434:    }
    #####:  435:    return (-1);
        -:  436:}
        -:  437:
        -:  438:/**
        -:  439: * virConnectListDomains:
        -:  440: * @conn: pointer to the hypervisor connection
        -:  441: * @ids: array to collect the list of IDs of active domains
        -:  442: * @maxids: size of @ids
        -:  443: *
        -:  444: * Collect the list of active domains, and store their ID in @maxids
        -:  445: *
        -:  446: * Returns the number of domain found or -1 in case of error
        -:  447: */
        -:  448:int
        -:  449:virConnectListDomains(virConnectPtr conn, int *ids, int maxids)
function virConnectListDomains called 0 returned 0% blocks executed 0%
    #####:  450:{
    #####:  451:    int ret = -1;
        -:  452:    int i;
        -:  453:
    #####:  454:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  455:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  456:        return (-1);
        -:  457:    }
        -:  458:
    #####:  459:    if ((ids == NULL) || (maxids <= 0)) {
branch  0 never executed
branch  1 never executed
    #####:  460:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  461:        return (-1);
        -:  462:    }
        -:  463:
        -:  464:    /* Go though the driver registered entry points */
    #####:  465:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  466:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  467:	    (conn->drivers[i]->listDomains != NULL)) {
    #####:  468:	    ret = conn->drivers[i]->listDomains(conn, ids, maxids);
call    0 never executed
    #####:  469:	    if (ret >= 0)
branch  0 never executed
branch  1 never executed
    #####:  470:	        return(ret);
        -:  471:	}
        -:  472:    }
        -:  473:
    #####:  474:    return (-1);
        -:  475:}
        -:  476:
        -:  477:/**
        -:  478: * virConnectNumOfDomains:
        -:  479: * @conn: pointer to the hypervisor connection
        -:  480: *
        -:  481: * Provides the number of active domains.
        -:  482: *
        -:  483: * Returns the number of domain found or -1 in case of error
        -:  484: */
        -:  485:int
        -:  486:virConnectNumOfDomains(virConnectPtr conn)
function virConnectNumOfDomains called 0 returned 0% blocks executed 0%
    #####:  487:{
    #####:  488:    int ret = -1;
        -:  489:    int i;
        -:  490:
    #####:  491:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  492:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  493:        return (-1);
        -:  494:    }
        -:  495:
        -:  496:    /* Go though the driver registered entry points */
    #####:  497:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  498:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  499:	    (conn->drivers[i]->numOfDomains != NULL)) {
    #####:  500:	    ret = conn->drivers[i]->numOfDomains(conn);
call    0 never executed
    #####:  501:	    if (ret >= 0)
branch  0 never executed
branch  1 never executed
    #####:  502:	        return(ret);
        -:  503:	}
        -:  504:    }
        -:  505:
    #####:  506:    return(-1);
        -:  507:}
        -:  508:
        -:  509:/**
        -:  510: * virDomainCreateLinux:
        -:  511: * @conn: pointer to the hypervisor connection
        -:  512: * @xmlDesc: an XML description of the domain
        -:  513: * @flags: an optional set of virDomainFlags
        -:  514: *
        -:  515: * Launch a new Linux guest domain, based on an XML description similar
        -:  516: * to the one returned by virDomainGetXMLDesc()
        -:  517: * This function may requires priviledged access to the hypervisor.
        -:  518: * 
        -:  519: * Returns a new domain object or NULL in case of failure
        -:  520: */
        -:  521:virDomainPtr
        -:  522:virDomainCreateLinux(virConnectPtr conn, const char *xmlDesc,
        -:  523:                     unsigned int flags)
function virDomainCreateLinux called 0 returned 0% blocks executed 0%
    #####:  524:{
        -:  525:    virDomainPtr ret;
        -:  526:    int i;
        -:  527:
    #####:  528:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  529:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  530:        return (NULL);
        -:  531:    }
    #####:  532:    if (xmlDesc == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  533:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  534:        return (NULL);
        -:  535:    }
    #####:  536:    if (conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  537:        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  538:	return (NULL);
        -:  539:    }
        -:  540:
    #####:  541:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  542:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  543:	    (conn->drivers[i]->domainCreateLinux != NULL)) {
    #####:  544:	    ret = conn->drivers[i]->domainCreateLinux(conn, xmlDesc, flags);
call    0 never executed
    #####:  545:	    if (ret != NULL)
branch  0 never executed
branch  1 never executed
    #####:  546:	        return(ret);
        -:  547:	}
        -:  548:    }
    #####:  549:    return(NULL);
        -:  550:}
        -:  551:
        -:  552:
        -:  553:/**
        -:  554: * virDomainLookupByID:
        -:  555: * @conn: pointer to the hypervisor connection
        -:  556: * @id: the domain ID number
        -:  557: *
        -:  558: * Try to find a domain based on the hypervisor ID number
        -:  559: *
        -:  560: * Returns a new domain object or NULL in case of failure
        -:  561: */
        -:  562:virDomainPtr
        -:  563:virDomainLookupByID(virConnectPtr conn, int id)
function virDomainLookupByID called 0 returned 0% blocks executed 0%
    #####:  564:{
        -:  565:    virDomainPtr ret;
        -:  566:    int i;
        -:  567:
    #####:  568:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  569:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  570:        return (NULL);
        -:  571:    }
    #####:  572:    if (id < 0) {
branch  0 never executed
branch  1 never executed
    #####:  573:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  574:        return (NULL);
        -:  575:    }
        -:  576:
        -:  577:    /* Go though the driver registered entry points */
    #####:  578:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  579:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  580:	    (conn->drivers[i]->domainLookupByID != NULL)) {
    #####:  581:	    ret = conn->drivers[i]->domainLookupByID(conn, id);
call    0 never executed
    #####:  582:	    if (ret)
branch  0 never executed
branch  1 never executed
    #####:  583:	        return(ret);
        -:  584:	}
        -:  585:    }
        -:  586:
    #####:  587:    return (NULL);
        -:  588:}
        -:  589:
        -:  590:/**
        -:  591: * virDomainLookupByUUID:
        -:  592: * @conn: pointer to the hypervisor connection
        -:  593: * @uuid: the raw UUID for the domain
        -:  594: *
        -:  595: * Try to lookup a domain on the given hypervisor based on its UUID.
        -:  596: *
        -:  597: * Returns a new domain object or NULL in case of failure
        -:  598: */
        -:  599:virDomainPtr
        -:  600:virDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid)
function virDomainLookupByUUID called 0 returned 0% blocks executed 0%
    #####:  601:{
        -:  602:    virDomainPtr ret;
        -:  603:    int i;
        -:  604:
    #####:  605:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  606:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  607:        return (NULL);
        -:  608:    }
    #####:  609:    if (uuid == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  610:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  611:        return (NULL);
        -:  612:    }
        -:  613:
        -:  614:    /* Go though the driver registered entry points */
    #####:  615:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  616:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  617:	    (conn->drivers[i]->domainLookupByUUID != NULL)) {
    #####:  618:	    ret = conn->drivers[i]->domainLookupByUUID(conn, uuid);
call    0 never executed
    #####:  619:	    if (ret)
branch  0 never executed
branch  1 never executed
    #####:  620:	        return(ret);
        -:  621:	}
        -:  622:    }
        -:  623:
    #####:  624:    return (NULL);
        -:  625:}
        -:  626:
        -:  627:/**
        -:  628: * virDomainLookupByUUIDString:
        -:  629: * @conn: pointer to the hypervisor connection
        -:  630: * @uuidstr: the string UUID for the domain
        -:  631: *
        -:  632: * Try to lookup a domain on the given hypervisor based on its UUID.
        -:  633: *
        -:  634: * Returns a new domain object or NULL in case of failure
        -:  635: */
        -:  636:virDomainPtr
        -:  637:virDomainLookupByUUIDString(virConnectPtr conn, const char *uuidstr)
function virDomainLookupByUUIDString called 0 returned 0% blocks executed 0%
    #####:  638:{
        -:  639:    int raw[16], i;
        -:  640:    unsigned char uuid[16];
        -:  641:    int ret;
        -:  642:
    #####:  643:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  644:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  645:        return (NULL);
        -:  646:    }
    #####:  647:    if (uuidstr == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  648:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  649:        return (NULL);
        -:  650:	
        -:  651:    }
        -:  652:    /* XXX: sexpr_uuid() also supports 'xxxx-xxxx-xxxx-xxxx' format. 
        -:  653:     *      We needn't it here. Right? 
        -:  654:     */
    #####:  655:    ret = sscanf(uuidstr,
call    0 never executed
        -:  656:                 "%02x%02x%02x%02x-"
        -:  657:                 "%02x%02x-"
        -:  658:                 "%02x%02x-"
        -:  659:                 "%02x%02x-"
        -:  660:                 "%02x%02x%02x%02x%02x%02x",
        -:  661:                 raw + 0, raw + 1, raw + 2, raw + 3,
        -:  662:                 raw + 4, raw + 5, raw + 6, raw + 7,
        -:  663:                 raw + 8, raw + 9, raw + 10, raw + 11,
        -:  664:                 raw + 12, raw + 13, raw + 14, raw + 15);
        -:  665:    
    #####:  666:    if (ret!=16) {
branch  0 never executed
branch  1 never executed
    #####:  667:	virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  668:	return (NULL);
        -:  669:    }
    #####:  670:    for (i = 0; i < 16; i++)
branch  0 never executed
branch  1 never executed
    #####:  671:        uuid[i] = raw[i] & 0xFF;
        -:  672:    
    #####:  673:    return virDomainLookupByUUID(conn, &uuid[0]);
call    0 never executed
        -:  674:}
        -:  675:
        -:  676:/**
        -:  677: * virDomainLookupByName:
        -:  678: * @conn: pointer to the hypervisor connection
        -:  679: * @name: name for the domain
        -:  680: *
        -:  681: * Try to lookup a domain on the given hypervisor based on its name.
        -:  682: *
        -:  683: * Returns a new domain object or NULL in case of failure
        -:  684: */
        -:  685:virDomainPtr
        -:  686:virDomainLookupByName(virConnectPtr conn, const char *name)
function virDomainLookupByName called 0 returned 0% blocks executed 0%
    #####:  687:{
    #####:  688:    virDomainPtr ret = NULL;
        -:  689:    int i;
        -:  690:
    #####:  691:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  692:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  693:        return (NULL);
        -:  694:    }
    #####:  695:    if (name == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  696:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  697:        return (NULL);
        -:  698:    }
        -:  699:
        -:  700:    /* Go though the driver registered entry points */
    #####:  701:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  702:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  703:	    (conn->drivers[i]->domainLookupByName != NULL)) {
    #####:  704:	    ret = conn->drivers[i]->domainLookupByName(conn, name);
call    0 never executed
    #####:  705:	    if (ret)
branch  0 never executed
branch  1 never executed
    #####:  706:	        return(ret);
        -:  707:	}
        -:  708:    }
    #####:  709:    return (NULL);
        -:  710:}
        -:  711:
        -:  712:/**
        -:  713: * virDomainDestroy:
        -:  714: * @domain: a domain object
        -:  715: *
        -:  716: * Destroy the domain object. The running instance is shutdown if not down
        -:  717: * already and all resources used by it are given back to the hypervisor.
        -:  718: * The data structure is freed and should not be used thereafter if the
        -:  719: * call does not return an error.
        -:  720: * This function may requires priviledged access
        -:  721: *
        -:  722: * Returns 0 in case of success and -1 in case of failure.
        -:  723: */
        -:  724:int
        -:  725:virDomainDestroy(virDomainPtr domain)
function virDomainDestroy called 0 returned 0% blocks executed 0%
    #####:  726:{
        -:  727:    int i;
        -:  728:    virConnectPtr conn;
        -:  729:
    #####:  730:    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
    #####:  731:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####:  732:        return (-1);
        -:  733:    }
        -:  734:
    #####:  735:    conn = domain->conn;
    #####:  736:    if (conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  737:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  738:	return (-1);
        -:  739:    }
        -:  740:
        -:  741:    /*
        -:  742:     * Go though the driver registered entry points but use the 
        -:  743:     * XEN_HYPERVISOR directly only as a last mechanism
        -:  744:     */
    #####:  745:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  746:	if ((conn->drivers[i] != 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
        -:  747:	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
        -:  748:	    (conn->drivers[i]->domainDestroy != NULL)) {
    #####:  749:	    if (conn->drivers[i]->domainDestroy(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  750:	        return (0);
        -:  751:	}
        -:  752:    }
    #####:  753:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  754:	if ((conn->drivers[i] != 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
        -:  755:	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
        -:  756:	    (conn->drivers[i]->domainDestroy != NULL)) {
    #####:  757:	    if (conn->drivers[i]->domainDestroy(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  758:	        return (0);
        -:  759:	}
        -:  760:    }
        -:  761:
    #####:  762:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####:  763:    return (-1);
        -:  764:}
        -:  765:
        -:  766:/**
        -:  767: * virDomainFree:
        -:  768: * @domain: a domain object
        -:  769: *
        -:  770: * Free the domain object. The running instance is kept alive.
        -:  771: * The data structure is freed and should not be used thereafter.
        -:  772: *
        -:  773: * Returns 0 in case of success and -1 in case of failure.
        -:  774: */
        -:  775:int
        -:  776:virDomainFree(virDomainPtr domain)
function virDomainFree called 0 returned 0% blocks executed 0%
    #####:  777:{
    #####:  778:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  779:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####:  780:        return (-1);
        -:  781:    }
    #####:  782:    if (virFreeDomain(domain->conn, domain) < 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  783:        return (-1);
    #####:  784:    return(0);
        -:  785:}
        -:  786:
        -:  787:/**
        -:  788: * virDomainSuspend:
        -:  789: * @domain: a domain object
        -:  790: *
        -:  791: * Suspends an active domain, the process is frozen without further access
        -:  792: * to CPU resources and I/O but the memory used by the domain at the 
        -:  793: * hypervisor level will stay allocated. Use virDomainResume() to reactivate
        -:  794: * the domain.
        -:  795: * This function may requires priviledged access.
        -:  796: *
        -:  797: * Returns 0 in case of success and -1 in case of failure.
        -:  798: */
        -:  799:int
        -:  800:virDomainSuspend(virDomainPtr domain)
function virDomainSuspend called 0 returned 0% blocks executed 0%
    #####:  801:{
        -:  802:    int i;
        -:  803:    virConnectPtr conn;
        -:  804:
    #####:  805:    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
    #####:  806:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####:  807:        return (-1);
        -:  808:    }
    #####:  809:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  810:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  811:	return (-1);
        -:  812:    }
        -:  813:
    #####:  814:    conn = domain->conn;
        -:  815:
        -:  816:    /*
        -:  817:     * Go though the driver registered entry points but use the 
        -:  818:     * XEN_HYPERVISOR directly only as a last mechanism
        -:  819:     */
    #####:  820:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  821:	if ((conn->drivers[i] != 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
        -:  822:	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
        -:  823:	    (conn->drivers[i]->domainSuspend != NULL)) {
    #####:  824:	    if (conn->drivers[i]->domainSuspend(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  825:	        return (0);
        -:  826:	}
        -:  827:    }
    #####:  828:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  829:	if ((conn->drivers[i] != 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
        -:  830:	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
        -:  831:	    (conn->drivers[i]->domainSuspend != NULL)) {
    #####:  832:	    if (conn->drivers[i]->domainSuspend(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  833:	        return (0);
        -:  834:	}
        -:  835:    }
        -:  836:
    #####:  837:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####:  838:    return (-1);
        -:  839:}
        -:  840:
        -:  841:/**
        -:  842: * virDomainResume:
        -:  843: * @domain: a domain object
        -:  844: *
        -:  845: * Resume an suspended domain, the process is restarted from the state where
        -:  846: * it was frozen by calling virSuspendDomain().
        -:  847: * This function may requires priviledged access
        -:  848: *
        -:  849: * Returns 0 in case of success and -1 in case of failure.
        -:  850: */
        -:  851:int
        -:  852:virDomainResume(virDomainPtr domain)
function virDomainResume called 0 returned 0% blocks executed 0%
    #####:  853:{
        -:  854:    int i;
        -:  855:    virConnectPtr conn;
        -:  856:
    #####:  857:    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
    #####:  858:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####:  859:        return (-1);
        -:  860:    }
    #####:  861:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  862:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  863:	return (-1);
        -:  864:    }
        -:  865:
    #####:  866:    conn = domain->conn;
        -:  867:
        -:  868:    /*
        -:  869:     * Go though the driver registered entry points but use the 
        -:  870:     * XEN_HYPERVISOR directly only as a last mechanism
        -:  871:     */
    #####:  872:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  873:	if ((conn->drivers[i] != 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
        -:  874:	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
        -:  875:	    (conn->drivers[i]->domainResume != NULL)) {
    #####:  876:	    if (conn->drivers[i]->domainResume(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  877:	        return(0);
        -:  878:	}
        -:  879:    }
    #####:  880:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  881:	if ((conn->drivers[i] != 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
        -:  882:	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
        -:  883:	    (conn->drivers[i]->domainResume != NULL)) {
    #####:  884:	    if (conn->drivers[i]->domainResume(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  885:	        return(0);
        -:  886:	}
        -:  887:    }
        -:  888:
    #####:  889:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####:  890:    return (-1);
        -:  891:}
        -:  892:
        -:  893:/**
        -:  894: * virDomainSave:
        -:  895: * @domain: a domain object
        -:  896: * @to: path for the output file
        -:  897: *
        -:  898: * This method will suspend a domain and save its memory contents to
        -:  899: * a file on disk. After the call, if successful, the domain is not
        -:  900: * listed as running anymore (this may be a problem).
        -:  901: * Use virDomainRestore() to restore a domain after saving.
        -:  902: *
        -:  903: * Returns 0 in case of success and -1 in case of failure.
        -:  904: */
        -:  905:int
        -:  906:virDomainSave(virDomainPtr domain, const char *to)
function virDomainSave called 0 returned 0% blocks executed 0%
    #####:  907:{
        -:  908:    int ret, i;
        -:  909:    char filepath[4096];
        -:  910:    virConnectPtr conn;
        -:  911:
    #####:  912:    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
    #####:  913:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####:  914:        return (-1);
        -:  915:    }
    #####:  916:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  917:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  918:	return (-1);
        -:  919:    }
    #####:  920:    conn = domain->conn;
    #####:  921:    if (to == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  922:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  923:        return (-1);
        -:  924:    }
        -:  925:
        -:  926:    /*
        -:  927:     * We must absolutize the file path as the save is done out of process
        -:  928:     * TODO: check for URI when libxml2 is linked in.
        -:  929:     */
    #####:  930:    if (to[0] != '/') {
branch  0 never executed
branch  1 never executed
        -:  931:        unsigned int len, t;
        -:  932:
    #####:  933:        t = strlen(to);
call    0 never executed
    #####:  934:        if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  935:            return (-1);
    #####:  936:        len = strlen(filepath);
call    0 never executed
        -:  937:        /* that should be covered by getcwd() semantic, but be 100% sure */
    #####:  938:        if (len > sizeof(filepath) - (t + 3))
branch  0 never executed
branch  1 never executed
    #####:  939:            return (-1);
    #####:  940:        filepath[len] = '/';
    #####:  941:        strcpy(&filepath[len + 1], to);
call    0 never executed
    #####:  942:        to = &filepath[0];
        -:  943:
        -:  944:    }
        -:  945:
        -:  946:    /* Go though the driver registered entry points */
    #####:  947:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####:  948:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  949:	    (conn->drivers[i]->domainSave != NULL)) {
    #####:  950:	    ret = conn->drivers[i]->domainSave(domain, to);
call    0 never executed
    #####:  951:	    if (ret == 0)
branch  0 never executed
branch  1 never executed
    #####:  952:	        return(0);
        -:  953:	}
        -:  954:    }
    #####:  955:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####:  956:    return (-1);
        -:  957:}
        -:  958:
        -:  959:/**
        -:  960: * virDomainRestore:
        -:  961: * @conn: pointer to the hypervisor connection
        -:  962: * @from: path to the 
        -:  963: *
        -:  964: * This method will restore a domain saved to disk by virDomainSave().
        -:  965: *
        -:  966: * Returns 0 in case of success and -1 in case of failure.
        -:  967: */
        -:  968:int
        -:  969:virDomainRestore(virConnectPtr conn, const char *from)
function virDomainRestore called 0 returned 0% blocks executed 0%
    #####:  970:{
        -:  971:    int ret, i;
        -:  972:    char filepath[4096];
        -:  973:
    #####:  974:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  975:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####:  976:        return (-1);
        -:  977:    }
    #####:  978:    if (conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####:  979:        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####:  980:	return (-1);
        -:  981:    }
    #####:  982:    if (from == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  983:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####:  984:        return (-1);
        -:  985:    }
        -:  986:
        -:  987:    /*
        -:  988:     * We must absolutize the file path as the restore is done out of process
        -:  989:     * TODO: check for URI when libxml2 is linked in.
        -:  990:     */
    #####:  991:    if (from[0] != '/') {
branch  0 never executed
branch  1 never executed
        -:  992:        unsigned int len, t;
        -:  993:
    #####:  994:        t = strlen(from);
call    0 never executed
    #####:  995:        if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####:  996:            return (-1);
    #####:  997:        len = strlen(filepath);
call    0 never executed
        -:  998:        /* that should be covered by getcwd() semantic, but be 100% sure */
    #####:  999:        if (len > sizeof(filepath) - (t + 3))
branch  0 never executed
branch  1 never executed
    #####: 1000:            return (-1);
    #####: 1001:        filepath[len] = '/';
    #####: 1002:        strcpy(&filepath[len + 1], from);
call    0 never executed
    #####: 1003:        from = &filepath[0];
        -: 1004:    }
        -: 1005:
        -: 1006:    /* Go though the driver registered entry points */
    #####: 1007:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1008:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1009:	    (conn->drivers[i]->domainSave != NULL)) {
    #####: 1010:	    ret = conn->drivers[i]->domainRestore(conn, from);
call    0 never executed
    #####: 1011:	    if (ret == 0)
branch  0 never executed
branch  1 never executed
    #####: 1012:	        return(0);
        -: 1013:	}
        -: 1014:    }
    #####: 1015:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1016:    return (-1);
        -: 1017:}
        -: 1018:
        -: 1019:/**
        -: 1020: * virDomainShutdown:
        -: 1021: * @domain: a domain object
        -: 1022: *
        -: 1023: * Shutdown a domain, the domain object is still usable there after but
        -: 1024: * the domain OS is being stopped. Note that the guest OS may ignore the
        -: 1025: * request.
        -: 1026: *
        -: 1027: * TODO: should we add an option for reboot, knowing it may not be doable
        -: 1028: *       in the general case ?
        -: 1029: *
        -: 1030: * Returns 0 in case of success and -1 in case of failure.
        -: 1031: */
        -: 1032:int
        -: 1033:virDomainShutdown(virDomainPtr domain)
function virDomainShutdown called 0 returned 0% blocks executed 0%
    #####: 1034:{
    #####: 1035:    int ret = -1, i;
        -: 1036:    virConnectPtr conn;
        -: 1037:
    #####: 1038:    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
    #####: 1039:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1040:        return (-1);
        -: 1041:    }
    #####: 1042:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1043:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1044:	return (-1);
        -: 1045:    }
        -: 1046:
    #####: 1047:    conn = domain->conn;
        -: 1048:
        -: 1049:    /* Go though the driver registered entry points */
    #####: 1050:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1051:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1052:	    (conn->drivers[i]->domainShutdown != NULL)) {
    #####: 1053:	    if (conn->drivers[i]->domainShutdown(domain) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1054:	        ret = 0;
        -: 1055:	}
        -: 1056:    }
        -: 1057:
    #####: 1058:    if (ret != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1059:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1060:        return (ret);
        -: 1061:    }
        -: 1062:
    #####: 1063:    return (ret);
        -: 1064:}
        -: 1065:
        -: 1066:/**
        -: 1067: * virDomainReboot:
        -: 1068: * @domain: a domain object
        -: 1069: * @flags: extra flags for the reboot operation, not used yet
        -: 1070: *
        -: 1071: * Reboot a domain, the domain object is still usable there after but
        -: 1072: * the domain OS is being stopped for a restart.
        -: 1073: * Note that the guest OS may ignore the request.
        -: 1074: *
        -: 1075: * Returns 0 in case of success and -1 in case of failure.
        -: 1076: */
        -: 1077:int
        -: 1078:virDomainReboot(virDomainPtr domain, unsigned int flags)
function virDomainReboot called 0 returned 0% blocks executed 0%
    #####: 1079:{
    #####: 1080:    int ret = -1, i;
        -: 1081:    virConnectPtr conn;
        -: 1082:
    #####: 1083:    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
    #####: 1084:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1085:        return (-1);
        -: 1086:    }
    #####: 1087:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1088:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1089:	return (-1);
        -: 1090:    }
        -: 1091:
    #####: 1092:    conn = domain->conn;
        -: 1093:
        -: 1094:    /* Go though the driver registered entry points */
    #####: 1095:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1096:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1097:	    (conn->drivers[i]->domainReboot != NULL)) {
    #####: 1098:	    if (conn->drivers[i]->domainReboot(domain, flags) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1099:	        ret = 0;
        -: 1100:	}
        -: 1101:    }
        -: 1102:
    #####: 1103:    if (ret != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1104:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1105:        return (ret);
        -: 1106:    }
        -: 1107:
    #####: 1108:    return (ret);
        -: 1109:}
        -: 1110:
        -: 1111:/**
        -: 1112: * virDomainGetName:
        -: 1113: * @domain: a domain object
        -: 1114: *
        -: 1115: * Get the public name for that domain
        -: 1116: *
        -: 1117: * Returns a pointer to the name or NULL, the string need not be deallocated
        -: 1118: * its lifetime will be the same as the domain object.
        -: 1119: */
        -: 1120:const char *
        -: 1121:virDomainGetName(virDomainPtr domain)
function virDomainGetName called 0 returned 0% blocks executed 0%
    #####: 1122:{
    #####: 1123:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1124:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1125:        return (NULL);
        -: 1126:    }
    #####: 1127:    return (domain->name);
        -: 1128:}
        -: 1129:
        -: 1130:/**
        -: 1131: * virDomainGetUUID:
        -: 1132: * @domain: a domain object
        -: 1133: * @uuid: pointer to a 16 bytes array
        -: 1134: *
        -: 1135: * Get the UUID for a domain
        -: 1136: *
        -: 1137: * Returns -1 in case of error, 0 in case of success
        -: 1138: */
        -: 1139:int
        -: 1140:virDomainGetUUID(virDomainPtr domain, unsigned char *uuid)
function virDomainGetUUID called 0 returned 0% blocks executed 0%
    #####: 1141:{
    #####: 1142:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1143:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1144:        return (-1);
        -: 1145:    }
    #####: 1146:    if (uuid == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1147:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1148:        return (-1);
        -: 1149:    }
        -: 1150:
    #####: 1151:    if (domain->handle == 0) {
branch  0 never executed
branch  1 never executed
    #####: 1152:        memset(uuid, 0, 16);
call    0 never executed
        -: 1153:    } else {
    #####: 1154:        if ((domain->uuid[0] == 0) && (domain->uuid[1] == 0) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1155:            (domain->uuid[2] == 0) && (domain->uuid[3] == 0) &&
        -: 1156:            (domain->uuid[4] == 0) && (domain->uuid[5] == 0) &&
        -: 1157:            (domain->uuid[6] == 0) && (domain->uuid[7] == 0) &&
        -: 1158:            (domain->uuid[8] == 0) && (domain->uuid[9] == 0) &&
        -: 1159:            (domain->uuid[10] == 0) && (domain->uuid[11] == 0) &&
        -: 1160:            (domain->uuid[12] == 0) && (domain->uuid[13] == 0) &&
        -: 1161:            (domain->uuid[14] == 0) && (domain->uuid[15] == 0))
    #####: 1162:            xenDaemonDomainLookupByName_ids(domain->conn, domain->name,
call    0 never executed
        -: 1163:                                &domain->uuid[0]);
    #####: 1164:        memcpy(uuid, &domain->uuid[0], 16);
call    0 never executed
        -: 1165:    }
    #####: 1166:    return (0);
        -: 1167:}
        -: 1168:
        -: 1169:/**
        -: 1170: * virDomainGetUUIDString:
        -: 1171: * @domain: a domain object
        -: 1172: * @buf: pointer to a 37 bytes array
        -: 1173: *
        -: 1174: * Get the UUID for a domain as string. For more information about 
        -: 1175: * UUID see RFC4122.
        -: 1176: *
        -: 1177: * Returns -1 in case of error, 0 in case of success
        -: 1178: */
        -: 1179:int
        -: 1180:virDomainGetUUIDString(virDomainPtr domain, char *buf)
function virDomainGetUUIDString called 0 returned 0% blocks executed 0%
    #####: 1181:{
        -: 1182:    unsigned char uuid[16];
        -: 1183:
    #####: 1184:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1185:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1186:        return (-1);
        -: 1187:    }
    #####: 1188:    if (buf == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1189:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1190:        return (-1);
        -: 1191:    }
        -: 1192:    
    #####: 1193:    if (virDomainGetUUID(domain, &uuid[0]))
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1194:	return (-1);
        -: 1195:
    #####: 1196:    snprintf(buf, 37, 
call    0 never executed
        -: 1197:	"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
        -: 1198:                      uuid[0], uuid[1], uuid[2], uuid[3],
        -: 1199:                      uuid[4], uuid[5], uuid[6], uuid[7],
        -: 1200:                      uuid[8], uuid[9], uuid[10], uuid[11],
        -: 1201:                      uuid[12], uuid[13], uuid[14], uuid[15]);
    #####: 1202:    return (0);
        -: 1203:}
        -: 1204:
        -: 1205:/**
        -: 1206: * virDomainGetID:
        -: 1207: * @domain: a domain object
        -: 1208: *
        -: 1209: * Get the hypervisor ID number for the domain
        -: 1210: *
        -: 1211: * Returns the domain ID number or (unsigned int) -1 in case of error
        -: 1212: */
        -: 1213:unsigned int
        -: 1214:virDomainGetID(virDomainPtr domain)
function virDomainGetID called 0 returned 0% blocks executed 0%
    #####: 1215:{
    #####: 1216:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1217:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1218:        return ((unsigned int) -1);
        -: 1219:    }
    #####: 1220:    return (domain->handle);
        -: 1221:}
        -: 1222:
        -: 1223:/**
        -: 1224: * virDomainGetOSType:
        -: 1225: * @domain: a domain object
        -: 1226: *
        -: 1227: * Get the type of domain operation system.
        -: 1228: *
        -: 1229: * Returns the new string or NULL in case of error, the string must be
        -: 1230: *         freed by the caller.
        -: 1231: */
        -: 1232:char *
        -: 1233:virDomainGetOSType(virDomainPtr domain)
function virDomainGetOSType called 0 returned 0% blocks executed 0%
    #####: 1234:{
    #####: 1235:    char *vm, *str = NULL;
        -: 1236:
    #####: 1237:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1238:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1239:        return (NULL);
        -: 1240:    }
        -: 1241:
    #####: 1242:    vm = virDomainGetVM(domain);
call    0 never executed
    #####: 1243:    if (vm) {
branch  0 never executed
branch  1 never executed
    #####: 1244:        str = virDomainGetVMInfo(domain, vm, "image/ostype");
call    0 never executed
    #####: 1245:        free(vm);
call    0 never executed
        -: 1246:    }
    #####: 1247:    if (str == NULL)
branch  0 never executed
branch  1 never executed
    #####: 1248:        str = strdup("linux");
branch  0 never executed
branch  1 never executed
call    2 never executed
call    3 never executed
branch  4 never executed
branch  5 never executed
call    6 never executed
        -: 1249:
    #####: 1250:    return (str);
        -: 1251:}
        -: 1252:
        -: 1253:/**
        -: 1254: * virDomainGetMaxMemory:
        -: 1255: * @domain: a domain object or NULL
        -: 1256: * 
        -: 1257: * Retrieve the maximum amount of physical memory allocated to a
        -: 1258: * domain. If domain is NULL, then this get the amount of memory reserved
        -: 1259: * to Domain0 i.e. the domain where the application runs.
        -: 1260: *
        -: 1261: * Returns the memory size in kilobytes or 0 in case of error.
        -: 1262: */
        -: 1263:unsigned long
        -: 1264:virDomainGetMaxMemory(virDomainPtr domain)
function virDomainGetMaxMemory called 0 returned 0% blocks executed 0%
    #####: 1265:{
    #####: 1266:    unsigned long ret = 0;
        -: 1267:    virConnectPtr conn;
        -: 1268:    int i;
        -: 1269:
    #####: 1270:    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
    #####: 1271:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1272:        return (0);
        -: 1273:    }
        -: 1274:
    #####: 1275:    conn = domain->conn;
        -: 1276:
        -: 1277:    /*
        -: 1278:     * in that case instead of trying only though one method try all availble.
        -: 1279:     * If needed that can be changed back if it's a performcance problem.
        -: 1280:     */
    #####: 1281:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1282:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1283:	    (conn->drivers[i]->domainGetMaxMemory != NULL)) {
    #####: 1284:	    ret = conn->drivers[i]->domainGetMaxMemory(domain);
call    0 never executed
    #####: 1285:	    if (ret != 0)
branch  0 never executed
branch  1 never executed
    #####: 1286:	        return(ret);
        -: 1287:	}
        -: 1288:    }
    #####: 1289:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1290:    return (-1);
        -: 1291:}
        -: 1292:
        -: 1293:/**
        -: 1294: * virDomainSetMaxMemory:
        -: 1295: * @domain: a domain object or NULL
        -: 1296: * @memory: the memory size in kilobytes
        -: 1297: * 
        -: 1298: * Dynamically change the maximum amount of physical memory allocated to a
        -: 1299: * domain. If domain is NULL, then this change the amount of memory reserved
        -: 1300: * to Domain0 i.e. the domain where the application runs.
        -: 1301: * This function requires priviledged access to the hypervisor.
        -: 1302: *
        -: 1303: * Returns 0 in case of success and -1 in case of failure.
        -: 1304: */
        -: 1305:int
        -: 1306:virDomainSetMaxMemory(virDomainPtr domain, unsigned long memory)
function virDomainSetMaxMemory called 0 returned 0% blocks executed 0%
    #####: 1307:{
    #####: 1308:    int ret = -1 , i;
        -: 1309:    virConnectPtr conn;
        -: 1310:
    #####: 1311:    if (domain == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1312:        TODO
call    0 never executed
    #####: 1313:	return (-1);
        -: 1314:    }
    #####: 1315:    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
    #####: 1316:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1317:        return (-1);
        -: 1318:    }
    #####: 1319:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1320:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1321:	return (-1);
        -: 1322:    }
    #####: 1323:    if (memory < 4096) {
branch  0 never executed
branch  1 never executed
    #####: 1324:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1325:        return (-1);
        -: 1326:    }
    #####: 1327:    conn = domain->conn;
        -: 1328:
        -: 1329:    /*
        -: 1330:     * in that case instead of trying only though one method try all availble.
        -: 1331:     * If needed that can be changed back if it's a performcance problem.
        -: 1332:     */
    #####: 1333:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1334:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1335:	    (conn->drivers[i]->domainSetMaxMemory != NULL)) {
    #####: 1336:	    if (conn->drivers[i]->domainSetMaxMemory(domain, memory) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1337:	        ret = 0;
        -: 1338:	}
        -: 1339:    }
    #####: 1340:    if (ret != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1341:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1342:        return (-1);
        -: 1343:    }
    #####: 1344:    return (ret);
        -: 1345:}
        -: 1346:
        -: 1347:/**
        -: 1348: * virDomainSetMemory:
        -: 1349: * @domain: a domain object or NULL
        -: 1350: * @memory: the memory size in kilobytes
        -: 1351: * 
        -: 1352: * Dynamically change the target amount of physical memory allocated to a
        -: 1353: * domain. If domain is NULL, then this change the amount of memory reserved
        -: 1354: * to Domain0 i.e. the domain where the application runs.
        -: 1355: * This function may requires priviledged access to the hypervisor.
        -: 1356: *
        -: 1357: * Returns 0 in case of success and -1 in case of failure.
        -: 1358: */
        -: 1359:int
        -: 1360:virDomainSetMemory(virDomainPtr domain, unsigned long memory)
function virDomainSetMemory called 0 returned 0% blocks executed 0%
    #####: 1361:{
    #####: 1362:    int ret = -1 , i;
        -: 1363:    virConnectPtr conn;
        -: 1364:
    #####: 1365:    if (domain == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1366:        TODO
call    0 never executed
    #####: 1367:	return (-1);
        -: 1368:    }
    #####: 1369:    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
    #####: 1370:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1371:        return (-1);
        -: 1372:    }
    #####: 1373:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1374:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1375:	return (-1);
        -: 1376:    }
    #####: 1377:    if (memory < 4096) {
branch  0 never executed
branch  1 never executed
    #####: 1378:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1379:        return (-1);
        -: 1380:    }
        -: 1381:
    #####: 1382:    conn = domain->conn;
        -: 1383:
        -: 1384:    /*
        -: 1385:     * in that case instead of trying only though one method try all availble.
        -: 1386:     * If needed that can be changed back if it's a performcance problem.
        -: 1387:     */
    #####: 1388:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1389:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1390:	    (conn->drivers[i]->domainSetMemory != NULL)) {
    #####: 1391:	    if (conn->drivers[i]->domainSetMemory(domain, memory) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1392:	        ret = 0;
        -: 1393:	}
        -: 1394:    }
    #####: 1395:    if (ret != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1396:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1397:        return (-1);
        -: 1398:    }
    #####: 1399:    return (ret);
        -: 1400:}
        -: 1401:
        -: 1402:/**
        -: 1403: * virDomainGetInfo:
        -: 1404: * @domain: a domain object
        -: 1405: * @info: pointer to a virDomainInfo structure allocated by the user
        -: 1406: * 
        -: 1407: * Extract information about a domain. Note that if the connection
        -: 1408: * used to get the domain is limited only a partial set of the information
        -: 1409: * can be extracted.
        -: 1410: *
        -: 1411: * Returns 0 in case of success and -1 in case of failure.
        -: 1412: */
        -: 1413:int
        -: 1414:virDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
function virDomainGetInfo called 0 returned 0% blocks executed 0%
    #####: 1415:{
        -: 1416:    int i;
        -: 1417:
    #####: 1418:    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
    #####: 1419:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1420:        return (-1);
        -: 1421:    }
    #####: 1422:    if (info == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1423:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1424:        return (-1);
        -: 1425:    }
        -: 1426:
    #####: 1427:    memset(info, 0, sizeof(virDomainInfo));
call    0 never executed
        -: 1428:
    #####: 1429:    for (i = 0;i < domain->conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1430:	if ((domain->conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1431:	    (domain->conn->drivers[i]->domainGetInfo != NULL)) {
    #####: 1432:	    if (domain->conn->drivers[i]->domainGetInfo(domain, info) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1433:	        return 0;
        -: 1434:	}
        -: 1435:    }
        -: 1436:
    #####: 1437:    return (-1);
        -: 1438:}
        -: 1439:
        -: 1440:/**
        -: 1441: * virDomainGetXMLDesc:
        -: 1442: * @domain: a domain object
        -: 1443: * @flags: and OR'ed set of extraction flags, not used yet
        -: 1444: *
        -: 1445: * Provide an XML description of the domain. The description may be reused
        -: 1446: * later to relaunch the domain with virDomainCreateLinux().
        -: 1447: *
        -: 1448: * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
        -: 1449: *         the caller must free() the returned value.
        -: 1450: */
        -: 1451:char *
        -: 1452:virDomainGetXMLDesc(virDomainPtr domain, int flags)
function virDomainGetXMLDesc called 0 returned 0% blocks executed 0%
    #####: 1453:{
        -: 1454:    int i;
    #####: 1455:    char *ret = NULL;
    #####: 1456:    if (!VIR_IS_DOMAIN(domain)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1457:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1458:        return (NULL);
        -: 1459:    }
    #####: 1460:    if (flags != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1461:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1462:        return (NULL);
        -: 1463:    }
        -: 1464:
    #####: 1465:    for (i = 0;i < domain->conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1466:	if ((domain->conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1467:	    (domain->conn->drivers[i]->domainDumpXML != NULL)) {
    #####: 1468:            ret = domain->conn->drivers[i]->domainDumpXML(domain, flags);
call    0 never executed
    #####: 1469:	    if (ret)
branch  0 never executed
branch  1 never executed
    #####: 1470:	        break;
        -: 1471:	}
        -: 1472:    }
    #####: 1473:    if (!ret) {
branch  0 never executed
branch  1 never executed
    #####: 1474:        virLibConnError(domain->conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1475:        return (NULL);
        -: 1476:    }
    #####: 1477:    return(ret);
        -: 1478:}
        -: 1479:
        -: 1480:/**
        -: 1481: * virNodeGetInfo:
        -: 1482: * @conn: pointer to the hypervisor connection
        -: 1483: * @info: pointer to a virNodeInfo structure allocated by the user
        -: 1484: * 
        -: 1485: * Extract hardware information about the node.
        -: 1486: *
        -: 1487: * Returns 0 in case of success and -1 in case of failure.
        -: 1488: */
        -: 1489:int
function virNodeGetInfo called 0 returned 0% blocks executed 0%
    #####: 1490:virNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info) {
        -: 1491:    int i;
    #####: 1492:    int ret = -1;
        -: 1493:
    #####: 1494:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1495:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####: 1496:        return (-1);
        -: 1497:    }
    #####: 1498:    if (info == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1499:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1500:        return (-1);
        -: 1501:    }
        -: 1502:
    #####: 1503:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1504:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1505:	    (conn->drivers[i]->nodeGetInfo != NULL)) {
    #####: 1506:	    ret = conn->drivers[i]->nodeGetInfo(conn, info);
call    0 never executed
    #####: 1507:	    if (ret == 0)
branch  0 never executed
branch  1 never executed
    #####: 1508:	        break;
        -: 1509:	}
        -: 1510:    }
    #####: 1511:    if (ret != 0) {
branch  0 never executed
branch  1 never executed
    #####: 1512:        virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1513:        return (-1);
        -: 1514:    }
    #####: 1515:    return(0);
        -: 1516:}
        -: 1517:
        -: 1518:/************************************************************************
        -: 1519: *									*
        -: 1520: *		Handling of defined but not running domains		*
        -: 1521: *									*
        -: 1522: ************************************************************************/
        -: 1523:
        -: 1524:/**
        -: 1525: * virDomainDefineXML:
        -: 1526: * @conn: pointer to the hypervisor connection
        -: 1527: * @xml: the XML description for the domain, preferably in UTF-8
        -: 1528: *
        -: 1529: * define a domain, but does not start it
        -: 1530: *
        -: 1531: * Returns NULL in case of error, a pointer to the domain otherwise
        -: 1532: */
        -: 1533:virDomainPtr
function virDomainDefineXML called 0 returned 0% blocks executed 0%
    #####: 1534:virDomainDefineXML(virConnectPtr conn, const char *xml) {
    #####: 1535:    virDomainPtr ret = NULL;
    #####: 1536:    const char *name = NULL;
    #####: 1537:    xmlDocPtr doc = NULL;
    #####: 1538:    xmlXPathObjectPtr obj = NULL;
    #####: 1539:    xmlXPathContextPtr ctxt = NULL;
        -: 1540:
    #####: 1541:    if (!VIR_IS_CONNECT(conn)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1542:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####: 1543:        return (NULL);
        -: 1544:    }
    #####: 1545:    if (conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1546:        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1547:	return (NULL);
        -: 1548:    }
    #####: 1549:    if (xml == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1550:        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1551:        return (NULL);
        -: 1552:    }
        -: 1553:
        -: 1554:    /*
        -: 1555:     * Check the XML description is at least well formed and extract the
        -: 1556:     * name.
        -: 1557:     * TODO: a full validation based on RNG for example should be done there
        -: 1558:     */
    #####: 1559:    doc = xmlReadMemory(xml, strlen(xml), "domain_define.xml", NULL, 0);
call    0 never executed
call    1 never executed
    #####: 1560:    if (doc == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1561:        virLibConnError(conn, VIR_ERR_XML_ERROR, __FUNCTION__);
call    0 never executed
    #####: 1562:	goto done;
        -: 1563:    }
    #####: 1564:    ctxt = xmlXPathNewContext(doc);
call    0 never executed
    #####: 1565:    if (ctxt == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1566:        goto done;
        -: 1567:    }
    #####: 1568:    obj = xmlXPathEval(BAD_CAST "string(/domain/name[1])", ctxt);
call    0 never executed
    #####: 1569:    if ((obj == NULL) || (obj->type != XPATH_STRING) ||
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
        -: 1570:        (obj->stringval == NULL) || (obj->stringval[0] == 0)) {
    #####: 1571:        virLibConnError(conn, VIR_ERR_NO_NAME, xml);
call    0 never executed
    #####: 1572:        goto done;
        -: 1573:    }
    #####: 1574:    name = (const char *) obj->stringval;
        -: 1575:
        -: 1576:    /*
        -: 1577:     * Now look it up in the domain pool and check it's not an already run
        -: 1578:     * domain.
        -: 1579:     */
    #####: 1580:    ret = virGetDomain(conn, name, NULL);
call    0 never executed
    #####: 1581:    if (ret == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1582:        goto done;
        -: 1583:    }
        -: 1584:    /*
        -: 1585:     * TODO: the lifecycle of domains, especially predefined ones need to be
        -: 1586:     *       explicitely written down
        -: 1587:     */
    #####: 1588:    if (ret->handle != -1) {
branch  0 never executed
branch  1 never executed
    #####: 1589:        virLibConnError(conn, VIR_ERR_DOM_EXIST, name);
call    0 never executed
    #####: 1590:        virFreeDomain(conn, ret);
call    0 never executed
    #####: 1591:	ret = NULL;
    #####: 1592:	goto done;
        -: 1593:    }
    #####: 1594:    if ((ret->uses > 1) && (!(ret->flags & DOMAIN_IS_DEFINED))) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1595:        virLibConnError(conn, VIR_ERR_DOM_EXIST, name);
call    0 never executed
    #####: 1596:        virFreeDomain(conn, ret);
call    0 never executed
    #####: 1597:	ret = NULL;
    #####: 1598:	goto done;
        -: 1599:    }
    #####: 1600:    ret->flags |= DOMAIN_IS_DEFINED;
    #####: 1601:    if (ret->xml != NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1602:        free(ret->xml);
call    0 never executed
        -: 1603:    }
    #####: 1604:    ret->xml = strdup(xml);
call    0 never executed
    #####: 1605:    if (ret->xml == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1606:        virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
call    0 never executed
    #####: 1607:	virFreeDomain(conn, ret);
call    0 never executed
    #####: 1608:	ret = NULL;
    #####: 1609:	goto done;
        -: 1610:    }
        -: 1611:    /* TODO shall we keep a list of defined domains there ? */
        -: 1612:
    #####: 1613:done:
    #####: 1614:    if (obj != NULL)
branch  0 never executed
branch  1 never executed
    #####: 1615:	xmlXPathFreeObject(obj);
call    0 never executed
    #####: 1616:    if (ctxt != NULL)
branch  0 never executed
branch  1 never executed
    #####: 1617:        xmlXPathFreeContext(ctxt);
call    0 never executed
    #####: 1618:    if (doc != NULL)
branch  0 never executed
branch  1 never executed
    #####: 1619:        xmlFreeDoc(doc);
call    0 never executed
    #####: 1620:    return(ret);
        -: 1621:}
        -: 1622:
        -: 1623:/**
        -: 1624: * virDomainUndefine:
        -: 1625: * @domain: pointer to a defined domain
        -: 1626: *
        -: 1627: * undefine a domain but does not stop it if it is running
        -: 1628: *
        -: 1629: * Returns 0 in case of success, -1 in case of error
        -: 1630: */
        -: 1631:int
function virDomainUndefine called 0 returned 0% blocks executed 0%
    #####: 1632:virDomainUndefine(virDomainPtr domain) {
        -: 1633:    int ret;
        -: 1634:
    #####: 1635:    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
    #####: 1636:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1637:        return (-1);
        -: 1638:    }
    #####: 1639:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1640:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1641:	return (-1);
        -: 1642:    }
        -: 1643:
        -: 1644:    /* TODO shall we keep a list of defined domains there ? */
        -: 1645:
    #####: 1646:    ret = virFreeDomain(domain->conn, domain);
call    0 never executed
    #####: 1647:    if (ret < 0)
branch  0 never executed
branch  1 never executed
    #####: 1648:        return(-1);
    #####: 1649:    return(0);
        -: 1650:}
        -: 1651:
        -: 1652:/**
        -: 1653: * virConnectListDefinedDomains:
        -: 1654: * @conn: pointer to the hypervisor connection
        -: 1655: * @names: pointer to an array to store the names
        -: 1656: * @maxnames: size of the array
        -: 1657: *
        -: 1658: * list the defined domains, stores the pointers to the names in @names
        -: 1659: * 
        -: 1660: * Returns the number of names provided in the array or -1 in case of error
        -: 1661: */
        -: 1662:int
        -: 1663:virConnectListDefinedDomains(virConnectPtr conn, const char **names,
function virConnectListDefinedDomains called 0 returned 0% blocks executed 0%
    #####: 1664:                             int maxnames) {
    #####: 1665:    TODO
call    0 never executed
    #####: 1666:    return(-1);
        -: 1667:}
        -: 1668:
        -: 1669:/**
        -: 1670: * virDomainCreate:
        -: 1671: * @domain: pointer to a defined domain
        -: 1672: *
        -: 1673: * launch a defined domain. If the call succeed the domain moves from the
        -: 1674: * defined to the running domains pools.
        -: 1675: *
        -: 1676: * Returns 0 in case of success, -1 in case of error
        -: 1677: */
        -: 1678:int
function virDomainCreate called 0 returned 0% blocks executed 0%
    #####: 1679:virDomainCreate(virDomainPtr domain) {
        -: 1680:    
    #####: 1681:    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
    #####: 1682:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1683:        return (-1);
        -: 1684:    }
    #####: 1685:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1686:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1687:	return (-1);
        -: 1688:    }
    #####: 1689:    return(-1);
        -: 1690:}
        -: 1691:
        -: 1692:/**
        -: 1693: * virDomainSetVcpus:
        -: 1694: * @domain: pointer to domain object, or NULL for Domain0
        -: 1695: * @nvcpus: the new number of virtual CPUs for this domain
        -: 1696: *
        -: 1697: * Dynamically change the number of virtual CPUs used by the domain.
        -: 1698: * Note that this call may fail if the underlying virtualization hypervisor
        -: 1699: * does not support it or if growing the number is arbitrary limited.
        -: 1700: * This function requires priviledged access to the hypervisor.
        -: 1701: *
        -: 1702: * Returns 0 in case of success, -1 in case of failure.
        -: 1703: */
        -: 1704:
        -: 1705:int
        -: 1706:virDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
function virDomainSetVcpus called 0 returned 0% blocks executed 0%
    #####: 1707:{
        -: 1708:    int i;
        -: 1709:    virConnectPtr conn;
        -: 1710:
    #####: 1711:    if (domain == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1712:        TODO
call    0 never executed
    #####: 1713:	return (-1);
        -: 1714:    }
    #####: 1715:    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
    #####: 1716:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1717:        return (-1);
        -: 1718:    }
    #####: 1719:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1720:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1721:	return (-1);
        -: 1722:    }
        -: 1723:
    #####: 1724:    if (nvcpus < 1) {
branch  0 never executed
branch  1 never executed
    #####: 1725:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1726:        return (-1);
        -: 1727:    }
    #####: 1728:    conn = domain->conn;
        -: 1729:
        -: 1730:    /*
        -: 1731:     * Go though the driver registered entry points but use the 
        -: 1732:     * XEN_HYPERVISOR directly only as a last mechanism
        -: 1733:     */
    #####: 1734:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1735:	if ((conn->drivers[i] != 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
        -: 1736:	    (conn->drivers[i]->no != VIR_DRV_XEN_HYPERVISOR) &&
        -: 1737:	    (conn->drivers[i]->domainSetVcpus != NULL)) {
    #####: 1738:	    if (conn->drivers[i]->domainSetVcpus(domain, nvcpus) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1739:	        return(0);
        -: 1740:	}
        -: 1741:    }
    #####: 1742:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1743:	if ((conn->drivers[i] != 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
        -: 1744:	    (conn->drivers[i]->no == VIR_DRV_XEN_HYPERVISOR) &&
        -: 1745:	    (conn->drivers[i]->domainSetVcpus != NULL)) {
    #####: 1746:	    if (conn->drivers[i]->domainSetVcpus(domain, nvcpus) == 0)
call    0 never executed
branch  1 never executed
branch  2 never executed
    #####: 1747:	        return(0);
        -: 1748:	}
        -: 1749:    }
        -: 1750:
    #####: 1751:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1752:    return (-1);
        -: 1753:}
        -: 1754:
        -: 1755:/**
        -: 1756: * virDomainPinVcpu:
        -: 1757: * @domain: pointer to domain object, or NULL for Domain0
        -: 1758: * @vcpu: virtual CPU number
        -: 1759: * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN)
        -: 1760: * 	Each bit set to 1 means that corresponding CPU is usable.
        -: 1761: * 	Bytes are stored in little-endian order: CPU0-7, 8-15...
        -: 1762: * 	In each byte, lowest CPU number is least significant bit.
        -: 1763: * @maplen: number of bytes in cpumap, from 1 up to size of CPU map in
        -: 1764: *	underlying virtualization system (Xen...).
        -: 1765: *	If maplen < size, missing bytes are set to zero.
        -: 1766: *	If maplen > size, failure code is returned.
        -: 1767: * 
        -: 1768: * Dynamically change the real CPUs which can be allocated to a virtual CPU.
        -: 1769: * This function requires priviledged access to the hypervisor.
        -: 1770: *
        -: 1771: * Returns 0 in case of success, -1 in case of failure.
        -: 1772: */
        -: 1773:int
        -: 1774:virDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
        -: 1775:                 unsigned char *cpumap, int maplen)
function virDomainPinVcpu called 0 returned 0% blocks executed 0%
    #####: 1776:{
        -: 1777:    int i;
        -: 1778:    virConnectPtr conn;
        -: 1779:
    #####: 1780:    if (domain == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1781:        TODO
call    0 never executed
    #####: 1782:	return (-1);
        -: 1783:    }
    #####: 1784:    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
    #####: 1785:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1786:        return (-1);
        -: 1787:    }
    #####: 1788:    if (domain->conn->flags & VIR_CONNECT_RO) {
branch  0 never executed
branch  1 never executed
    #####: 1789:        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
call    0 never executed
    #####: 1790:	return (-1);
        -: 1791:    }
        -: 1792:
    #####: 1793:    if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####: 1794:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1795:        return (-1);
        -: 1796:    }
    #####: 1797:    conn = domain->conn;
        -: 1798:
        -: 1799:    /*
        -: 1800:     * Go though the driver registered entry points
        -: 1801:     */
    #####: 1802:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1803:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1804:	    (conn->drivers[i]->domainPinVcpu != NULL)) {
    #####: 1805:	    if (conn->drivers[i]->domainPinVcpu(domain, vcpu,
call    0 never executed
branch  1 never executed
branch  2 never executed
        -: 1806:	                                        cpumap, maplen) == 0)
    #####: 1807:	        return(0);
        -: 1808:	}
        -: 1809:    }
    #####: 1810:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1811:    return (-1);
        -: 1812:}
        -: 1813:
        -: 1814:/**
        -: 1815: * virDomainGetVcpus:
        -: 1816: * @domain: pointer to domain object, or NULL for Domain0
        -: 1817: * @info: pointer to an array of virVcpuInfo structures (OUT)
        -: 1818: * @maxinfo: number of structures in info array
        -: 1819: * @cpumaps: pointer to an bit map of real CPUs for all vcpus of this
        -: 1820: *      domain (in 8-bit bytes) (OUT)
        -: 1821: *	If cpumaps is NULL, then no cupmap information is returned by the API.
        -: 1822: *	It's assumed there is <maxinfo> cpumap in cpumaps array.
        -: 1823: *	The memory allocated to cpumaps must be (maxinfo * maplen) bytes
        -: 1824: *	(ie: calloc(maxinfo, maplen)).
        -: 1825: *	One cpumap inside cpumaps has the format described in
        -: 1826: *      virDomainPinVcpu() API.
        -: 1827: * @maplen: number of bytes in one cpumap, from 1 up to size of CPU map in
        -: 1828: *	underlying virtualization system (Xen...).
        -: 1829: * 
        -: 1830: * Extract information about virtual CPUs of domain, store it in info array
        -: 1831: * and also in cpumaps if this pointer is'nt NULL.
        -: 1832: *
        -: 1833: * Returns the number of info filled in case of success, -1 in case of failure.
        -: 1834: */
        -: 1835:int
        -: 1836:virDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
        -: 1837:		  unsigned char *cpumaps, int maplen)
function virDomainGetVcpus called 0 returned 0% blocks executed 0%
    #####: 1838:{
        -: 1839:    int ret;
        -: 1840:    int i;
        -: 1841:    virConnectPtr conn;
        -: 1842:
    #####: 1843:    if (domain == NULL) {
branch  0 never executed
branch  1 never executed
    #####: 1844:        TODO
call    0 never executed
    #####: 1845:	return (-1);
        -: 1846:    }
    #####: 1847:    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
    #####: 1848:        virLibDomainError(domain, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
call    0 never executed
    #####: 1849:        return (-1);
        -: 1850:    }
    #####: 1851:    if ((info == NULL) || (maxinfo < 1)) {
branch  0 never executed
branch  1 never executed
    #####: 1852:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1853:        return (-1);
        -: 1854:    }
    #####: 1855:    if (cpumaps != NULL && maplen < 1) {
branch  0 never executed
branch  1 never executed
    #####: 1856:        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
call    0 never executed
    #####: 1857:        return (-1);
        -: 1858:    }
    #####: 1859:    conn = domain->conn;
        -: 1860:
        -: 1861:    /*
        -: 1862:     * Go though the driver registered entry points
        -: 1863:     */
    #####: 1864:    for (i = 0;i < conn->nb_drivers;i++) {
branch  0 never executed
branch  1 never executed
    #####: 1865:	if ((conn->drivers[i] != NULL) &&
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -: 1866:	    (conn->drivers[i]->domainGetVcpus != NULL)) {
    #####: 1867:	    ret = conn->drivers[i]->domainGetVcpus(domain, info, maxinfo,
call    0 never executed
        -: 1868:	                                           cpumaps, maplen);
    #####: 1869:	    if (ret >= 0)
branch  0 never executed
branch  1 never executed
    #####: 1870:	        return(ret);
        -: 1871:	}
        -: 1872:    }
    #####: 1873:    virLibConnError(conn, VIR_ERR_CALL_FAILED, __FUNCTION__);
call    0 never executed
    #####: 1874:    return (-1);
        -: 1875:}