Coverage report for src/virterror.c.gcov

        -:    0:Source:virterror.c
        -:    0:Graph:./libvirt_la-virterror.gcno
        -:    0:Data:./libvirt_la-virterror.gcda
        -:    0:Runs:2
        -:    0:Programs:2
        -:    1:/*
        -:    2: * virterror.c: implements error handling and reporting code for libvirt
        -:    3: *
        -:    4: * Copy:  Copyright (C) 2006 Red Hat, Inc.
        -:    5: *
        -:    6: * See COPYING.LIB for the License of this software
        -:    7: *
        -:    8: * Author: Daniel Veillard <veillard@redhat.com>
        -:    9: */
        -:   10:
        -:   11:#include <stdio.h>
        -:   12:#include <stdlib.h>
        -:   13:#include <string.h>
        -:   14:#include <stdarg.h>
        -:   15:#include "libvirt/libvirt.h"
        -:   16:#include "libvirt/virterror.h"
        -:   17:#include "internal.h"
        -:   18:
        -:   19:static virError lastErr =       /* the last error */
        -:   20:{ 0, 0, NULL, VIR_ERR_NONE, NULL, NULL, NULL, NULL, NULL, 0, 0 };
        -:   21:static virErrorFunc virErrorHandler = NULL;     /* global error handlet */
        -:   22:static void *virUserData = NULL;        /* associated data */
        -:   23:
        -:   24:/*
        -:   25: * Macro used to format the message as a string in __virRaiseError
        -:   26: * and borrowed from libxml2.
        -:   27: */
        -:   28:#define VIR_GET_VAR_STR(msg, str) {				\
        -:   29:    int       size, prev_size = -1;				\
        -:   30:    int       chars;						\
        -:   31:    char      *larger;						\
        -:   32:    va_list   ap;						\
        -:   33:								\
        -:   34:    str = (char *) malloc(150);					\
        -:   35:    if (str != NULL) {						\
        -:   36:								\
        -:   37:    size = 150;							\
        -:   38:								\
        -:   39:    while (1) {							\
        -:   40:	va_start(ap, msg);					\
        -:   41:  	chars = vsnprintf(str, size, msg, ap);			\
        -:   42:	va_end(ap);						\
        -:   43:	if ((chars > -1) && (chars < size)) {			\
        -:   44:	    if (prev_size == chars) {				\
        -:   45:		break;						\
        -:   46:	    } else {						\
        -:   47:		prev_size = chars;				\
        -:   48:	    }							\
        -:   49:	}							\
        -:   50:	if (chars > -1)						\
        -:   51:	    size += chars + 1;					\
        -:   52:	else							\
        -:   53:	    size += 100;					\
        -:   54:	if ((larger = (char *) realloc(str, size)) == NULL) {	\
        -:   55:	    break;						\
        -:   56:	}							\
        -:   57:	str = larger;						\
        -:   58:    }}								\
        -:   59:}
        -:   60:
        -:   61:/*
        -:   62: * virGetLastError:
        -:   63: *
        -:   64: * Provide a pointer to the last error caught at the library level
        -:   65: * Simpler but may not be suitable for multithreaded accesses, in which
        -:   66: * case use virCopyLastError()
        -:   67: *
        -:   68: * Returns a pointer to the last error or NULL if none occured.
        -:   69: */
        -:   70:virErrorPtr
        -:   71:virGetLastError(void)
function virGetLastError called 0 returned 0% blocks executed 0%
    #####:   72:{
    #####:   73:    if (lastErr.code == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:   74:        return (NULL);
    #####:   75:    return (&lastErr);
        -:   76:}
        -:   77:
        -:   78:/*
        -:   79: * virCopyLastError:
        -:   80: * @to: target to receive the copy
        -:   81: *
        -:   82: * Copy the content of the last error caught at the library level
        -:   83: * One will need to free the result with virResetError()
        -:   84: *
        -:   85: * Returns 0 if no error was found and the error code otherwise and -1 in case
        -:   86: *         of parameter error.
        -:   87: */
        -:   88:int
        -:   89:virCopyLastError(virErrorPtr to)
function virCopyLastError called 0 returned 0% blocks executed 0%
    #####:   90:{
    #####:   91:    if (to == NULL)
branch  0 never executed
branch  1 never executed
    #####:   92:        return (-1);
    #####:   93:    if (lastErr.code == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:   94:        return (0);
    #####:   95:    memcpy(to, &lastErr, sizeof(virError));
call    0 never executed
    #####:   96:    return (lastErr.code);
        -:   97:}
        -:   98:
        -:   99:/**
        -:  100: * virResetError:
        -:  101: * @err: pointer to the virError to clean up
        -:  102: * 
        -:  103: * Reset the error being pointed to
        -:  104: */
        -:  105:void
        -:  106:virResetError(virErrorPtr err)
function virResetError called 0 returned 0% blocks executed 0%
    #####:  107:{
    #####:  108:    if (err == NULL)
branch  0 never executed
branch  1 never executed
    #####:  109:        return;
    #####:  110:    if (err->message != NULL)
branch  0 never executed
branch  1 never executed
    #####:  111:        free(err->message);
call    0 never executed
    #####:  112:    if (err->str1 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  113:        free(err->str1);
call    0 never executed
    #####:  114:    if (err->str2 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  115:        free(err->str2);
call    0 never executed
    #####:  116:    if (err->str3 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  117:        free(err->str3);
call    0 never executed
    #####:  118:    memset(err, 0, sizeof(virError));
call    0 never executed
        -:  119:}
        -:  120:
        -:  121:/**
        -:  122: * virResetLastError:
        -:  123: * 
        -:  124: * Reset the last error caught at the library level.
        -:  125: */
        -:  126:void
        -:  127:virResetLastError(void)
function virResetLastError called 0 returned 0% blocks executed 0%
    #####:  128:{
    #####:  129:    virResetError(&lastErr);
call    0 never executed
    #####:  130:}
        -:  131:
        -:  132:/**
        -:  133: * virConnGetLastError:
        -:  134: * @conn: pointer to the hypervisor connection
        -:  135: *
        -:  136: * Provide a pointer to the last error caught on that connection
        -:  137: * Simpler but may not be suitable for multithreaded accesses, in which
        -:  138: * case use virConnCopyLastError()
        -:  139: *
        -:  140: * Returns a pointer to the last error or NULL if none occured.
        -:  141: */
        -:  142:virErrorPtr
        -:  143:virConnGetLastError(virConnectPtr conn)
function virConnGetLastError called 0 returned 0% blocks executed 0%
    #####:  144:{
    #####:  145:    if (conn == NULL)
branch  0 never executed
branch  1 never executed
    #####:  146:        return (NULL);
    #####:  147:    return (&conn->err);
        -:  148:}
        -:  149:
        -:  150:/**
        -:  151: * virConnCopyLastError:
        -:  152: * @conn: pointer to the hypervisor connection
        -:  153: * @to: target to receive the copy
        -:  154: *
        -:  155: * Copy the content of the last error caught on that connection
        -:  156: * One will need to free the result with virResetError()
        -:  157: *
        -:  158: * Returns 0 if no error was found and the error code otherwise and -1 in case
        -:  159: *         of parameter error.
        -:  160: */
        -:  161:int
        -:  162:virConnCopyLastError(virConnectPtr conn, virErrorPtr to)
function virConnCopyLastError called 0 returned 0% blocks executed 0%
    #####:  163:{
    #####:  164:    if (conn == NULL)
branch  0 never executed
branch  1 never executed
    #####:  165:        return (-1);
    #####:  166:    if (to == NULL)
branch  0 never executed
branch  1 never executed
    #####:  167:        return (-1);
    #####:  168:    if (conn->err.code == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:  169:        return (0);
    #####:  170:    memcpy(to, &conn->err, sizeof(virError));
call    0 never executed
    #####:  171:    return (conn->err.code);
        -:  172:}
        -:  173:
        -:  174:/**
        -:  175: * virConnResetLastError:
        -:  176: * @conn: pointer to the hypervisor connection
        -:  177: *
        -:  178: * Reset the last error caught on that connection
        -:  179: */
        -:  180:void
        -:  181:virConnResetLastError(virConnectPtr conn)
function virConnResetLastError called 0 returned 0% blocks executed 0%
    #####:  182:{
    #####:  183:    if (conn == NULL)
branch  0 never executed
branch  1 never executed
    #####:  184:        return;
    #####:  185:    virResetError(&conn->err);
call    0 never executed
        -:  186:}
        -:  187:
        -:  188:/**
        -:  189: * virSetErrorFunc:
        -:  190: * @userData: pointer to the user data provided in the handler callback
        -:  191: * @handler: the function to get called in case of error or NULL
        -:  192: *
        -:  193: * Set a library global error handling function, if @handler is NULL,
        -:  194: * it will reset to default printing on stderr. The error raised there
        -:  195: * are those for which no handler at the connection level could caught.
        -:  196: */
        -:  197:void
        -:  198:virSetErrorFunc(void *userData, virErrorFunc handler)
function virSetErrorFunc called 0 returned 0% blocks executed 0%
    #####:  199:{
    #####:  200:    virErrorHandler = handler;
    #####:  201:    virUserData = userData;
    #####:  202:}
        -:  203:
        -:  204:/**
        -:  205: * virConnSetErrorFunc:
        -:  206: * @conn: pointer to the hypervisor connection
        -:  207: * @userData: pointer to the user data provided in the handler callback
        -:  208: * @handler: the function to get called in case of error or NULL
        -:  209: *
        -:  210: * Set a connection error handling function, if @handler is NULL
        -:  211: * it will reset to default which is to pass error back to the global
        -:  212: * library handler.
        -:  213: */
        -:  214:void
        -:  215:virConnSetErrorFunc(virConnectPtr conn, void *userData,
        -:  216:                    virErrorFunc handler)
function virConnSetErrorFunc called 0 returned 0% blocks executed 0%
    #####:  217:{
    #####:  218:    if (conn == NULL)
branch  0 never executed
branch  1 never executed
    #####:  219:        return;
    #####:  220:    conn->handler = handler;
    #####:  221:    conn->userData = userData;
        -:  222:}
        -:  223:
        -:  224:/**
        -:  225: * virDefaultErrorFunc:
        -:  226: * @err: pointer to the error.
        -:  227: *
        -:  228: * Default routine reporting an error to stderr.
        -:  229: */
        -:  230:void
        -:  231:virDefaultErrorFunc(virErrorPtr err)
function virDefaultErrorFunc called 0 returned 0% blocks executed 0%
    #####:  232:{
    #####:  233:    const char *lvl = "", *dom = "", *domain = "";
        -:  234:    int len;
        -:  235:
    #####:  236:    if ((err == NULL) || (err->code == VIR_ERR_OK))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  237:        return;
    #####:  238:    switch (err->level) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
        -:  239:        case VIR_ERR_NONE:
    #####:  240:            lvl = "";
    #####:  241:            break;
        -:  242:        case VIR_ERR_WARNING:
    #####:  243:            lvl = "warning";
    #####:  244:            break;
        -:  245:        case VIR_ERR_ERROR:
    #####:  246:            lvl = "error";
        -:  247:            break;
        -:  248:    }
    #####:  249:    switch (err->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
        -:  250:        case VIR_FROM_NONE:
    #####:  251:            dom = "";
    #####:  252:            break;
        -:  253:        case VIR_FROM_XEN:
    #####:  254:            dom = "Xen ";
    #####:  255:            break;
        -:  256:        case VIR_FROM_XEND:
    #####:  257:            dom = "Xen Daemon ";
    #####:  258:            break;
        -:  259:        case VIR_FROM_XENSTORE:
    #####:  260:            dom = "Xen Store ";
    #####:  261:            break;
        -:  262:        case VIR_FROM_DOM:
    #####:  263:            dom = "Domain ";
    #####:  264:            break;
        -:  265:        case VIR_FROM_RPC:
    #####:  266:            dom = "XML-RPC ";
        -:  267:            break;
        -:  268:    }
    #####:  269:    if ((err->dom != NULL) && (err->code != VIR_ERR_INVALID_DOMAIN)) {
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  270:        domain = err->dom->name;
        -:  271:    }
    #####:  272:    len = strlen(err->message);
call    0 never executed
    #####:  273:    if ((len == 0) || (err->message[len - 1] != '\n'))
branch  0 never executed
branch  1 never executed
branch  2 never executed
branch  3 never executed
    #####:  274:        fprintf(stderr, "libvir: %s%s %s: %s\n",
call    0 never executed
        -:  275:                dom, lvl, domain, err->message);
        -:  276:    else
    #####:  277:        fprintf(stderr, "libvir: %s%s %s: %s",
call    0 never executed
        -:  278:                dom, lvl, domain, err->message);
        -:  279:}
        -:  280:
        -:  281:/**
        -:  282: * __virRaiseError:
        -:  283: * @conn: the connection to the hypervisor if available
        -:  284: * @dom: the domain if available
        -:  285: * @domain: the virErrorDomain indicating where it's coming from
        -:  286: * @code: the virErrorNumber code for the error
        -:  287: * @level: the virErrorLevel for the error
        -:  288: * @str1: extra string info
        -:  289: * @str2: extra string info
        -:  290: * @str3: extra string info
        -:  291: * @int1: extra int info
        -:  292: * @int2: extra int info
        -:  293: * @msg:  the message to display/transmit
        -:  294: * @...:  extra parameters for the message display
        -:  295: *
        -:  296: * Internal routine called when an error is detected. It will raise it
        -:  297: * immediately if a callback is found and store it for later handling.
        -:  298: */
        -:  299:void
        -:  300:__virRaiseError(virConnectPtr conn, virDomainPtr dom,
        -:  301:                int domain, int code, virErrorLevel level,
        -:  302:                const char *str1, const char *str2, const char *str3,
        -:  303:                int int1, int int2, const char *msg, ...)
function __virRaiseError called 0 returned 0% blocks executed 0%
    #####:  304:{
    #####:  305:    virErrorPtr to = &lastErr;
    #####:  306:    void *userData = virUserData;
    #####:  307:    virErrorFunc handler = virErrorHandler;
        -:  308:    char *str;
        -:  309:
    #####:  310:    if (code == VIR_ERR_OK)
branch  0 never executed
branch  1 never executed
    #####:  311:        return;
        -:  312:
        -:  313:    /*
        -:  314:     * try to find the best place to save and report the error
        -:  315:     */
    #####:  316:    if (conn != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  317:        to = &conn->err;
    #####:  318:        if (conn->handler != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  319:            handler = conn->handler;
    #####:  320:            userData = conn->userData;
        -:  321:        }
        -:  322:    }
        -:  323:
        -:  324:    /*
        -:  325:     * formats the message
        -:  326:     */
    #####:  327:    if (msg == NULL) {
branch  0 never executed
branch  1 never executed
    #####:  328:        str = strdup("No error message provided");
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
        -:  329:    } else {
    #####:  330:        VIR_GET_VAR_STR(msg, str);
call    0 never executed
branch  1 never executed
branch  2 never executed
call    3 never executed
call    4 never executed
call    5 never executed
branch  6 never executed
branch  7 never executed
branch  8 never executed
branch  9 never executed
branch 10 never executed
branch 11 never executed
call   12 never executed
branch 13 never executed
branch 14 never executed
        -:  331:    }
        -:  332:
        -:  333:    /*
        -:  334:     * Save the information about the error
        -:  335:     */
    #####:  336:    virResetError(to);
call    0 never executed
    #####:  337:    to->conn = conn;
    #####:  338:    to->dom = dom;
    #####:  339:    to->domain = domain;
    #####:  340:    to->code = code;
    #####:  341:    to->message = str;
    #####:  342:    to->level = level;
    #####:  343:    if (str1 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  344:        to->str1 = strdup(str1);
call    0 never executed
    #####:  345:    if (str2 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  346:        to->str2 = strdup(str2);
call    0 never executed
    #####:  347:    if (str3 != NULL)
branch  0 never executed
branch  1 never executed
    #####:  348:        to->str3 = strdup(str3);
call    0 never executed
    #####:  349:    to->int1 = int1;
    #####:  350:    to->int2 = int2;
        -:  351:
        -:  352:    /*
        -:  353:     * now, report it
        -:  354:     */
    #####:  355:    if (handler != NULL) {
branch  0 never executed
branch  1 never executed
    #####:  356:        handler(userData, to);
call    0 never executed
        -:  357:    } else {
    #####:  358:        virDefaultErrorFunc(to);
call    0 never executed
        -:  359:    }
        -:  360:}
        -:  361:
        -:  362:/**
        -:  363: * __virErrorMsg:
        -:  364: * @error: the virErrorNumber
        -:  365: * @info: usually the first paprameter string
        -:  366: *
        -:  367: * Internal routine to get the message associated to an error raised
        -:  368: * from the library
        -:  369: *
        -:  370: * Returns the constant string associated to @error
        -:  371: */
        -:  372:const char *
        -:  373:__virErrorMsg(virErrorNumber error, const char *info)
function __virErrorMsg called 0 returned 0% blocks executed 0%
    #####:  374:{
    #####:  375:    const char *errmsg = NULL;
        -:  376:
    #####:  377:    switch (error) {
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
branch  8 never executed
branch  9 never executed
branch 10 never executed
branch 11 never executed
branch 12 never executed
branch 13 never executed
branch 14 never executed
branch 15 never executed
branch 16 never executed
branch 17 never executed
branch 18 never executed
branch 19 never executed
branch 20 never executed
branch 21 never executed
branch 22 never executed
branch 23 never executed
branch 24 never executed
branch 25 never executed
branch 26 never executed
branch 27 never executed
branch 28 never executed
branch 29 never executed
branch 30 never executed
        -:  378:        case VIR_ERR_OK:
    #####:  379:            return (NULL);
        -:  380:        case VIR_ERR_INTERNAL_ERROR:
    #####:  381:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  382:                errmsg = "internal error %s";
        -:  383:            else
    #####:  384:                errmsg = "internal error";
        -:  385:            break;
        -:  386:        case VIR_ERR_NO_MEMORY:
    #####:  387:            errmsg = "out of memory";
    #####:  388:            break;
        -:  389:        case VIR_ERR_NO_SUPPORT:
    #####:  390:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  391:		errmsg = "no support for hypervisor";
        -:  392:	    else
    #####:  393:		errmsg = "no support for hypervisor %s";
        -:  394:            break;
        -:  395:        case VIR_ERR_NO_CONNECT:
    #####:  396:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  397:                errmsg = "could not connect to hypervisor";
        -:  398:            else
    #####:  399:                errmsg = "could not connect to %s";
        -:  400:            break;
        -:  401:        case VIR_ERR_INVALID_CONN:
    #####:  402:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  403:		errmsg = "invalid connection pointer in";
        -:  404:	    else
    #####:  405:		errmsg = "invalid connection pointer in %s";
        -:  406:            break;
        -:  407:        case VIR_ERR_INVALID_DOMAIN:
    #####:  408:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  409:		errmsg = "invalid domain pointer in";
        -:  410:	    else
    #####:  411:	        errmsg = "invalid domain pointer in %s";
        -:  412:            break;
        -:  413:        case VIR_ERR_INVALID_ARG:
    #####:  414:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  415:		errmsg = "invalid argument in";
        -:  416:	    else
    #####:  417:		errmsg = "invalid argument in %s";
        -:  418:            break;
        -:  419:        case VIR_ERR_OPERATION_FAILED:
    #####:  420:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  421:                errmsg = "operation failed: %s";
        -:  422:            else
    #####:  423:                errmsg = "operation failed";
        -:  424:            break;
        -:  425:        case VIR_ERR_GET_FAILED:
    #####:  426:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  427:                errmsg = "GET operation failed: %s";
        -:  428:            else
    #####:  429:                errmsg = "GET operation failed";
        -:  430:            break;
        -:  431:        case VIR_ERR_POST_FAILED:
    #####:  432:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  433:                errmsg = "POST operation failed: %s";
        -:  434:            else
    #####:  435:                errmsg = "POST operation failed";
        -:  436:            break;
        -:  437:        case VIR_ERR_HTTP_ERROR:
    #####:  438:            errmsg = "got unknown HTTP error code %d";
    #####:  439:            break;
        -:  440:        case VIR_ERR_UNKNOWN_HOST:
    #####:  441:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  442:		errmsg = "unknown host %s";
        -:  443:	    else
    #####:  444:		errmsg = "unknown host";
        -:  445:            break;
        -:  446:        case VIR_ERR_SEXPR_SERIAL:
    #####:  447:            if (info != NULL)
branch  0 never executed
branch  1 never executed
    #####:  448:                errmsg = "failed to serialize S-Expr: %s";
        -:  449:            else
    #####:  450:                errmsg = "failed to serialize S-Expr";
        -:  451:            break;
        -:  452:        case VIR_ERR_NO_XEN:
    #####:  453:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  454:                errmsg = "could not use Xen hypervisor entry";
        -:  455:            else
    #####:  456:                errmsg = "could not use Xen hypervisor entry %s";
        -:  457:            break;
        -:  458:	case VIR_ERR_NO_XENSTORE:
    #####:  459:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  460:                errmsg = "could not connect to Xen Store";
        -:  461:            else
    #####:  462:                errmsg = "could not connect to Xen Store %s";
        -:  463:            break;
        -:  464:        case VIR_ERR_XEN_CALL:
    #####:  465:            errmsg = "failed Xen syscall %s %d";
    #####:  466:            break;
        -:  467:        case VIR_ERR_OS_TYPE:
    #####:  468:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  469:                errmsg = "unknown OS type";
        -:  470:            else
    #####:  471:                errmsg = "unknown OS type %s";
        -:  472:            break;
        -:  473:        case VIR_ERR_NO_KERNEL:
    #####:  474:            errmsg = "missing kernel information";
    #####:  475:            break;
        -:  476:        case VIR_ERR_NO_ROOT:
    #####:  477:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  478:                errmsg = "missing root device information";
        -:  479:            else
    #####:  480:                errmsg = "missing root device information in %s";
        -:  481:            break;
        -:  482:        case VIR_ERR_NO_SOURCE:
    #####:  483:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  484:                errmsg = "missing source information for device";
        -:  485:            else
    #####:  486:                errmsg = "missing source information for device %s";
        -:  487:            break;
        -:  488:        case VIR_ERR_NO_TARGET:
    #####:  489:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  490:                errmsg = "missing target information for device";
        -:  491:            else
    #####:  492:                errmsg = "missing target information for device %s";
        -:  493:            break;
        -:  494:        case VIR_ERR_NO_NAME:
    #####:  495:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  496:                errmsg = "missing domain name information";
        -:  497:            else
    #####:  498:                errmsg = "missing domain name information in %s";
        -:  499:            break;
        -:  500:        case VIR_ERR_NO_OS:
    #####:  501:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  502:                errmsg = "missing operating system information";
        -:  503:            else
    #####:  504:                errmsg = "missing operating system information for %s";
        -:  505:            break;
        -:  506:        case VIR_ERR_NO_DEVICE:
    #####:  507:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  508:                errmsg = "missing devices information";
        -:  509:            else
    #####:  510:                errmsg = "missing devices information for %s";
        -:  511:            break;
        -:  512:        case VIR_ERR_DRIVER_FULL:
    #####:  513:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  514:                errmsg = "too many drivers registered";
        -:  515:            else
    #####:  516:                errmsg = "too many drivers registered in %s";
        -:  517:            break;
        -:  518:        case VIR_ERR_CALL_FAILED:
    #####:  519:            if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  520:                errmsg = "library call failed, possibly not supported";
        -:  521:            else
    #####:  522:                errmsg = "library call %s failed, possibly not supported";
        -:  523:            break;
        -:  524:	case VIR_ERR_XML_ERROR:
    #####:  525:	    if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  526:	        errmsg = "XML description not well formed or invalid";
        -:  527:	    else
    #####:  528:	        errmsg = "XML description for %s is not well formed or invalid";
        -:  529:            break;
        -:  530:	case VIR_ERR_DOM_EXIST:
    #####:  531:	    if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  532:	        errmsg = "this domain exists already";
        -:  533:	    else
    #####:  534:	        errmsg = "domain %s exists already";
        -:  535:            break;
        -:  536:	case VIR_ERR_OPERATION_DENIED:
    #####:  537:	    if (info == NULL)
branch  0 never executed
branch  1 never executed
    #####:  538:	        errmsg = "operation forbidden for read only access";
        -:  539:	    else
    #####:  540:	        errmsg = "operation %s forbidden for read only access";
        -:  541:            break;
        -:  542:    }
    #####:  543:    return (errmsg);
        -:  544:}