qemu_monitor.c 94.0 KB
Newer Older
1 2 3
/*
 * qemu_monitor.c: interaction with QEMU monitor console
 *
4
 * Copyright (C) 2006-2015 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23 24 25 26
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

#include <config.h>

#include <poll.h>
27
#include <sys/socket.h>
28 29 30 31 32
#include <sys/un.h>
#include <unistd.h>
#include <fcntl.h>

#include "qemu_monitor.h"
33
#include "qemu_monitor_text.h"
D
Daniel P. Berrange 已提交
34
#include "qemu_monitor_json.h"
35 36
#include "qemu_domain.h"
#include "qemu_process.h"
37
#include "virerror.h"
38
#include "viralloc.h"
39
#include "virlog.h"
E
Eric Blake 已提交
40
#include "virfile.h"
41
#include "virprocess.h"
42
#include "virobject.h"
43
#include "virprobe.h"
44
#include "virstring.h"
45

46 47 48 49
#ifdef WITH_DTRACE_PROBES
# include "libvirt_qemu_probes.h"
#endif

50 51
#define VIR_FROM_THIS VIR_FROM_QEMU

52 53
VIR_LOG_INIT("qemu.qemu_monitor");

54 55
#define DEBUG_IO 0
#define DEBUG_RAW_IO 0
56

57
struct _qemuMonitor {
58
    virObjectLockable parent;
59

60 61
    virCond notify;

62 63 64 65 66 67
    int fd;
    int watch;
    int hasSendFD;

    virDomainObjPtr vm;

68
    qemuMonitorCallbacksPtr cb;
69
    void *callbackOpaque;
70 71 72 73 74 75 76 77 78 79 80 81 82

    /* If there's a command being processed this will be
     * non-NULL */
    qemuMonitorMessagePtr msg;

    /* Buffer incoming data ready for Text/QMP monitor
     * code to process & find message boundaries */
    size_t bufferOffset;
    size_t bufferLength;
    char *buffer;

    /* If anything went wrong, this will be fed back
     * the next monitor msg */
83 84 85
    virError lastError;

    int nextSerial;
86

E
Eric Blake 已提交
87 88
    bool json;
    bool waitGreeting;
89 90 91

    /* cache of query-command-line-options results */
    virJSONValuePtr options;
92 93 94 95

    /* If found, path to the virtio memballoon driver */
    char *balloonpath;
    bool ballooninit;
96

97 98 99 100
    /* Log file context of the qemu process to dig for usable info */
    qemuMonitorReportDomainLogError logFunc;
    void *logOpaque;
    virFreeCallback logDestroy;
101 102
};

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
/**
 * QEMU_CHECK_MONITOR_FULL:
 * @mon: monitor pointer variable to check, evaluated multiple times, no parentheses
 * @force_json: force JSON monitor, true or false
 * @exit: statement that is used to exit the function
 *
 * This macro checks that the monitor is valid for given operation and exits
 * the function if not. The macro also adds a debug statement regarding the
 * monitor.
 */
#define QEMU_CHECK_MONITOR_FULL(mon, force_json, exit)                         \
    if (!mon) {                                                                \
        virReportError(VIR_ERR_INVALID_ARG, "%s",                              \
                       _("monitor must not be NULL"));                         \
        exit;                                                                  \
    }                                                                          \
    VIR_DEBUG("mon:%p vm:%p json:%d fd:%d", mon, mon->vm, mon->json, mon->fd); \
    if (force_json && !mon->json) {                                            \
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",                    \
                       _("JSON monitor is required"));                         \
        exit;                                                                  \
    }

/* Check monitor and return NULL on error */
#define QEMU_CHECK_MONITOR_NULL(mon) \
    QEMU_CHECK_MONITOR_FULL(mon, false, return NULL)
#define QEMU_CHECK_MONITOR_JSON_NULL(mon) \
    QEMU_CHECK_MONITOR_FULL(mon, true, return NULL)

/* Check monitor and return -1 on error */
#define QEMU_CHECK_MONITOR(mon) \
    QEMU_CHECK_MONITOR_FULL(mon, false, return -1)
#define QEMU_CHECK_MONITOR_JSON(mon) \
    QEMU_CHECK_MONITOR_FULL(mon, true, return -1)

/* Check monitor and jump to the provided label */
#define QEMU_CHECK_MONITOR_GOTO(mon, label) \
    QEMU_CHECK_MONITOR_FULL(mon, false, goto label)
#define QEMU_CHECK_MONITOR_JSON_GOTO(mon, label) \
    QEMU_CHECK_MONITOR_FULL(mon, true, goto label)

144 145 146 147 148
static virClassPtr qemuMonitorClass;
static void qemuMonitorDispose(void *obj);

static int qemuMonitorOnceInit(void)
{
149
    if (!(qemuMonitorClass = virClassNew(virClassForObjectLockable(),
150 151 152
                                         "qemuMonitor",
                                         sizeof(qemuMonitor),
                                         qemuMonitorDispose)))
153 154 155 156 157 158 159
        return -1;

    return 0;
}

VIR_ONCE_GLOBAL_INIT(qemuMonitor)

160

161 162
VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
              QEMU_MONITOR_MIGRATION_STATUS_LAST,
163 164 165 166
              "inactive", "setup",
              "active",
              "completed", "failed",
              "cancelling", "cancelled")
167

168 169
VIR_ENUM_IMPL(qemuMonitorMigrationCaps,
              QEMU_MONITOR_MIGRATION_CAPS_LAST,
170
              "xbzrle", "auto-converge", "rdma-pin-all", "events")
171

172 173 174 175
VIR_ENUM_IMPL(qemuMonitorVMStatus,
              QEMU_MONITOR_VM_STATUS_LAST,
              "debug", "inmigrate", "internal-error", "io-error", "paused",
              "postmigrate", "prelaunch", "finish-migrate", "restore-vm",
176
              "running", "save-vm", "shutdown", "watchdog", "guest-panicked")
177

178 179 180 181 182 183 184 185 186 187 188 189 190 191
typedef enum {
    QEMU_MONITOR_BLOCK_IO_STATUS_OK,
    QEMU_MONITOR_BLOCK_IO_STATUS_FAILED,
    QEMU_MONITOR_BLOCK_IO_STATUS_NOSPACE,

    QEMU_MONITOR_BLOCK_IO_STATUS_LAST
} qemuMonitorBlockIOStatus;

VIR_ENUM_DECL(qemuMonitorBlockIOStatus)

VIR_ENUM_IMPL(qemuMonitorBlockIOStatus,
              QEMU_MONITOR_BLOCK_IO_STATUS_LAST,
              "ok", "failed", "nospace")

192 193
char *
qemuMonitorEscapeArg(const char *in)
194 195
{
    int len = 0;
196
    size_t i, j;
197 198 199 200 201 202 203
    char *out;

    /* To pass through the QEMU monitor, we need to use escape
       sequences: \r, \n, \", \\
    */

    for (i = 0; in[i] != '\0'; i++) {
204
        switch (in[i]) {
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
        case '\r':
        case '\n':
        case '"':
        case '\\':
            len += 2;
            break;
        default:
            len += 1;
            break;
        }
    }

    if (VIR_ALLOC_N(out, len + 1) < 0)
        return NULL;

    for (i = j = 0; in[i] != '\0'; i++) {
221
        switch (in[i]) {
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
        case '\r':
            out[j++] = '\\';
            out[j++] = 'r';
            break;
        case '\n':
            out[j++] = '\\';
            out[j++] = 'n';
            break;
        case '"':
        case '\\':
            out[j++] = '\\';
            out[j++] = in[i];
            break;
        default:
            out[j++] = in[i];
            break;
        }
    }
    out[j] = '\0';

    return out;
}

245 246 247

char *
qemuMonitorUnescapeArg(const char *in)
248
{
249
    size_t i, j;
250
    char *out;
251
    int len = strlen(in);
252 253
    char next;

254
    if (VIR_ALLOC_N(out, len + 1) < 0)
255 256 257 258 259 260
        return NULL;

    for (i = j = 0; i < len; ++i) {
        next = in[i];
        if (in[i] == '\\') {
            ++i;
261
            switch (in[i]) {
262 263 264 265 266 267 268 269 270 271 272
            case 'r':
                next = '\r';
                break;
            case 'n':
                next = '\n';
                break;
            case '"':
            case '\\':
                next = in[i];
                break;
            default:
273
                /* invalid input (including trailing '\' at end of in) */
274 275 276 277 278 279 280 281 282 283 284
                VIR_FREE(out);
                return NULL;
            }
        }
        out[j++] = next;
    }
    out[j] = '\0';

    return out;
}

285

J
Jiri Denemark 已提交
286
#if DEBUG_RAW_IO
287
# include <c-ctype.h>
288 289
static char *
qemuMonitorEscapeNonPrintable(const char *text)
290
{
291
    size_t i;
292
    virBuffer buf = VIR_BUFFER_INITIALIZER;
293
    for (i = 0; text[i] != '\0'; i++) {
294 295
        if (c_isprint(text[i]) ||
            text[i] == '\n' ||
E
Eric Blake 已提交
296 297
            (text[i] == '\r' && text[i + 1] == '\n'))
            virBufferAddChar(&buf, text[i]);
298
        else
299
            virBufferAsprintf(&buf, "0x%02x", text[i]);
300 301 302 303 304
    }
    return virBufferContentAndReset(&buf);
}
#endif

305 306 307

static void
qemuMonitorDispose(void *obj)
308
{
309 310
    qemuMonitorPtr mon = obj;

311
    VIR_DEBUG("mon=%p", mon);
312
    if (mon->cb && mon->cb->destroy)
313
        (mon->cb->destroy)(mon, mon->vm, mon->callbackOpaque);
314 315
    virObjectUnref(mon->vm);

316
    virResetError(&mon->lastError);
317
    virCondDestroy(&mon->notify);
E
Eric Blake 已提交
318
    VIR_FREE(mon->buffer);
319
    virJSONValueFree(mon->options);
320
    VIR_FREE(mon->balloonpath);
321 322 323 324
}


static int
325
qemuMonitorOpenUnix(const char *monitor, pid_t cpid)
326 327 328
{
    struct sockaddr_un addr;
    int monfd;
329
    int timeout = 30; /* In seconds */
330 331
    int ret;
    size_t i = 0;
332 333

    if ((monfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
334
        virReportSystemError(errno,
335 336 337 338 339 340 341
                             "%s", _("failed to create socket"));
        return -1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    if (virStrcpyStatic(addr.sun_path, monitor) == NULL) {
342 343
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Monitor path %s too big for destination"), monitor);
344 345 346 347 348 349 350 351 352
        goto error;
    }

    do {
        ret = connect(monfd, (struct sockaddr *) &addr, sizeof(addr));

        if (ret == 0)
            break;

353
        if ((errno == ENOENT || errno == ECONNREFUSED) &&
354
            (!cpid || virProcessKill(cpid, 0) == 0)) {
355 356 357 358 359
            /* ENOENT       : Socket may not have shown up yet
             * ECONNREFUSED : Leftover socket hasn't been removed yet */
            continue;
        }

360
        virReportSystemError(errno, "%s",
361 362 363 364 365 366
                             _("failed to connect to monitor socket"));
        goto error;

    } while ((++i <= timeout*5) && (usleep(.2 * 1000000) <= 0));

    if (ret != 0) {
367
        virReportSystemError(errno, "%s",
368
                             _("monitor socket did not show up"));
369 370 371
        goto error;
    }

372
    return monfd;
373

374
 error:
375
    VIR_FORCE_CLOSE(monfd);
376 377 378
    return -1;
}

379

380
static int
381
qemuMonitorOpenPty(const char *monitor)
382 383 384 385
{
    int monfd;

    if ((monfd = open(monitor, O_RDWR)) < 0) {
386 387
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Unable to open monitor path %s"), monitor);
388 389 390
        return -1;
    }

391
    return monfd;
392
}
393

394

395 396 397 398
/* This method processes data that has been received
 * from the monitor. Looking for async events and
 * replies/errors.
 */
399 400 401 402 403 404 405 406 407 408 409
static int
qemuMonitorIOProcess(qemuMonitorPtr mon)
{
    int len;
    qemuMonitorMessagePtr msg = NULL;

    /* See if there's a message & whether its ready for its reply
     * ie whether its completed writing all its data */
    if (mon->msg && mon->msg->txOffset == mon->msg->txLength)
        msg = mon->msg;

410
#if DEBUG_IO
411
# if DEBUG_RAW_IO
412 413
    char *str1 = qemuMonitorEscapeNonPrintable(msg ? msg->txBuffer : "");
    char *str2 = qemuMonitorEscapeNonPrintable(mon->buffer);
414
    VIR_ERROR(_("Process %d %p %p [[[[%s]]][[[%s]]]"), (int)mon->bufferOffset, mon->msg, msg, str1, str2);
415 416
    VIR_FREE(str1);
    VIR_FREE(str2);
417
# else
418
    VIR_DEBUG("Process %d", (int)mon->bufferOffset);
419
# endif
420 421
#endif

422 423 424
    PROBE(QEMU_MONITOR_IO_PROCESS,
          "mon=%p buf=%s len=%zu", mon, mon->buffer, mon->bufferOffset);

D
Daniel P. Berrange 已提交
425 426 427 428 429 430 431 432
    if (mon->json)
        len = qemuMonitorJSONIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
    else
        len = qemuMonitorTextIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
433

434
    if (len < 0)
435 436
        return -1;

E
Eric Blake 已提交
437 438
    if (len && mon->waitGreeting)
        mon->waitGreeting = false;
439

440 441 442 443 444 445 446
    if (len < mon->bufferOffset) {
        memmove(mon->buffer, mon->buffer + len, mon->bufferOffset - len);
        mon->bufferOffset -= len;
    } else {
        VIR_FREE(mon->buffer);
        mon->bufferOffset = mon->bufferLength = 0;
    }
447
#if DEBUG_IO
448
    VIR_DEBUG("Process done %d used %d", (int)mon->bufferOffset, len);
449
#endif
450 451 452 453 454 455
    if (msg && msg->finished)
        virCondBroadcast(&mon->notify);
    return len;
}


S
Stefan Berger 已提交
456
/* Call this function while holding the monitor lock. */
457 458 459 460 461 462 463 464 465 466 467 468 469
static int
qemuMonitorIOWriteWithFD(qemuMonitorPtr mon,
                         const char *data,
                         size_t len,
                         int fd)
{
    struct msghdr msg;
    struct iovec iov[1];
    int ret;
    char control[CMSG_SPACE(sizeof(int))];
    struct cmsghdr *cmsg;

    memset(&msg, 0, sizeof(msg));
470
    memset(control, 0, sizeof(control));
471 472 473 474 475 476 477 478 479 480 481

    iov[0].iov_base = (void *)data;
    iov[0].iov_len = len;

    msg.msg_iov = iov;
    msg.msg_iovlen = 1;

    msg.msg_control = control;
    msg.msg_controllen = sizeof(control);

    cmsg = CMSG_FIRSTHDR(&msg);
482 483 484
    /* Some static analyzers, like clang 2.6-0.6.pre2, fail to see
       that our use of CMSG_FIRSTHDR will not return NULL.  */
    sa_assert(cmsg);
485 486 487 488 489 490 491 492 493 494 495 496
    cmsg->cmsg_len = CMSG_LEN(sizeof(int));
    cmsg->cmsg_level = SOL_SOCKET;
    cmsg->cmsg_type = SCM_RIGHTS;
    memcpy(CMSG_DATA(cmsg), &fd, sizeof(int));

    do {
        ret = sendmsg(mon->fd, &msg, 0);
    } while (ret < 0 && errno == EINTR);

    return ret;
}

497

S
Stefan Berger 已提交
498 499 500 501
/*
 * Called when the monitor is able to write data
 * Call this function while holding the monitor lock.
 */
502 503 504 505
static int
qemuMonitorIOWrite(qemuMonitorPtr mon)
{
    int done;
J
John Ferlan 已提交
506 507
    char *buf;
    size_t len;
508 509 510 511 512

    /* If no active message, or fully transmitted, the no-op */
    if (!mon->msg || mon->msg->txOffset == mon->msg->txLength)
        return 0;

513
    if (mon->msg->txFD != -1 && !mon->hasSendFD) {
514 515
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Monitor does not support sending of file descriptors"));
516 517 518
        return -1;
    }

J
John Ferlan 已提交
519 520
    buf = mon->msg->txBuffer + mon->msg->txOffset;
    len = mon->msg->txLength - mon->msg->txOffset;
521
    if (mon->msg->txFD == -1)
J
John Ferlan 已提交
522
        done = write(mon->fd, buf, len);
523
    else
J
John Ferlan 已提交
524
        done = qemuMonitorIOWriteWithFD(mon, buf, len, mon->msg->txFD);
525

526
    PROBE(QEMU_MONITOR_IO_WRITE,
527
          "mon=%p buf=%s len=%zu ret=%d errno=%d",
J
John Ferlan 已提交
528
          mon, buf, len, done, errno);
529

530
    if (mon->msg->txFD != -1) {
531 532 533
        PROBE(QEMU_MONITOR_IO_SEND_FD,
              "mon=%p fd=%d ret=%d errno=%d",
              mon, mon->msg->txFD, done, errno);
534
    }
535

536 537 538 539
    if (done < 0) {
        if (errno == EAGAIN)
            return 0;

540 541
        virReportSystemError(errno, "%s",
                             _("Unable to write to monitor"));
542 543 544 545 546 547
        return -1;
    }
    mon->msg->txOffset += done;
    return done;
}

548

549 550
/*
 * Called when the monitor has incoming data to read
S
Stefan Berger 已提交
551
 * Call this function while holding the monitor lock.
552 553 554 555 556 557 558 559 560 561 562
 *
 * Returns -1 on error, or number of bytes read
 */
static int
qemuMonitorIORead(qemuMonitorPtr mon)
{
    size_t avail = mon->bufferLength - mon->bufferOffset;
    int ret = 0;

    if (avail < 1024) {
        if (VIR_REALLOC_N(mon->buffer,
563
                          mon->bufferLength + 1024) < 0)
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578
            return -1;
        mon->bufferLength += 1024;
        avail += 1024;
    }

    /* Read as much as we can get into our buffer,
       until we block on EAGAIN, or hit EOF */
    while (avail > 1) {
        int got;
        got = read(mon->fd,
                   mon->buffer + mon->bufferOffset,
                   avail - 1);
        if (got < 0) {
            if (errno == EAGAIN)
                break;
579 580
            virReportSystemError(errno, "%s",
                                 _("Unable to read from monitor"));
581 582 583 584 585 586 587 588 589 590 591 592
            ret = -1;
            break;
        }
        if (got == 0)
            break;

        ret += got;
        avail -= got;
        mon->bufferOffset += got;
        mon->buffer[mon->bufferOffset] = '\0';
    }

593
#if DEBUG_IO
594
    VIR_DEBUG("Now read %d bytes of data", (int)mon->bufferOffset);
595
#endif
596 597 598 599 600

    return ret;
}


601 602
static void
qemuMonitorUpdateWatch(qemuMonitorPtr mon)
603 604 605 606 607
{
    int events =
        VIR_EVENT_HANDLE_HANGUP |
        VIR_EVENT_HANDLE_ERROR;

608 609 610
    if (!mon->watch)
        return;

611
    if (mon->lastError.code == VIR_ERR_OK) {
612 613
        events |= VIR_EVENT_HANDLE_READABLE;

614
        if ((mon->msg && mon->msg->txOffset < mon->msg->txLength) &&
E
Eric Blake 已提交
615
            !mon->waitGreeting)
616 617 618 619
            events |= VIR_EVENT_HANDLE_WRITABLE;
    }

    virEventUpdateHandle(mon->watch, events);
620 621
}

622 623

static void
624 625
qemuMonitorIO(int watch, int fd, int events, void *opaque)
{
626
    qemuMonitorPtr mon = opaque;
627 628
    bool error = false;
    bool eof = false;
629
    bool hangup = false;
630

631 632
    virObjectRef(mon);

S
Stefan Berger 已提交
633
    /* lock access to the monitor and protect fd */
634
    virObjectLock(mon);
635
#if DEBUG_IO
636
    VIR_DEBUG("Monitor %p I/O on watch %d fd %d events %d", mon, watch, fd, events);
637
#endif
638
    if (mon->fd == -1 || mon->watch == 0) {
639
        virObjectUnlock(mon);
640 641 642
        virObjectUnref(mon);
        return;
    }
643

644
    if (mon->fd != fd || mon->watch != watch) {
645
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
646
            eof = true;
647 648 649
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("event from unexpected fd %d!=%d / watch %d!=%d"),
                       mon->fd, fd, mon->watch, watch);
650 651
        error = true;
    } else if (mon->lastError.code != VIR_ERR_OK) {
652
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
653
            eof = true;
654
        error = true;
655
    } else {
656
        if (events & VIR_EVENT_HANDLE_WRITABLE) {
657
            if (qemuMonitorIOWrite(mon) < 0) {
658
                error = true;
659 660 661
                if (errno == ECONNRESET)
                    hangup = true;
            }
662 663
            events &= ~VIR_EVENT_HANDLE_WRITABLE;
        }
664 665

        if (!error &&
666 667
            events & VIR_EVENT_HANDLE_READABLE) {
            int got = qemuMonitorIORead(mon);
668 669
            events &= ~VIR_EVENT_HANDLE_READABLE;
            if (got < 0) {
670
                error = true;
671 672
                if (errno == ECONNRESET)
                    hangup = true;
673 674 675 676 677
            } else if (got == 0) {
                eof = true;
            } else {
                /* Ignore hangup/error events if we read some data, to
                 * give time for that data to be consumed */
678 679 680
                events = 0;

                if (qemuMonitorIOProcess(mon) < 0)
681
                    error = true;
682
            }
683 684
        }

685 686 687 688 689 690 691 692
        if (events & VIR_EVENT_HANDLE_HANGUP) {
            hangup = true;
            if (!error) {
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("End of file from monitor"));
                eof = true;
                events &= ~VIR_EVENT_HANDLE_HANGUP;
            }
693 694
        }

695 696
        if (!error && !eof &&
            events & VIR_EVENT_HANDLE_ERROR) {
697 698
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Invalid file descriptor while waiting for monitor"));
699
            eof = true;
700
            events &= ~VIR_EVENT_HANDLE_ERROR;
701 702
        }
        if (!error && events) {
703 704 705
            virReportError(VIR_ERR_INTERNAL_ERROR,
                           _("Unhandled event %d for monitor fd %d"),
                           events, mon->fd);
706
            error = true;
707 708 709
        }
    }

710
    if (error || eof) {
711
        if (hangup && mon->logFunc != NULL) {
712 713
            /* Check if an error message from qemu is available and if so, use
             * it to overwrite the actual message. It's done only in early
714 715 716
             * startup phases or during incoming migration when the message
             * from qemu is certainly more interesting than a
             * "connection reset by peer" message.
717
             */
718 719 720 721
            mon->logFunc(mon,
                         _("early end of file from monitor, "
                           "possible problem"),
                         mon->logOpaque);
722 723
            virCopyLastError(&mon->lastError);
            virResetLastError();
724 725
        }

726 727 728 729 730 731
        if (mon->lastError.code != VIR_ERR_OK) {
            /* Already have an error, so clear any new error */
            virResetLastError();
        } else {
            virErrorPtr err = virGetLastError();
            if (!err)
732 733
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("Error while processing monitor IO"));
734 735 736 737 738 739 740 741 742 743 744 745
            virCopyLastError(&mon->lastError);
            virResetLastError();
        }

        VIR_DEBUG("Error on monitor %s", NULLSTR(mon->lastError.message));
        /* If IO process resulted in an error & we have a message,
         * then wakeup that waiter */
        if (mon->msg && !mon->msg->finished) {
            mon->msg->finished = 1;
            virCondSignal(&mon->notify);
        }
    }
746 747 748

    qemuMonitorUpdateWatch(mon);

749 750 751
    /* We have to unlock to avoid deadlock against command thread,
     * but is this safe ?  I think it is, because the callback
     * will try to acquire the virDomainObjPtr mutex next */
752
    if (eof) {
J
Jiri Denemark 已提交
753
        qemuMonitorEofNotifyCallback eofNotify = mon->cb->eofNotify;
754
        virDomainObjPtr vm = mon->vm;
755

756 757
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
758
        virObjectUnlock(mon);
759
        VIR_DEBUG("Triggering EOF callback");
760
        (eofNotify)(mon, vm, mon->callbackOpaque);
761
        virObjectUnref(mon);
762
    } else if (error) {
J
Jiri Denemark 已提交
763
        qemuMonitorErrorNotifyCallback errorNotify = mon->cb->errorNotify;
764
        virDomainObjPtr vm = mon->vm;
765

766 767
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
768
        virObjectUnlock(mon);
769
        VIR_DEBUG("Triggering error callback");
770
        (errorNotify)(mon, vm, mon->callbackOpaque);
771
        virObjectUnref(mon);
772
    } else {
773
        virObjectUnlock(mon);
774
        virObjectUnref(mon);
775
    }
776 777 778
}


779 780 781 782
static qemuMonitorPtr
qemuMonitorOpenInternal(virDomainObjPtr vm,
                        int fd,
                        bool hasSendFD,
E
Eric Blake 已提交
783
                        bool json,
784 785
                        qemuMonitorCallbacksPtr cb,
                        void *opaque)
786
{
787 788
    qemuMonitorPtr mon;

789
    if (!cb->eofNotify) {
790 791
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("EOF notify callback must be supplied"));
792 793
        return NULL;
    }
794 795 796 797 798
    if (!cb->errorNotify) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Error notify callback must be supplied"));
        return NULL;
    }
799

800 801 802
    if (qemuMonitorInitialize() < 0)
        return NULL;

803
    if (!(mon = virObjectLockableNew(qemuMonitorClass)))
804 805
        return NULL;

806
    if (virCondInit(&mon->notify) < 0) {
807 808
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("cannot initialize monitor condition"));
809
        goto cleanup;
810
    }
811 812
    mon->fd = fd;
    mon->hasSendFD = hasSendFD;
813
    mon->vm = virObjectRef(vm);
D
Daniel P. Berrange 已提交
814
    mon->json = json;
815
    if (json)
E
Eric Blake 已提交
816
        mon->waitGreeting = true;
817
    mon->cb = cb;
818
    mon->callbackOpaque = opaque;
819

820
    if (virSetCloseExec(mon->fd) < 0) {
821 822
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to set monitor close-on-exec flag"));
823 824 825
        goto cleanup;
    }
    if (virSetNonBlock(mon->fd) < 0) {
826 827
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to put monitor into non-blocking mode"));
828 829 830 831
        goto cleanup;
    }


E
Eric Blake 已提交
832
    virObjectLock(mon);
833
    virObjectRef(mon);
834
    if ((mon->watch = virEventAddHandle(mon->fd,
835 836 837
                                        VIR_EVENT_HANDLE_HANGUP |
                                        VIR_EVENT_HANDLE_ERROR |
                                        VIR_EVENT_HANDLE_READABLE,
838
                                        qemuMonitorIO,
839 840
                                        mon,
                                        virObjectFreeCallback)) < 0) {
841
        virObjectUnref(mon);
E
Eric Blake 已提交
842
        virObjectUnlock(mon);
843 844
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("unable to register monitor events"));
845 846 847
        goto cleanup;
    }

848 849
    PROBE(QEMU_MONITOR_NEW,
          "mon=%p refs=%d fd=%d",
850
          mon, mon->parent.parent.u.s.refs, mon->fd);
851
    virObjectUnlock(mon);
852

853 854
    return mon;

855
 cleanup:
856 857 858 859 860 861
    /* We don't want the 'destroy' callback invoked during
     * cleanup from construction failure, because that can
     * give a double-unref on virDomainObjPtr in the caller,
     * so kill the callbacks now.
     */
    mon->cb = NULL;
862 863
    /* The caller owns 'fd' on failure */
    mon->fd = -1;
864 865 866 867
    qemuMonitorClose(mon);
    return NULL;
}

868

869 870 871
qemuMonitorPtr
qemuMonitorOpen(virDomainObjPtr vm,
                virDomainChrSourceDefPtr config,
E
Eric Blake 已提交
872
                bool json,
873 874
                qemuMonitorCallbacksPtr cb,
                void *opaque)
875 876 877 878 879 880 881 882
{
    int fd;
    bool hasSendFD = false;
    qemuMonitorPtr ret;

    switch (config->type) {
    case VIR_DOMAIN_CHR_TYPE_UNIX:
        hasSendFD = true;
883
        if ((fd = qemuMonitorOpenUnix(config->data.nix.path, vm ? vm->pid : 0)) < 0)
884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
            return NULL;
        break;

    case VIR_DOMAIN_CHR_TYPE_PTY:
        if ((fd = qemuMonitorOpenPty(config->data.file.path)) < 0)
            return NULL;
        break;

    default:
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unable to handle monitor type: %s"),
                       virDomainChrTypeToString(config->type));
        return NULL;
    }

899
    ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb, opaque);
900 901 902 903 904 905
    if (!ret)
        VIR_FORCE_CLOSE(fd);
    return ret;
}


906 907 908 909 910 911
qemuMonitorPtr
qemuMonitorOpenFD(virDomainObjPtr vm,
                  int sockfd,
                  bool json,
                  qemuMonitorCallbacksPtr cb,
                  void *opaque)
912
{
913
    return qemuMonitorOpenInternal(vm, sockfd, true, json, cb, opaque);
914 915
}

916

917 918 919 920 921 922 923 924 925
void
qemuMonitorUnregister(qemuMonitorPtr mon)
{
    if (mon->watch) {
        virEventRemoveHandle(mon->watch);
        mon->watch = 0;
    }
}

926 927
void
qemuMonitorClose(qemuMonitorPtr mon)
928 929
{
    if (!mon)
930
        return;
931

932
    virObjectLock(mon);
933
    PROBE(QEMU_MONITOR_CLOSE,
934
          "mon=%p refs=%d", mon, mon->parent.parent.u.s.refs);
S
Stefan Berger 已提交
935

936
    qemuMonitorSetDomainLog(mon, NULL, NULL, NULL);
937

S
Stefan Berger 已提交
938
    if (mon->fd >= 0) {
939
        qemuMonitorUnregister(mon);
S
Stefan Berger 已提交
940
        VIR_FORCE_CLOSE(mon->fd);
941
    }
942

943 944 945 946 947 948 949
    /* In case another thread is waiting for its monitor command to be
     * processed, we need to wake it up with appropriate error set.
     */
    if (mon->msg) {
        if (mon->lastError.code == VIR_ERR_OK) {
            virErrorPtr err = virSaveLastError();

950 951
            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                           _("Qemu monitor was closed"));
952 953 954 955 956 957 958 959 960 961 962 963
            virCopyLastError(&mon->lastError);
            if (err) {
                virSetError(err);
                virFreeError(err);
            } else {
                virResetLastError();
            }
        }
        mon->msg->finished = 1;
        virCondSignal(&mon->notify);
    }

964 965 966 967 968 969
    /* Propagate existing monitor error in case the current thread has no
     * error set.
     */
    if (mon->lastError.code != VIR_ERR_OK && !virGetLastError())
        virSetError(&mon->lastError);

970
    virObjectUnlock(mon);
971
    virObjectUnref(mon);
972 973 974
}


975 976
char *
qemuMonitorNextCommandID(qemuMonitorPtr mon)
977 978 979
{
    char *id;

980
    ignore_value(virAsprintf(&id, "libvirt-%d", ++mon->nextSerial));
981 982 983 984
    return id;
}


985 986 987
int
qemuMonitorSend(qemuMonitorPtr mon,
                qemuMonitorMessagePtr msg)
988
{
989
    int ret = -1;
990

E
Eric Blake 已提交
991
    /* Check whether qemu quit unexpectedly */
992 993 994 995
    if (mon->lastError.code != VIR_ERR_OK) {
        VIR_DEBUG("Attempt to send command while error is set %s",
                  NULLSTR(mon->lastError.message));
        virSetError(&mon->lastError);
996 997 998
        return -1;
    }

999 1000
    mon->msg = msg;
    qemuMonitorUpdateWatch(mon);
1001

1002 1003 1004 1005
    PROBE(QEMU_MONITOR_SEND_MSG,
          "mon=%p msg=%s fd=%d",
          mon, mon->msg->txBuffer, mon->msg->txFD);

1006
    while (!mon->msg->finished) {
1007
        if (virCondWait(&mon->notify, &mon->parent.lock) < 0) {
1008 1009
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to wait on monitor condition"));
1010
            goto cleanup;
1011 1012 1013 1014 1015 1016 1017 1018
        }
    }

    if (mon->lastError.code != VIR_ERR_OK) {
        VIR_DEBUG("Send command resulted in error %s",
                  NULLSTR(mon->lastError.message));
        virSetError(&mon->lastError);
        goto cleanup;
1019
    }
1020

1021
    ret = 0;
1022

1023
 cleanup:
1024 1025
    mon->msg = NULL;
    qemuMonitorUpdateWatch(mon);
1026

1027
    return ret;
1028
}
1029 1030


1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
/**
 * This function returns a new virError object; the caller is responsible
 * for freeing it.
 */
virErrorPtr
qemuMonitorLastError(qemuMonitorPtr mon)
{
    if (mon->lastError.code == VIR_ERR_OK)
        return NULL;

    return virErrorCopyNew(&mon->lastError);
}


1045 1046 1047 1048 1049 1050
virJSONValuePtr
qemuMonitorGetOptions(qemuMonitorPtr mon)
{
    return mon->options;
}

1051

1052 1053 1054 1055 1056 1057
void
qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options)
{
    mon->options = options;
}

1058 1059

/**
1060 1061 1062
 * Search the qom objects for the balloon driver object by its known names
 * of "virtio-balloon-pci" or "virtio-balloon-ccw". The entry for the driver
 * will be found by using function "qemuMonitorJSONFindLinkPath".
1063 1064 1065 1066 1067
 *
 * Once found, check the entry to ensure it has the correct property listed.
 * If it does not, then obtaining statistics from QEMU will not be possible.
 * This feature was added to QEMU 1.5.
 */
1068 1069
static void
qemuMonitorInitBalloonObjectPath(qemuMonitorPtr mon)
1070 1071
{
    ssize_t i, nprops = 0;
1072
    int flp_ret = 0;
1073 1074 1075 1076
    char *path = NULL;
    qemuMonitorJSONListPathPtr *bprops = NULL;

    if (mon->balloonpath) {
1077
        return;
1078 1079 1080
    } else if (mon->ballooninit) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Cannot determine balloon device path"));
1081
        return;
1082
    }
1083
    mon->ballooninit = true;
1084

1085 1086 1087 1088 1089 1090
    flp_ret = qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-pci", &path);
    if (flp_ret == -2) {
        /* pci object was not found retry search for ccw object */
        if (qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-ccw", &path) < 0)
            return;
    } else if (flp_ret < 0) {
1091
        return;
1092
    }
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117

    nprops = qemuMonitorJSONGetObjectListPaths(mon, path, &bprops);
    if (nprops < 0)
        goto cleanup;

    for (i = 0; i < nprops; i++) {
        if (STREQ(bprops[i]->name, "guest-stats-polling-interval")) {
            VIR_DEBUG("Found Balloon Object Path %s", path);
            mon->balloonpath = path;
            path = NULL;
            goto cleanup;
        }
    }


    /* If we get here, we found the path, but not the property */
    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                   _("Property 'guest-stats-polling-interval' "
                     "not found on memory balloon driver."));

 cleanup:
    for (i = 0; i < nprops; i++)
        qemuMonitorJSONListPathFree(bprops[i]);
    VIR_FREE(bprops);
    VIR_FREE(path);
1118
    return;
1119 1120
}

1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135

/**
 * To update video memory size in status XML we need to load correct values from
 * QEMU.  This is supported only with JSON monitor.
 *
 * Returns 0 on success, -1 on failure and sets proper error message.
 */
int
qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon,
                                 virDomainVideoDefPtr video,
                                 const char *videoName)
{
    int ret = -1;
    char *path = NULL;

1136 1137
    QEMU_CHECK_MONITOR(mon);

1138
    if (mon->json) {
1139
        ret = qemuMonitorJSONFindLinkPath(mon, videoName, &path);
1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
        if (ret < 0) {
            if (ret == -2)
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("Failed to find QOM Object path for "
                                 "device '%s'"), videoName);
            return -1;
        }

        ret = qemuMonitorJSONUpdateVideoMemorySize(mon, video, path);
        VIR_FREE(path);
        return ret;
    }

    return 0;
}


1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
/**
 * To update video vram64 size in status XML we need to load correct value from
 * QEMU.  This is supported only with JSON monitor.
 *
 * Returns 0 on success, -1 on failure and sets proper error message.
 */
int
qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon,
                                 virDomainVideoDefPtr video,
                                 const char *videoName)
{
    int ret = -1;
    char *path = NULL;

    QEMU_CHECK_MONITOR(mon);

    if (mon->json) {
        ret = qemuMonitorJSONFindLinkPath(mon, videoName, &path);
        if (ret < 0) {
            if (ret == -2)
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("Failed to find QOM Object path for "
                                 "device '%s'"), videoName);
            return -1;
        }

        ret = qemuMonitorJSONUpdateVideoVram64Size(mon, video, path);
        VIR_FREE(path);
        return ret;
    }

    return 0;
}


1192 1193 1194 1195 1196
int
qemuMonitorHMPCommandWithFd(qemuMonitorPtr mon,
                            const char *cmd,
                            int scm_fd,
                            char **reply)
1197
{
1198 1199 1200
    char *json_cmd = NULL;
    int ret = -1;

1201 1202
    QEMU_CHECK_MONITOR(mon);

1203 1204 1205 1206 1207
    if (mon->json) {
        /* hack to avoid complicating each call to text monitor functions */
        json_cmd = qemuMonitorUnescapeArg(cmd);
        if (!json_cmd) {
            VIR_DEBUG("Could not unescape command: %s", cmd);
1208 1209
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to unescape command"));
1210 1211 1212 1213 1214 1215 1216
            goto cleanup;
        }
        ret = qemuMonitorJSONHumanCommandWithFd(mon, json_cmd, scm_fd, reply);
    } else {
        ret = qemuMonitorTextCommandWithFd(mon, cmd, scm_fd, reply);
    }

1217
 cleanup:
1218 1219
    VIR_FREE(json_cmd);
    return ret;
1220 1221
}

1222

E
Eric Blake 已提交
1223 1224 1225
/* Ensure proper locking around callbacks.  */
#define QEMU_MONITOR_CALLBACK(mon, ret, callback, ...)          \
    do {                                                        \
1226
        virObjectRef(mon);                                      \
1227
        virObjectUnlock(mon);                                   \
E
Eric Blake 已提交
1228
        if ((mon)->cb && (mon)->cb->callback)                   \
1229 1230
            (ret) = (mon)->cb->callback(mon, __VA_ARGS__,       \
                                        (mon)->callbackOpaque); \
1231
        virObjectLock(mon);                                     \
1232
        virObjectUnref(mon);                                    \
E
Eric Blake 已提交
1233
    } while (0)
1234

1235 1236 1237 1238 1239 1240 1241

int
qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
                         virConnectPtr conn,
                         const char *path,
                         char **secret,
                         size_t *secretLen)
1242
{
1243
    int ret = -1;
1244 1245 1246
    *secret = NULL;
    *secretLen = 0;

E
Eric Blake 已提交
1247 1248
    QEMU_MONITOR_CALLBACK(mon, ret, diskSecretLookup, conn, mon->vm,
                          path, secret, secretLen);
1249
    return ret;
1250
}
1251 1252


1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
int
qemuMonitorEmitEvent(qemuMonitorPtr mon, const char *event,
                     long long seconds, unsigned int micros,
                     const char *details)
{
    int ret = -1;
    VIR_DEBUG("mon=%p event=%s", mon, event);

    QEMU_MONITOR_CALLBACK(mon, ret, domainEvent, mon->vm, event, seconds,
                          micros, details);
    return ret;
}


1267 1268
int
qemuMonitorEmitShutdown(qemuMonitorPtr mon)
1269 1270 1271 1272
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1273
    QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm);
1274 1275 1276 1277
    return ret;
}


1278 1279
int
qemuMonitorEmitReset(qemuMonitorPtr mon)
1280 1281 1282 1283
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1284
    QEMU_MONITOR_CALLBACK(mon, ret, domainReset, mon->vm);
1285 1286 1287 1288
    return ret;
}


1289 1290
int
qemuMonitorEmitPowerdown(qemuMonitorPtr mon)
1291 1292 1293 1294
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1295
    QEMU_MONITOR_CALLBACK(mon, ret, domainPowerdown, mon->vm);
1296 1297 1298 1299
    return ret;
}


1300 1301
int
qemuMonitorEmitStop(qemuMonitorPtr mon)
1302 1303 1304 1305
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1306
    QEMU_MONITOR_CALLBACK(mon, ret, domainStop, mon->vm);
1307 1308 1309 1310
    return ret;
}


1311 1312
int
qemuMonitorEmitResume(qemuMonitorPtr mon)
1313 1314 1315 1316 1317 1318 1319 1320 1321
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainResume, mon->vm);
    return ret;
}


1322 1323
int
qemuMonitorEmitGuestPanic(qemuMonitorPtr mon)
1324 1325 1326 1327 1328 1329 1330 1331
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);
    QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm);
    return ret;
}


1332 1333
int
qemuMonitorEmitRTCChange(qemuMonitorPtr mon, long long offset)
1334 1335 1336 1337
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1338
    QEMU_MONITOR_CALLBACK(mon, ret, domainRTCChange, mon->vm, offset);
1339 1340 1341 1342
    return ret;
}


1343 1344
int
qemuMonitorEmitWatchdog(qemuMonitorPtr mon, int action)
1345 1346 1347 1348
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1349
    QEMU_MONITOR_CALLBACK(mon, ret, domainWatchdog, mon->vm, action);
1350 1351 1352 1353
    return ret;
}


1354 1355 1356 1357 1358
int
qemuMonitorEmitIOError(qemuMonitorPtr mon,
                       const char *diskAlias,
                       int action,
                       const char *reason)
1359 1360 1361 1362
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1363 1364
    QEMU_MONITOR_CALLBACK(mon, ret, domainIOError, mon->vm,
                          diskAlias, action, reason);
1365 1366 1367 1368
    return ret;
}


1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
int
qemuMonitorEmitGraphics(qemuMonitorPtr mon,
                        int phase,
                        int localFamily,
                        const char *localNode,
                        const char *localService,
                        int remoteFamily,
                        const char *remoteNode,
                        const char *remoteService,
                        const char *authScheme,
                        const char *x509dname,
                        const char *saslUsername)
1381 1382 1383 1384
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1385 1386 1387 1388
    QEMU_MONITOR_CALLBACK(mon, ret, domainGraphics, mon->vm, phase,
                          localFamily, localNode, localService,
                          remoteFamily, remoteNode, remoteService,
                          authScheme, x509dname, saslUsername);
1389 1390 1391
    return ret;
}

1392 1393 1394 1395 1396

int
qemuMonitorEmitTrayChange(qemuMonitorPtr mon,
                          const char *devAlias,
                          int reason)
1397 1398 1399 1400 1401 1402 1403 1404 1405 1406
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainTrayChange, mon->vm,
                          devAlias, reason);

    return ret;
}

1407 1408 1409

int
qemuMonitorEmitPMWakeup(qemuMonitorPtr mon)
O
Osier Yang 已提交
1410 1411 1412 1413 1414 1415 1416 1417 1418
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainPMWakeup, mon->vm);

    return ret;
}

1419 1420 1421

int
qemuMonitorEmitPMSuspend(qemuMonitorPtr mon)
O
Osier Yang 已提交
1422 1423 1424 1425 1426 1427 1428 1429 1430
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainPMSuspend, mon->vm);

    return ret;
}

1431 1432 1433

int
qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon)
1434 1435 1436 1437 1438 1439 1440 1441 1442
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainPMSuspendDisk, mon->vm);

    return ret;
}

1443 1444 1445 1446 1447 1448

int
qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
                        const char *diskAlias,
                        int type,
                        int status)
1449 1450 1451 1452 1453 1454 1455 1456 1457
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainBlockJob, mon->vm,
                          diskAlias, type, status);
    return ret;
}

1458

1459 1460 1461
int
qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
                             unsigned long long actual)
1462 1463 1464 1465 1466 1467 1468 1469
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainBalloonChange, mon->vm, actual);
    return ret;
}

1470

1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
int
qemuMonitorEmitDeviceDeleted(qemuMonitorPtr mon,
                             const char *devAlias)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainDeviceDeleted, mon->vm, devAlias);

    return ret;
}


1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
int
qemuMonitorEmitNicRxFilterChanged(qemuMonitorPtr mon,
                                  const char *devAlias)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainNicRxFilterChanged, mon->vm, devAlias);

    return ret;
}


1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
int
qemuMonitorEmitSerialChange(qemuMonitorPtr mon,
                            const char *devAlias,
                            bool connected)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, devAlias='%s', connected=%d", mon, devAlias, connected);

    QEMU_MONITOR_CALLBACK(mon, ret, domainSerialChange, mon->vm, devAlias, connected);

    return ret;
}


1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
int
qemuMonitorEmitSpiceMigrated(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainSpiceMigrated, mon->vm);

    return ret;
}


1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
int
qemuMonitorEmitMigrationStatus(qemuMonitorPtr mon,
                               int status)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, status=%s",
              mon, NULLSTR(qemuMonitorMigrationStatusTypeToString(status)));

    QEMU_MONITOR_CALLBACK(mon, ret, domainMigrationStatus, mon->vm, status);

    return ret;
}


1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
int
qemuMonitorEmitMigrationPass(qemuMonitorPtr mon,
                             int pass)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, pass=%d", mon, pass);

    QEMU_MONITOR_CALLBACK(mon, ret, domainMigrationPass, mon->vm, pass);

    return ret;
}


1550 1551
int
qemuMonitorSetCapabilities(qemuMonitorPtr mon)
1552
{
1553
    QEMU_CHECK_MONITOR(mon);
1554

1555 1556
    if (!mon->json)
        return 0;
1557

1558
    return qemuMonitorJSONSetCapabilities(mon);
1559 1560 1561
}


1562 1563 1564 1565
int
qemuMonitorStartCPUs(qemuMonitorPtr mon,
                     virConnectPtr conn)
{
1566
    QEMU_CHECK_MONITOR(mon);
1567

D
Daniel P. Berrange 已提交
1568
    if (mon->json)
1569
        return qemuMonitorJSONStartCPUs(mon, conn);
D
Daniel P. Berrange 已提交
1570
    else
1571
        return qemuMonitorTextStartCPUs(mon, conn);
1572 1573 1574 1575 1576 1577
}


int
qemuMonitorStopCPUs(qemuMonitorPtr mon)
{
1578
    QEMU_CHECK_MONITOR(mon);
1579

D
Daniel P. Berrange 已提交
1580
    if (mon->json)
1581
        return qemuMonitorJSONStopCPUs(mon);
D
Daniel P. Berrange 已提交
1582
    else
1583
        return qemuMonitorTextStopCPUs(mon);
1584 1585 1586
}


1587
int
1588 1589 1590
qemuMonitorGetStatus(qemuMonitorPtr mon,
                     bool *running,
                     virDomainPausedReason *reason)
1591
{
1592
    VIR_DEBUG("running=%p, reason=%p", running, reason);
1593

1594
    QEMU_CHECK_MONITOR(mon);
1595 1596

    if (mon->json)
1597
        return qemuMonitorJSONGetStatus(mon, running, reason);
1598
    else
1599
        return qemuMonitorTextGetStatus(mon, running, reason);
1600 1601 1602
}


1603 1604
int
qemuMonitorSystemPowerdown(qemuMonitorPtr mon)
1605
{
1606
    QEMU_CHECK_MONITOR(mon);
1607

D
Daniel P. Berrange 已提交
1608
    if (mon->json)
1609
        return qemuMonitorJSONSystemPowerdown(mon);
D
Daniel P. Berrange 已提交
1610
    else
1611
        return qemuMonitorTextSystemPowerdown(mon);
1612 1613 1614
}


1615 1616
int
qemuMonitorSystemReset(qemuMonitorPtr mon)
1617
{
1618
    QEMU_CHECK_MONITOR(mon);
1619 1620

    if (mon->json)
1621
        return qemuMonitorJSONSystemReset(mon);
1622
    else
1623
        return qemuMonitorTextSystemReset(mon);
1624 1625 1626
}


1627 1628 1629 1630 1631 1632 1633 1634 1635
/**
 * qemuMonitorGetCPUInfo:
 * @mon: monitor
 * @pids: returned array of thread ids corresponding to the vCPUs
 *
 * Detects the vCPU thread ids. Returns count of detected vCPUs on success,
 * 0 if qemu didn't report thread ids (does not report libvirt error),
 * -1 on error (reports libvirt error).
 */
1636 1637 1638
int
qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
                      int **pids)
1639
{
1640
    QEMU_CHECK_MONITOR(mon);
1641

D
Daniel P. Berrange 已提交
1642
    if (mon->json)
1643
        return qemuMonitorJSONGetCPUInfo(mon, pids);
D
Daniel P. Berrange 已提交
1644
    else
1645
        return qemuMonitorTextGetCPUInfo(mon, pids);
1646 1647
}

1648 1649 1650 1651 1652

int
qemuMonitorSetLink(qemuMonitorPtr mon,
                   const char *name,
                   virDomainNetInterfaceLinkState state)
1653
{
1654
    VIR_DEBUG("name=%s, state=%u", name, state);
1655

1656
    QEMU_CHECK_MONITOR(mon);
1657 1658

    if (mon->json)
1659
        return qemuMonitorJSONSetLink(mon, name, state);
1660
    else
1661
        return qemuMonitorTextSetLink(mon, name, state);
1662
}
1663

1664 1665 1666

int
qemuMonitorGetVirtType(qemuMonitorPtr mon,
1667
                       virDomainVirtType *virtType)
1668
{
1669
    QEMU_CHECK_MONITOR(mon);
1670 1671

    if (mon->json)
1672
        return qemuMonitorJSONGetVirtType(mon, virtType);
1673
    else
1674
        return qemuMonitorTextGetVirtType(mon, virtType);
1675 1676 1677
}


1678 1679 1680 1681
/**
 * Returns: 0 if balloon not supported, +1 if balloon query worked
 * or -1 on failure
 */
1682 1683 1684
int
qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
                          unsigned long long *currmem)
1685
{
1686
    QEMU_CHECK_MONITOR(mon);
1687

D
Daniel P. Berrange 已提交
1688
    if (mon->json)
1689
        return qemuMonitorJSONGetBalloonInfo(mon, currmem);
D
Daniel P. Berrange 已提交
1690
    else
1691
        return qemuMonitorTextGetBalloonInfo(mon, currmem);
1692 1693 1694
}


1695 1696 1697 1698
int
qemuMonitorGetMemoryStats(qemuMonitorPtr mon,
                          virDomainMemoryStatPtr stats,
                          unsigned int nr_stats)
1699
{
1700
    VIR_DEBUG("stats=%p nstats=%u", stats, nr_stats);
1701

1702
    QEMU_CHECK_MONITOR(mon);
1703

1704
    if (mon->json) {
1705
        qemuMonitorInitBalloonObjectPath(mon);
1706 1707
        return qemuMonitorJSONGetMemoryStats(mon, mon->balloonpath,
                                             stats, nr_stats);
1708
    } else {
1709
        return qemuMonitorTextGetMemoryStats(mon, stats, nr_stats);
1710
    }
1711 1712
}

1713

1714 1715 1716 1717 1718 1719 1720
/**
 * qemuMonitorSetMemoryStatsPeriod:
 *
 * This function sets balloon stats update period.
 *
 * Returns 0 on success and -1 on error, but does *not* set an error.
 */
1721 1722 1723
int
qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,
                                int period)
1724 1725 1726 1727
{
    int ret = -1;
    VIR_DEBUG("mon=%p period=%d", mon, period);

1728
    if (!mon)
1729 1730
        return -1;

1731 1732 1733 1734
    if (!mon->json)
        return -1;

    if (period < 0)
1735 1736
        return -1;

1737 1738
    qemuMonitorInitBalloonObjectPath(mon);
    if (mon->balloonpath) {
1739 1740
        ret = qemuMonitorJSONSetMemoryStatsPeriod(mon, mon->balloonpath,
                                                  period);
1741 1742 1743 1744 1745 1746 1747 1748 1749

        /*
         * Most of the calls to this function are supposed to be
         * non-fatal and the only one that should be fatal wants its
         * own error message.  More details for debugging will be in
         * the log file.
         */
        if (ret < 0)
            virResetLastError();
1750 1751 1752 1753
    }
    return ret;
}

1754

1755 1756 1757 1758 1759 1760
int
qemuMonitorBlockIOStatusToError(const char *status)
{
    int st = qemuMonitorBlockIOStatusTypeFromString(status);

    if (st < 0) {
1761 1762
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unknown block IO status: %s"), status);
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
        return -1;
    }

    switch ((qemuMonitorBlockIOStatus) st) {
    case QEMU_MONITOR_BLOCK_IO_STATUS_OK:
        return VIR_DOMAIN_DISK_ERROR_NONE;
    case QEMU_MONITOR_BLOCK_IO_STATUS_FAILED:
        return VIR_DOMAIN_DISK_ERROR_UNSPEC;
    case QEMU_MONITOR_BLOCK_IO_STATUS_NOSPACE:
        return VIR_DOMAIN_DISK_ERROR_NO_SPACE;

    /* unreachable */
    case QEMU_MONITOR_BLOCK_IO_STATUS_LAST:
        break;
    }
    return -1;
}

1781

1782 1783
virHashTablePtr
qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
1784 1785
{
    int ret;
1786 1787
    virHashTablePtr table;

1788
    QEMU_CHECK_MONITOR_NULL(mon);
1789

E
Eric Blake 已提交
1790
    if (!(table = virHashCreate(32, virHashValueFree)))
1791 1792
        return NULL;

1793
    if (mon->json)
1794
        ret = qemuMonitorJSONGetBlockInfo(mon, table);
1795
    else
1796 1797 1798 1799 1800 1801 1802 1803 1804 1805
        ret = qemuMonitorTextGetBlockInfo(mon, table);

    if (ret < 0) {
        virHashFree(table);
        return NULL;
    }

    return table;
}

1806

1807 1808
struct qemuDomainDiskInfo *
qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
E
Eric Blake 已提交
1809
                           const char *dev)
1810 1811 1812
{
    struct qemuDomainDiskInfo *info;

E
Eric Blake 已提交
1813
    VIR_DEBUG("blockInfo=%p dev=%s", blockInfo, NULLSTR(dev));
1814

E
Eric Blake 已提交
1815
    if (!(info = virHashLookup(blockInfo, dev))) {
1816 1817
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("cannot find info for device '%s'"),
E
Eric Blake 已提交
1818
                       NULLSTR(dev));
1819 1820 1821
    }

    return info;
1822
}
1823

1824

1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
/**
 * qemuMonitorGetAllBlockStatsInfo:
 * @mon: monitor object
 * @ret_stats: pointer that is filled with a hash table containing the stats
 * @backingChain: recurse into the backing chain of devices
 *
 * Creates a hash table in @ret_stats with block stats of all devices. In case
 * @backingChain is true @ret_stats will additionally contain stats for
 * backing chain members of block devices.
 *
 * Returns < 0 on error, count of supported block stats fields on success.
1836 1837 1838
 */
int
qemuMonitorGetAllBlockStatsInfo(qemuMonitorPtr mon,
1839 1840
                                virHashTablePtr *ret_stats,
                                bool backingChain)
1841
{
1842
    int ret = -1;
1843 1844 1845
    VIR_DEBUG("ret_stats=%p, backing=%d", ret_stats, backingChain);

    QEMU_CHECK_MONITOR(mon);
1846

1847 1848 1849
    if (!(*ret_stats = virHashCreate(10, virHashValueFree)))
        goto error;

1850
    if (mon->json) {
1851 1852
        ret = qemuMonitorJSONGetAllBlockStatsInfo(mon, *ret_stats,
                                                  backingChain);
1853 1854 1855 1856 1857 1858 1859 1860
    } else {
         if (backingChain) {
             virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                            _("text monitor doesn't support block stats for "
                              "backing chain members"));
             goto error;
         }

1861
         ret = qemuMonitorTextGetAllBlockStatsInfo(mon, *ret_stats);
1862
    }
1863

1864 1865 1866 1867
    if (ret < 0)
        goto error;

    return ret;
1868 1869 1870 1871 1872

 error:
    virHashFree(*ret_stats);
    *ret_stats = NULL;
    return -1;
1873 1874
}

1875 1876

/* Updates "stats" to fill virtual and physical size of the image */
1877 1878 1879 1880
int
qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon,
                                    virHashTablePtr stats,
                                    bool backingChain)
1881
{
1882
    VIR_DEBUG("stats=%p, backing=%d", stats, backingChain);
1883

1884
    QEMU_CHECK_MONITOR_JSON(mon);
1885

1886
    return qemuMonitorJSONBlockStatsUpdateCapacity(mon, stats, backingChain);
1887 1888 1889
}


1890 1891 1892 1893
int
qemuMonitorBlockResize(qemuMonitorPtr mon,
                       const char *device,
                       unsigned long long size)
1894
{
1895 1896 1897
    VIR_DEBUG("device=%s size=%llu", device, size);

    QEMU_CHECK_MONITOR(mon);
1898 1899

    if (mon->json)
1900
        return qemuMonitorJSONBlockResize(mon, device, size);
1901
    else
1902
        return qemuMonitorTextBlockResize(mon, device, size);
1903
}
1904

1905 1906 1907 1908

int
qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
                          const char *password)
1909
{
1910
    VIR_DEBUG("password=%p", password);
1911

1912
    QEMU_CHECK_MONITOR(mon);
1913

1914 1915 1916
    if (!password)
        password = "";

D
Daniel P. Berrange 已提交
1917
    if (mon->json)
1918
        return qemuMonitorJSONSetVNCPassword(mon, password);
D
Daniel P. Berrange 已提交
1919
    else
1920
        return qemuMonitorTextSetVNCPassword(mon, password);
1921 1922
}

1923 1924 1925

static const char *
qemuMonitorTypeToProtocol(int type)
1926 1927 1928 1929 1930 1931 1932
{
    switch (type) {
    case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
        return "vnc";
    case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
        return "spice";
    default:
1933 1934 1935
        virReportError(VIR_ERR_INVALID_ARG,
                       _("unsupported protocol type %s"),
                       virDomainGraphicsTypeToString(type));
1936 1937 1938 1939
        return NULL;
    }
}

1940

1941
/* Returns -2 if not supported with this monitor connection */
1942 1943 1944 1945 1946
int
qemuMonitorSetPassword(qemuMonitorPtr mon,
                       int type,
                       const char *password,
                       const char *action_if_connected)
1947 1948 1949 1950 1951 1952
{
    const char *protocol = qemuMonitorTypeToProtocol(type);

    if (!protocol)
        return -1;

1953 1954
    VIR_DEBUG("protocol=%s, password=%p, action_if_connected=%s",
              protocol, password, action_if_connected);
1955

1956
    QEMU_CHECK_MONITOR(mon);
1957 1958 1959 1960 1961 1962 1963 1964

    if (!password)
        password = "";

    if (!action_if_connected)
        action_if_connected = "keep";

    if (mon->json)
1965
        return qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected);
1966
    else
1967
        return qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected);
1968 1969
}

1970 1971 1972 1973 1974

int
qemuMonitorExpirePassword(qemuMonitorPtr mon,
                          int type,
                          const char *expire_time)
1975 1976 1977 1978 1979 1980
{
    const char *protocol = qemuMonitorTypeToProtocol(type);

    if (!protocol)
        return -1;

1981
    VIR_DEBUG("protocol=%s, expire_time=%s", protocol, expire_time);
1982

1983
    QEMU_CHECK_MONITOR(mon);
1984 1985 1986 1987 1988

    if (!expire_time)
        expire_time = "now";

    if (mon->json)
1989
        return qemuMonitorJSONExpirePassword(mon, protocol, expire_time);
1990
    else
1991
        return qemuMonitorTextExpirePassword(mon, protocol, expire_time);
1992
}
1993

1994

1995 1996 1997 1998
/*
 * Returns: 0 if balloon not supported, +1 if balloon adjust worked
 * or -1 on failure
 */
1999 2000
int
qemuMonitorSetBalloon(qemuMonitorPtr mon,
2001
                      unsigned long long newmem)
2002
{
2003
    VIR_DEBUG("newmem=%llu", newmem);
2004

2005
    QEMU_CHECK_MONITOR(mon);
2006

D
Daniel P. Berrange 已提交
2007
    if (mon->json)
2008
        return qemuMonitorJSONSetBalloon(mon, newmem);
D
Daniel P. Berrange 已提交
2009
    else
2010
        return qemuMonitorTextSetBalloon(mon, newmem);
2011 2012
}

2013

2014 2015 2016
/*
 * Returns: 0 if CPU modification was successful or -1 on failure
 */
2017 2018
int
qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, bool online)
2019
{
2020
    VIR_DEBUG("cpu=%d online=%d", cpu, online);
2021

2022
    QEMU_CHECK_MONITOR(mon);
2023 2024

    if (mon->json)
2025
        return qemuMonitorJSONSetCPU(mon, cpu, online);
2026
    else
2027
        return qemuMonitorTextSetCPU(mon, cpu, online);
2028 2029 2030
}


2031 2032 2033 2034
int
qemuMonitorEjectMedia(qemuMonitorPtr mon,
                      const char *dev_name,
                      bool force)
2035
{
2036
    VIR_DEBUG("dev_name=%s force=%d", dev_name, force);
2037

2038
    QEMU_CHECK_MONITOR(mon);
2039

D
Daniel P. Berrange 已提交
2040
    if (mon->json)
2041
        return qemuMonitorJSONEjectMedia(mon, dev_name, force);
D
Daniel P. Berrange 已提交
2042
    else
2043
        return qemuMonitorTextEjectMedia(mon, dev_name, force);
2044 2045 2046
}


2047 2048 2049 2050 2051
int
qemuMonitorChangeMedia(qemuMonitorPtr mon,
                       const char *dev_name,
                       const char *newmedia,
                       const char *format)
2052
{
2053
    VIR_DEBUG("dev_name=%s newmedia=%s format=%s", dev_name, newmedia, format);
2054

2055
    QEMU_CHECK_MONITOR(mon);
2056

D
Daniel P. Berrange 已提交
2057
    if (mon->json)
2058
        return qemuMonitorJSONChangeMedia(mon, dev_name, newmedia, format);
D
Daniel P. Berrange 已提交
2059
    else
2060
        return qemuMonitorTextChangeMedia(mon, dev_name, newmedia, format);
2061 2062 2063
}


2064 2065 2066 2067 2068
int
qemuMonitorSaveVirtualMemory(qemuMonitorPtr mon,
                             unsigned long long offset,
                             size_t length,
                             const char *path)
2069
{
2070
    VIR_DEBUG("offset=%llu length=%zu path=%s", offset, length, path);
2071

2072
    QEMU_CHECK_MONITOR(mon);
2073

D
Daniel P. Berrange 已提交
2074
    if (mon->json)
2075
        return qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path);
D
Daniel P. Berrange 已提交
2076
    else
2077
        return qemuMonitorTextSaveVirtualMemory(mon, offset, length, path);
2078 2079
}

2080 2081 2082 2083 2084 2085

int
qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
                              unsigned long long offset,
                              size_t length,
                              const char *path)
2086
{
2087
    VIR_DEBUG("offset=%llu length=%zu path=%s", offset, length, path);
2088

2089
    QEMU_CHECK_MONITOR(mon);
2090

D
Daniel P. Berrange 已提交
2091
    if (mon->json)
2092
        return qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path);
D
Daniel P. Berrange 已提交
2093
    else
2094
        return qemuMonitorTextSavePhysicalMemory(mon, offset, length, path);
2095 2096 2097
}


2098 2099 2100
int
qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
                             unsigned long bandwidth)
2101
{
2102
    VIR_DEBUG("bandwidth=%lu", bandwidth);
2103

2104
    QEMU_CHECK_MONITOR(mon);
2105

2106 2107 2108 2109 2110 2111 2112
    if (bandwidth > QEMU_DOMAIN_MIG_BANDWIDTH_MAX) {
        virReportError(VIR_ERR_OVERFLOW,
                       _("bandwidth must be less than %llu"),
                       QEMU_DOMAIN_MIG_BANDWIDTH_MAX + 1ULL);
        return -1;
    }

D
Daniel P. Berrange 已提交
2113
    if (mon->json)
2114
        return qemuMonitorJSONSetMigrationSpeed(mon, bandwidth);
D
Daniel P. Berrange 已提交
2115
    else
2116
        return qemuMonitorTextSetMigrationSpeed(mon, bandwidth);
2117 2118
}

2119

2120 2121 2122
int
qemuMonitorSetMigrationDowntime(qemuMonitorPtr mon,
                                unsigned long long downtime)
2123
{
2124
    VIR_DEBUG("downtime=%llu", downtime);
2125

2126
    QEMU_CHECK_MONITOR(mon);
2127 2128

    if (mon->json)
2129
        return qemuMonitorJSONSetMigrationDowntime(mon, downtime);
2130
    else
2131
        return qemuMonitorTextSetMigrationDowntime(mon, downtime);
2132 2133 2134
}


2135 2136 2137 2138
int
qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long *cacheSize)
{
2139
    VIR_DEBUG("cacheSize=%p", cacheSize);
2140

2141
    QEMU_CHECK_MONITOR_JSON(mon);
2142 2143 2144 2145

    return qemuMonitorJSONGetMigrationCacheSize(mon, cacheSize);
}

2146

2147 2148 2149 2150
int
qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long cacheSize)
{
2151
    VIR_DEBUG("cacheSize=%llu", cacheSize);
2152

2153
    QEMU_CHECK_MONITOR_JSON(mon);
2154 2155 2156 2157 2158

    return qemuMonitorJSONSetMigrationCacheSize(mon, cacheSize);
}


2159
int
2160 2161
qemuMonitorGetMigrationStats(qemuMonitorPtr mon,
                             qemuMonitorMigrationStatsPtr stats)
2162
{
2163
    QEMU_CHECK_MONITOR(mon);
2164

D
Daniel P. Berrange 已提交
2165
    if (mon->json)
2166
        return qemuMonitorJSONGetMigrationStats(mon, stats);
D
Daniel P. Berrange 已提交
2167
    else
2168
        return qemuMonitorTextGetMigrationStats(mon, stats);
2169 2170 2171
}


2172 2173 2174 2175
int
qemuMonitorMigrateToFd(qemuMonitorPtr mon,
                       unsigned int flags,
                       int fd)
E
Eric Blake 已提交
2176 2177
{
    int ret;
2178
    VIR_DEBUG("fd=%d flags=%x", fd, flags);
E
Eric Blake 已提交
2179

2180
    QEMU_CHECK_MONITOR(mon);
E
Eric Blake 已提交
2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191

    if (qemuMonitorSendFileHandle(mon, "migrate", fd) < 0)
        return -1;

    if (mon->json)
        ret = qemuMonitorJSONMigrate(mon, flags, "fd:migrate");
    else
        ret = qemuMonitorTextMigrate(mon, flags, "fd:migrate");

    if (ret < 0) {
        if (qemuMonitorCloseFileHandle(mon, "migrate") < 0)
2192
            VIR_WARN("failed to close migration handle");
E
Eric Blake 已提交
2193 2194 2195 2196 2197 2198
    }

    return ret;
}


2199 2200 2201 2202 2203 2204
int
qemuMonitorMigrateToHost(qemuMonitorPtr mon,
                         unsigned int flags,
                         const char *protocol,
                         const char *hostname,
                         int port)
2205
{
D
Daniel P. Berrange 已提交
2206
    int ret;
2207
    char *uri = NULL;
2208
    VIR_DEBUG("hostname=%s port=%d flags=%x", hostname, port, flags);
2209

2210
    QEMU_CHECK_MONITOR(mon);
2211

2212
    if (virAsprintf(&uri, "%s:%s:%d", protocol, hostname, port) < 0)
2213 2214
        return -1;

D
Daniel P. Berrange 已提交
2215
    if (mon->json)
2216
        ret = qemuMonitorJSONMigrate(mon, flags, uri);
D
Daniel P. Berrange 已提交
2217
    else
2218 2219 2220
        ret = qemuMonitorTextMigrate(mon, flags, uri);

    VIR_FREE(uri);
D
Daniel P. Berrange 已提交
2221
    return ret;
2222 2223 2224
}


2225 2226 2227 2228
int
qemuMonitorMigrateToCommand(qemuMonitorPtr mon,
                            unsigned int flags,
                            const char * const *argv)
2229
{
2230 2231 2232
    char *argstr;
    char *dest = NULL;
    int ret = -1;
2233
    VIR_DEBUG("argv=%p flags=%x", argv, flags);
2234

2235
    QEMU_CHECK_MONITOR(mon);
2236

2237
    argstr = virArgvToString(argv);
2238
    if (!argstr)
2239 2240
        goto cleanup;

2241
    if (virAsprintf(&dest, "exec:%s", argstr) < 0)
2242 2243
        goto cleanup;

D
Daniel P. Berrange 已提交
2244
    if (mon->json)
2245
        ret = qemuMonitorJSONMigrate(mon, flags, dest);
D
Daniel P. Berrange 已提交
2246
    else
2247 2248
        ret = qemuMonitorTextMigrate(mon, flags, dest);

2249
 cleanup:
2250 2251
    VIR_FREE(argstr);
    VIR_FREE(dest);
2252 2253 2254
    return ret;
}

2255 2256 2257 2258 2259

int
qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
                         unsigned int flags,
                         const char *unixfile)
2260
{
2261 2262
    char *dest = NULL;
    int ret = -1;
2263
    VIR_DEBUG("unixfile=%s flags=%x", unixfile, flags);
2264

2265
    QEMU_CHECK_MONITOR(mon);
2266

2267
    if (virAsprintf(&dest, "unix:%s", unixfile) < 0)
2268 2269
        return -1;

D
Daniel P. Berrange 已提交
2270
    if (mon->json)
2271
        ret = qemuMonitorJSONMigrate(mon, flags, dest);
D
Daniel P. Berrange 已提交
2272
    else
2273 2274 2275
        ret = qemuMonitorTextMigrate(mon, flags, dest);

    VIR_FREE(dest);
D
Daniel P. Berrange 已提交
2276
    return ret;
2277 2278
}

2279 2280 2281

int
qemuMonitorMigrateCancel(qemuMonitorPtr mon)
2282
{
2283
    QEMU_CHECK_MONITOR(mon);
2284

D
Daniel P. Berrange 已提交
2285
    if (mon->json)
2286
        return qemuMonitorJSONMigrateCancel(mon);
D
Daniel P. Berrange 已提交
2287
    else
2288
        return qemuMonitorTextMigrateCancel(mon);
2289 2290
}

2291

2292 2293 2294
/**
 * Returns 1 if @capability is supported, 0 if it's not, or -1 on error.
 */
2295 2296 2297
int
qemuMonitorGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
                                        const char *capability)
2298
{
2299
    VIR_DEBUG("capability=%s", capability);
2300

2301
    QEMU_CHECK_MONITOR(mon);
2302 2303 2304 2305 2306 2307 2308 2309

    /* No capability is supported without JSON monitor */
    if (!mon->json)
        return 0;

    return qemuMonitorJSONGetDumpGuestMemoryCapability(mon, capability);
}

2310

2311
int
2312
qemuMonitorDumpToFd(qemuMonitorPtr mon, int fd, const char *dumpformat)
2313 2314
{
    int ret;
2315
    VIR_DEBUG("fd=%d dumpformat=%s", fd, dumpformat);
2316

2317
    QEMU_CHECK_MONITOR_JSON(mon);
2318 2319 2320 2321

    if (qemuMonitorSendFileHandle(mon, "dump", fd) < 0)
        return -1;

2322
    ret = qemuMonitorJSONDump(mon, "fd:dump", dumpformat);
2323 2324 2325 2326 2327 2328 2329 2330

    if (ret < 0) {
        if (qemuMonitorCloseFileHandle(mon, "dump") < 0)
            VIR_WARN("failed to close dumping handle");
    }

    return ret;
}
2331

2332 2333 2334 2335 2336 2337 2338 2339

int
qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
                            int type,
                            const char *hostname,
                            int port,
                            int tlsPort,
                            const char *tlsSubject)
2340
{
2341 2342 2343 2344
    VIR_DEBUG("type=%d hostname=%s port=%d tlsPort=%d tlsSubject=%s",
              type, hostname, port, tlsPort, NULLSTR(tlsSubject));

    QEMU_CHECK_MONITOR(mon);
2345 2346

    if (mon->json)
2347 2348 2349 2350 2351 2352
        return qemuMonitorJSONGraphicsRelocate(mon,
                                               type,
                                               hostname,
                                               port,
                                               tlsPort,
                                               tlsSubject);
2353
    else
2354 2355 2356 2357 2358 2359
        return qemuMonitorTextGraphicsRelocate(mon,
                                               type,
                                               hostname,
                                               port,
                                               tlsPort,
                                               tlsSubject);
2360 2361 2362
}


2363 2364 2365
int
qemuMonitorAddUSBDisk(qemuMonitorPtr mon,
                      const char *path)
2366
{
2367
    VIR_DEBUG("path=%s", path);
2368

2369
    QEMU_CHECK_MONITOR(mon);
2370

D
Daniel P. Berrange 已提交
2371
    if (mon->json)
2372
        return qemuMonitorJSONAddUSBDisk(mon, path);
D
Daniel P. Berrange 已提交
2373
    else
2374
        return qemuMonitorTextAddUSBDisk(mon, path);
2375 2376 2377
}


2378 2379 2380 2381
int
qemuMonitorAddUSBDeviceExact(qemuMonitorPtr mon,
                             int bus,
                             int dev)
2382
{
2383
    VIR_DEBUG("bus=%d dev=%d", bus, dev);
2384

2385
    QEMU_CHECK_MONITOR(mon);
2386

D
Daniel P. Berrange 已提交
2387
    if (mon->json)
2388
        return qemuMonitorJSONAddUSBDeviceExact(mon, bus, dev);
D
Daniel P. Berrange 已提交
2389
    else
2390
        return qemuMonitorTextAddUSBDeviceExact(mon, bus, dev);
2391 2392
}

2393 2394 2395 2396 2397

int
qemuMonitorAddUSBDeviceMatch(qemuMonitorPtr mon,
                             int vendor,
                             int product)
2398
{
2399
    VIR_DEBUG("vendor=%d product=%d", vendor, product);
2400

2401
    QEMU_CHECK_MONITOR(mon);
2402

D
Daniel P. Berrange 已提交
2403
    if (mon->json)
2404
        return qemuMonitorJSONAddUSBDeviceMatch(mon, vendor, product);
D
Daniel P. Berrange 已提交
2405
    else
2406
        return qemuMonitorTextAddUSBDeviceMatch(mon, vendor, product);
2407 2408 2409
}


2410 2411 2412 2413
int
qemuMonitorAddPCIHostDevice(qemuMonitorPtr mon,
                            virDevicePCIAddress *hostAddr,
                            virDevicePCIAddress *guestAddr)
2414
{
2415 2416
    VIR_DEBUG("domain=%d bus=%d slot=%d function=%d",
              hostAddr->domain, hostAddr->bus, hostAddr->slot, hostAddr->function);
2417

2418
    QEMU_CHECK_MONITOR(mon);
2419

D
Daniel P. Berrange 已提交
2420
    if (mon->json)
2421
        return qemuMonitorJSONAddPCIHostDevice(mon, hostAddr, guestAddr);
D
Daniel P. Berrange 已提交
2422
    else
2423
        return qemuMonitorTextAddPCIHostDevice(mon, hostAddr, guestAddr);
2424 2425 2426
}


2427 2428 2429 2430 2431
int
qemuMonitorAddPCIDisk(qemuMonitorPtr mon,
                      const char *path,
                      const char *bus,
                      virDevicePCIAddress *guestAddr)
2432
{
2433
    VIR_DEBUG("path=%s bus=%s", path, bus);
2434

2435
    QEMU_CHECK_MONITOR(mon);
2436

D
Daniel P. Berrange 已提交
2437
    if (mon->json)
2438
        return qemuMonitorJSONAddPCIDisk(mon, path, bus, guestAddr);
D
Daniel P. Berrange 已提交
2439
    else
2440
        return qemuMonitorTextAddPCIDisk(mon, path, bus, guestAddr);
2441 2442 2443
}


2444 2445 2446 2447
int
qemuMonitorAddPCINetwork(qemuMonitorPtr mon,
                         const char *nicstr,
                         virDevicePCIAddress *guestAddr)
2448
{
2449
    VIR_DEBUG("nicstr=%s", nicstr);
2450

2451
    QEMU_CHECK_MONITOR(mon);
2452

D
Daniel P. Berrange 已提交
2453
    if (mon->json)
2454
        return qemuMonitorJSONAddPCINetwork(mon, nicstr, guestAddr);
D
Daniel P. Berrange 已提交
2455
    else
2456
        return qemuMonitorTextAddPCINetwork(mon, nicstr, guestAddr);
2457 2458 2459
}


2460 2461 2462
int
qemuMonitorRemovePCIDevice(qemuMonitorPtr mon,
                           virDevicePCIAddress *guestAddr)
2463
{
2464 2465 2466
    VIR_DEBUG("domain=%d bus=%d slot=%d function=%d",
              guestAddr->domain, guestAddr->bus, guestAddr->slot,
              guestAddr->function);
2467

2468
    QEMU_CHECK_MONITOR(mon);
2469

D
Daniel P. Berrange 已提交
2470
    if (mon->json)
2471
        return qemuMonitorJSONRemovePCIDevice(mon, guestAddr);
D
Daniel P. Berrange 已提交
2472
    else
2473
        return qemuMonitorTextRemovePCIDevice(mon, guestAddr);
2474 2475 2476
}


2477 2478 2479 2480
int
qemuMonitorSendFileHandle(qemuMonitorPtr mon,
                          const char *fdname,
                          int fd)
2481
{
2482
    VIR_DEBUG("fdname=%s fd=%d", fdname, fd);
2483

2484
    QEMU_CHECK_MONITOR(mon);
2485

2486
    if (fd < 0) {
2487 2488
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("fd must be valid"));
2489 2490 2491 2492
        return -1;
    }

    if (!mon->hasSendFD) {
2493
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
2494 2495
                       _("qemu is not using a unix socket monitor, "
                         "cannot send fd %s"), fdname);
2496 2497 2498
        return -1;
    }

D
Daniel P. Berrange 已提交
2499
    if (mon->json)
2500
        return qemuMonitorJSONSendFileHandle(mon, fdname, fd);
D
Daniel P. Berrange 已提交
2501
    else
2502
        return qemuMonitorTextSendFileHandle(mon, fdname, fd);
2503 2504 2505
}


2506 2507 2508
int
qemuMonitorCloseFileHandle(qemuMonitorPtr mon,
                           const char *fdname)
2509
{
2510 2511 2512
    int ret = -1;
    virErrorPtr error;

2513
    VIR_DEBUG("fdname=%s", fdname);
2514

2515 2516
    error = virSaveLastError();

2517
    QEMU_CHECK_MONITOR_GOTO(mon, cleanup);
2518

D
Daniel P. Berrange 已提交
2519 2520 2521 2522
    if (mon->json)
        ret = qemuMonitorJSONCloseFileHandle(mon, fdname);
    else
        ret = qemuMonitorTextCloseFileHandle(mon, fdname);
2523

2524
 cleanup:
2525 2526 2527 2528
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
D
Daniel P. Berrange 已提交
2529
    return ret;
2530 2531 2532
}


2533 2534 2535 2536 2537 2538
/* Add the open file descriptor FD into the non-negative set FDSET.
 * If NAME is present, it will be passed along for logging purposes.
 * Returns the counterpart fd that qemu received, or -1 on error.  */
int
qemuMonitorAddFd(qemuMonitorPtr mon, int fdset, int fd, const char *name)
{
2539
    VIR_DEBUG("fdset=%d, fd=%d, name=%s", fdset, fd, NULLSTR(name));
2540

2541
    QEMU_CHECK_MONITOR_JSON(mon);
2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555

    if (fd < 0 || fdset < 0) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("fd and fdset must be valid"));
        return -1;
    }

    if (!mon->hasSendFD) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                       _("qemu is not using a unix socket monitor, "
                         "cannot send fd %s"), NULLSTR(name));
        return -1;
    }

2556
    return qemuMonitorJSONAddFd(mon, fdset, fd, name);
2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568
}


/* Remove one of qemu's fds from the given FDSET, or if FD is
 * negative, remove the entire set.  Preserve any previous error on
 * entry.  Returns 0 on success, -1 on error.  */
int
qemuMonitorRemoveFd(qemuMonitorPtr mon, int fdset, int fd)
{
    int ret = -1;
    virErrorPtr error;

2569
    VIR_DEBUG("fdset=%d, fd=%d", fdset, fd);
2570 2571 2572

    error = virSaveLastError();

2573
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, cleanup);
2574

2575
    ret = qemuMonitorJSONRemoveFd(mon, fdset, fd);
2576

2577
 cleanup:
2578 2579 2580 2581 2582 2583 2584 2585
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
    return ret;
}


2586 2587 2588 2589 2590
int
qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
                          const char *netstr,
                          int *tapfd, char **tapfdName, int tapfdSize,
                          int *vhostfd, char **vhostfdName, int vhostfdSize)
2591
{
2592
    int ret = -1;
2593
    size_t i = 0, j = 0;
2594

2595
    VIR_DEBUG("netstr=%s tapfd=%p tapfdName=%p tapfdSize=%d "
2596
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
2597
              netstr, tapfd, tapfdName, tapfdSize,
2598
              vhostfd, vhostfdName, vhostfdSize);
2599

2600
    QEMU_CHECK_MONITOR(mon);
2601

2602 2603 2604 2605 2606 2607 2608
    for (i = 0; i < tapfdSize; i++) {
        if (qemuMonitorSendFileHandle(mon, tapfdName[i], tapfd[i]) < 0)
            goto cleanup;
    }
    for (j = 0; j < vhostfdSize; j++) {
        if (qemuMonitorSendFileHandle(mon, vhostfdName[j], vhostfd[j]) < 0)
            goto cleanup;
2609 2610
    }

D
Daniel P. Berrange 已提交
2611
    if (mon->json)
2612
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2613
                       _("JSON monitor should be using AddNetdev"));
D
Daniel P. Berrange 已提交
2614 2615
    else
        ret = qemuMonitorTextAddHostNetwork(mon, netstr);
2616

2617
 cleanup:
2618
    if (ret < 0) {
2619 2620 2621 2622 2623 2624 2625 2626
        while (i--) {
            if (qemuMonitorCloseFileHandle(mon, tapfdName[i]) < 0)
                VIR_WARN("failed to close device handle '%s'", tapfdName[i]);
        }
        while (j--) {
            if (qemuMonitorCloseFileHandle(mon, vhostfdName[j]) < 0)
                VIR_WARN("failed to close device handle '%s'", vhostfdName[j]);
        }
2627 2628
    }

D
Daniel P. Berrange 已提交
2629
    return ret;
2630 2631 2632
}


2633 2634 2635 2636
int
qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
                             int vlan,
                             const char *netname)
2637
{
2638
    VIR_DEBUG("netname=%s", netname);
2639

2640
    QEMU_CHECK_MONITOR(mon);
2641

2642
    if (mon->json) {
2643
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2644
                       _("JSON monitor should be using RemoveNetdev"));
2645 2646 2647 2648
        return -1;
    }

    return qemuMonitorTextRemoveHostNetwork(mon, vlan, netname);
2649
}
2650

2651

2652 2653 2654 2655 2656
int
qemuMonitorAddNetdev(qemuMonitorPtr mon,
                     const char *netdevstr,
                     int *tapfd, char **tapfdName, int tapfdSize,
                     int *vhostfd, char **vhostfdName, int vhostfdSize)
2657
{
2658
    int ret = -1;
2659
    size_t i = 0, j = 0;
2660

2661
    VIR_DEBUG("netdevstr=%s tapfd=%p tapfdName=%p tapfdSize=%d"
2662
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
2663
              netdevstr, tapfd, tapfdName, tapfdSize,
2664
              vhostfd, vhostfdName, vhostfdSize);
2665

2666
    QEMU_CHECK_MONITOR(mon);
2667

2668 2669 2670 2671 2672 2673 2674
    for (i = 0; i < tapfdSize; i++) {
        if (qemuMonitorSendFileHandle(mon, tapfdName[i], tapfd[i]) < 0)
            goto cleanup;
    }
    for (j = 0; j < vhostfdSize; j++) {
        if (qemuMonitorSendFileHandle(mon, vhostfdName[j], vhostfd[j]) < 0)
            goto cleanup;
2675 2676
    }

2677 2678 2679 2680
    if (mon->json)
        ret = qemuMonitorJSONAddNetdev(mon, netdevstr);
    else
        ret = qemuMonitorTextAddNetdev(mon, netdevstr);
2681

2682
 cleanup:
2683
    if (ret < 0) {
2684 2685 2686 2687 2688 2689 2690 2691
        while (i--) {
            if (qemuMonitorCloseFileHandle(mon, tapfdName[i]) < 0)
                VIR_WARN("failed to close device handle '%s'", tapfdName[i]);
        }
        while (j--) {
            if (qemuMonitorCloseFileHandle(mon, vhostfdName[j]) < 0)
                VIR_WARN("failed to close device handle '%s'", vhostfdName[j]);
        }
2692 2693
    }

2694 2695 2696
    return ret;
}

2697 2698 2699 2700

int
qemuMonitorRemoveNetdev(qemuMonitorPtr mon,
                        const char *alias)
2701
{
2702
    VIR_DEBUG("alias=%s", alias);
2703

2704
    QEMU_CHECK_MONITOR(mon);
2705 2706

    if (mon->json)
2707
        return qemuMonitorJSONRemoveNetdev(mon, alias);
2708
    else
2709
        return qemuMonitorTextRemoveNetdev(mon, alias);
2710 2711 2712
}


2713 2714 2715 2716
int
qemuMonitorQueryRxFilter(qemuMonitorPtr mon, const char *alias,
                         virNetDevRxFilterPtr *filter)
{
2717
    VIR_DEBUG("alias=%s filter=%p", alias, filter);
2718

2719
    QEMU_CHECK_MONITOR_JSON(mon);
2720 2721

    return qemuMonitorJSONQueryRxFilter(mon, alias, filter);
2722 2723 2724
}


2725
void
2726 2727 2728 2729 2730 2731 2732 2733 2734 2735
qemuMonitorChardevInfoFree(void *data,
                           const void *name ATTRIBUTE_UNUSED)
{
    qemuMonitorChardevInfoPtr info = data;

    VIR_FREE(info->ptyPath);
    VIR_FREE(info);
}


2736 2737 2738
int
qemuMonitorGetChardevInfo(qemuMonitorPtr mon,
                          virHashTablePtr *retinfo)
2739
{
2740
    int ret;
2741 2742
    virHashTablePtr info = NULL;

2743
    VIR_DEBUG("retinfo=%p", retinfo);
2744

2745
    QEMU_CHECK_MONITOR_GOTO(mon, error);
2746

2747
    if (!(info = virHashCreate(10, qemuMonitorChardevInfoFree)))
2748 2749
        goto error;

2750
    if (mon->json)
2751
        ret = qemuMonitorJSONGetChardevInfo(mon, info);
2752
    else
2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764
        ret = qemuMonitorTextGetChardevInfo(mon, info);

    if (ret < 0)
        goto error;

    *retinfo = info;
    return 0;

 error:
    virHashFree(info);
    *retinfo = NULL;
    return -1;
2765
}
2766 2767


2768 2769 2770 2771
int
qemuMonitorAttachPCIDiskController(qemuMonitorPtr mon,
                                   const char *bus,
                                   virDevicePCIAddress *guestAddr)
2772
{
2773
    VIR_DEBUG("type=%s", bus);
2774

2775
    QEMU_CHECK_MONITOR(mon);
2776

2777
    if (mon->json)
2778
        return qemuMonitorJSONAttachPCIDiskController(mon, bus, guestAddr);
2779
    else
2780
        return qemuMonitorTextAttachPCIDiskController(mon, bus, guestAddr);
2781
}
2782 2783


2784 2785 2786 2787 2788
int
qemuMonitorAttachDrive(qemuMonitorPtr mon,
                       const char *drivestr,
                       virDevicePCIAddress *controllerAddr,
                       virDomainDeviceDriveAddress *driveAddr)
2789
{
2790 2791
    VIR_DEBUG("drivestr=%s domain=%d bus=%d slot=%d function=%d",
              drivestr, controllerAddr->domain, controllerAddr->bus,
2792
              controllerAddr->slot, controllerAddr->function);
2793

2794
    QEMU_CHECK_MONITOR_JSON(mon);
2795

2796
    return qemuMonitorTextAttachDrive(mon, drivestr, controllerAddr, driveAddr);
2797
}
2798

2799 2800 2801 2802

int
qemuMonitorGetAllPCIAddresses(qemuMonitorPtr mon,
                              qemuMonitorPCIAddress **addrs)
2803
{
2804
    VIR_DEBUG("addrs=%p", addrs);
2805

2806
    QEMU_CHECK_MONITOR(mon);
2807

2808
    if (mon->json)
2809
        return qemuMonitorJSONGetAllPCIAddresses(mon, addrs);
2810
    else
2811
        return qemuMonitorTextGetAllPCIAddresses(mon, addrs);
2812
}
2813

2814 2815 2816 2817

int
qemuMonitorDriveDel(qemuMonitorPtr mon,
                    const char *drivestr)
2818
{
2819
    VIR_DEBUG("drivestr=%s", drivestr);
2820

2821
    QEMU_CHECK_MONITOR(mon);
2822 2823

    if (mon->json)
2824
        return qemuMonitorJSONDriveDel(mon, drivestr);
2825
    else
2826
        return qemuMonitorTextDriveDel(mon, drivestr);
2827 2828
}

2829 2830 2831 2832

int
qemuMonitorDelDevice(qemuMonitorPtr mon,
                     const char *devalias)
2833
{
2834
    VIR_DEBUG("devalias=%s", devalias);
2835

2836
    QEMU_CHECK_MONITOR(mon);
2837

2838
    if (mon->json)
2839
        return qemuMonitorJSONDelDevice(mon, devalias);
2840
    else
2841
        return qemuMonitorTextDelDevice(mon, devalias);
2842 2843
}

2844

2845 2846 2847 2848 2849
int
qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
                           const char *devicestr,
                           int fd,
                           const char *fdname)
2850
{
2851
    VIR_DEBUG("device=%s fd=%d fdname=%s", devicestr, fd, NULLSTR(fdname));
2852 2853
    int ret;

2854
    QEMU_CHECK_MONITOR(mon);
2855

2856 2857 2858
    if (fd >= 0 && qemuMonitorSendFileHandle(mon, fdname, fd) < 0)
        return -1;

2859 2860 2861 2862
    if (mon->json)
        ret = qemuMonitorJSONAddDevice(mon, devicestr);
    else
        ret = qemuMonitorTextAddDevice(mon, devicestr);
2863 2864 2865 2866 2867 2868

    if (ret < 0 && fd >= 0) {
        if (qemuMonitorCloseFileHandle(mon, fdname) < 0)
            VIR_WARN("failed to close device handle '%s'", fdname);
    }

2869 2870 2871
    return ret;
}

2872 2873 2874 2875

int
qemuMonitorAddDevice(qemuMonitorPtr mon,
                     const char *devicestr)
2876 2877 2878 2879
{
    return qemuMonitorAddDeviceWithFd(mon, devicestr, -1, NULL);
}

2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896

/**
 * qemuMonitorAddObject:
 * @mon: Pointer to monitor object
 * @type: Type name of object to add
 * @objalias: Alias of the new object
 * @props: Optional arguments for the given type. The object is consumed and
 *         should not be referenced by the caller after this function returns.
 *
 * Returns 0 on success -1 on error.
 */
int
qemuMonitorAddObject(qemuMonitorPtr mon,
                     const char *type,
                     const char *objalias,
                     virJSONValuePtr props)
{
2897
    VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props);
2898

2899
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, error);
2900

2901
    return qemuMonitorJSONAddObject(mon, type, objalias, props);
2902 2903 2904 2905 2906

 error:
    virJSONValueFree(props);
    return -1;
}
2907 2908 2909 2910 2911 2912


int
qemuMonitorDelObject(qemuMonitorPtr mon,
                     const char *objalias)
{
2913
    VIR_DEBUG("objalias=%s", objalias);
2914

2915
    QEMU_CHECK_MONITOR_JSON(mon);
2916

2917
    return qemuMonitorJSONDelObject(mon, objalias);
2918 2919 2920
}


2921 2922 2923
int
qemuMonitorAddDrive(qemuMonitorPtr mon,
                    const char *drivestr)
2924
{
2925
    VIR_DEBUG("drive=%s", drivestr);
2926

2927
    QEMU_CHECK_MONITOR(mon);
2928

2929
    if (mon->json)
2930
        return qemuMonitorJSONAddDrive(mon, drivestr);
2931
    else
2932
        return qemuMonitorTextAddDrive(mon, drivestr);
2933
}
2934 2935


2936 2937 2938 2939
int
qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
                              const char *alias,
                              const char *passphrase)
2940
{
2941
    VIR_DEBUG("alias=%s passphrase=%p(value hidden)", alias, passphrase);
2942

2943
    QEMU_CHECK_MONITOR(mon);
2944

2945
    if (mon->json)
2946
        return qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase);
2947
    else
2948
        return qemuMonitorTextSetDrivePassphrase(mon, alias, passphrase);
2949
}
C
Chris Lalancette 已提交
2950

2951 2952 2953

int
qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name)
C
Chris Lalancette 已提交
2954
{
2955
    VIR_DEBUG("name=%s", name);
C
Chris Lalancette 已提交
2956

2957
    QEMU_CHECK_MONITOR(mon);
2958

C
Chris Lalancette 已提交
2959
    if (mon->json)
2960
        return qemuMonitorJSONCreateSnapshot(mon, name);
C
Chris Lalancette 已提交
2961
    else
2962
        return qemuMonitorTextCreateSnapshot(mon, name);
C
Chris Lalancette 已提交
2963 2964
}

2965 2966
int
qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name)
C
Chris Lalancette 已提交
2967
{
2968
    VIR_DEBUG("name=%s", name);
C
Chris Lalancette 已提交
2969

2970
    QEMU_CHECK_MONITOR(mon);
2971

C
Chris Lalancette 已提交
2972
    if (mon->json)
2973
        return qemuMonitorJSONLoadSnapshot(mon, name);
C
Chris Lalancette 已提交
2974
    else
2975
        return qemuMonitorTextLoadSnapshot(mon, name);
C
Chris Lalancette 已提交
2976 2977
}

2978 2979 2980

int
qemuMonitorDeleteSnapshot(qemuMonitorPtr mon, const char *name)
C
Chris Lalancette 已提交
2981
{
2982
    VIR_DEBUG("name=%s", name);
C
Chris Lalancette 已提交
2983

2984
    QEMU_CHECK_MONITOR(mon);
2985

C
Chris Lalancette 已提交
2986
    if (mon->json)
2987
        return qemuMonitorJSONDeleteSnapshot(mon, name);
C
Chris Lalancette 已提交
2988
    else
2989
        return qemuMonitorTextDeleteSnapshot(mon, name);
C
Chris Lalancette 已提交
2990
}
2991

2992

2993 2994 2995 2996
/* Use the snapshot_blkdev command to convert the existing file for
 * device into a read-only backing file of a new qcow2 image located
 * at file.  */
int
2997
qemuMonitorDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
2998 2999
                        const char *device, const char *file,
                        const char *format, bool reuse)
3000
{
3001 3002
    VIR_DEBUG("actions=%p, device=%s, file=%s, format=%s, reuse=%d",
              actions, device, file, format, reuse);
3003

3004
    QEMU_CHECK_MONITOR_JSON(mon);
3005 3006

    return qemuMonitorJSONDiskSnapshot(mon, actions, device, file, format, reuse);
3007 3008
}

3009

3010
/* Start a drive-mirror block job.  bandwidth is in bytes/sec.  */
3011 3012 3013
int
qemuMonitorDriveMirror(qemuMonitorPtr mon,
                       const char *device, const char *file,
3014
                       const char *format, unsigned long long bandwidth,
3015
                       unsigned int granularity, unsigned long long buf_size,
3016 3017
                       unsigned int flags)
{
3018
    VIR_DEBUG("device=%s, file=%s, format=%s, bandwidth=%lld, "
3019
              "granularity=%#x, buf_size=%lld, flags=%x",
3020
              device, file, NULLSTR(format), bandwidth, granularity,
3021
              buf_size, flags);
3022

3023
    QEMU_CHECK_MONITOR_JSON(mon);
3024 3025 3026

    return qemuMonitorJSONDriveMirror(mon, device, file, format, bandwidth,
                                      granularity, buf_size, flags);
3027 3028
}

3029

3030 3031 3032 3033
/* Use the transaction QMP command to run atomic snapshot commands.  */
int
qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr actions)
{
3034
    VIR_DEBUG("actions=%p", actions);
3035

3036
    QEMU_CHECK_MONITOR_JSON(mon);
3037 3038

    return qemuMonitorJSONTransaction(mon, actions);
3039 3040
}

3041

3042
/* Start a block-commit block job.  bandwidth is in bytes/sec.  */
3043 3044 3045
int
qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device,
                       const char *top, const char *base,
3046
                       const char *backingName,
3047
                       unsigned long long bandwidth)
3048
{
3049 3050
    VIR_DEBUG("device=%s, top=%s, base=%s, backingName=%s, bandwidth=%llu",
              device, top, base, NULLSTR(backingName), bandwidth);
3051

3052
    QEMU_CHECK_MONITOR_JSON(mon);
3053 3054 3055

    return qemuMonitorJSONBlockCommit(mon, device, top, base,
                                         backingName, bandwidth);
3056 3057
}

3058 3059 3060 3061 3062

/* Probe whether active commits are supported by a given qemu binary. */
bool
qemuMonitorSupportsActiveCommit(qemuMonitorPtr mon)
{
3063
    if (!mon || !mon->json)
3064 3065
        return false;

3066
    return qemuMonitorJSONBlockCommit(mon, "bogus", NULL, NULL, NULL, 0) == -2;
3067 3068 3069
}


3070 3071 3072 3073 3074 3075 3076 3077
/* Determine the name that qemu is using for tracking the backing
 * element TARGET within the chain starting at TOP.  */
char *
qemuMonitorDiskNameLookup(qemuMonitorPtr mon,
                          const char *device,
                          virStorageSourcePtr top,
                          virStorageSourcePtr target)
{
3078
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
3079 3080 3081 3082 3083

    return qemuMonitorJSONDiskNameLookup(mon, device, top, target);
}


3084
/* Use the block-job-complete monitor command to pivot a block copy job.  */
3085
int
3086 3087
qemuMonitorDrivePivot(qemuMonitorPtr mon,
                      const char *device)
3088
{
3089
    VIR_DEBUG("device=%s", device);
3090

3091
    QEMU_CHECK_MONITOR_JSON(mon);
3092 3093

    return qemuMonitorJSONDrivePivot(mon, device);
3094 3095
}

3096 3097 3098 3099 3100 3101

int
qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
                            const char *cmd,
                            char **reply,
                            bool hmp)
3102
{
3103 3104 3105
    VIR_DEBUG("cmd=%s, reply=%p, hmp=%d", cmd, reply, hmp);

    QEMU_CHECK_MONITOR(mon);
3106 3107

    if (mon->json)
3108
        return qemuMonitorJSONArbitraryCommand(mon, cmd, reply, hmp);
3109
    else
3110
        return qemuMonitorTextArbitraryCommand(mon, cmd, reply);
3111
}
3112 3113


3114 3115
int
qemuMonitorInjectNMI(qemuMonitorPtr mon)
3116
{
3117
    QEMU_CHECK_MONITOR(mon);
3118 3119

    if (mon->json)
3120
        return qemuMonitorJSONInjectNMI(mon);
3121
    else
3122
        return qemuMonitorTextInjectNMI(mon);
3123
}
3124

3125 3126 3127 3128 3129 3130

int
qemuMonitorSendKey(qemuMonitorPtr mon,
                   unsigned int holdtime,
                   unsigned int *keycodes,
                   unsigned int nkeycodes)
3131
{
3132 3133 3134
    VIR_DEBUG("holdtime=%u, nkeycodes=%u", holdtime, nkeycodes);

    QEMU_CHECK_MONITOR(mon);
3135 3136

    if (mon->json)
3137
        return qemuMonitorJSONSendKey(mon, holdtime, keycodes, nkeycodes);
3138
    else
3139
        return qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes);
3140 3141
}

3142 3143 3144 3145

int
qemuMonitorScreendump(qemuMonitorPtr mon,
                      const char *file)
3146
{
3147
    VIR_DEBUG("file=%s", file);
3148

3149
    QEMU_CHECK_MONITOR(mon);
3150 3151

    if (mon->json)
3152
        return qemuMonitorJSONScreendump(mon, file);
3153
    else
3154
        return qemuMonitorTextScreendump(mon, file);
3155
}
3156

3157

3158
/* bandwidth is in bytes/sec */
3159
int
3160 3161 3162 3163 3164 3165
qemuMonitorBlockStream(qemuMonitorPtr mon,
                       const char *device,
                       const char *base,
                       const char *backingName,
                       unsigned long long bandwidth,
                       bool modern)
3166
{
3167 3168
    VIR_DEBUG("device=%s, base=%s, backingName=%s, bandwidth=%lluB, modern=%d",
              device, NULLSTR(base), NULLSTR(backingName), bandwidth, modern);
3169

3170
    QEMU_CHECK_MONITOR_JSON(mon);
3171 3172 3173

    return qemuMonitorJSONBlockStream(mon, device, base, backingName,
                                      bandwidth, modern);
3174
}
3175

3176

3177 3178 3179 3180 3181
int
qemuMonitorBlockJobCancel(qemuMonitorPtr mon,
                          const char *device,
                          bool modern)
{
3182
    VIR_DEBUG("device=%s, modern=%d", device, modern);
3183

3184
    QEMU_CHECK_MONITOR_JSON(mon);
3185 3186 3187 3188 3189

    return qemuMonitorJSONBlockJobCancel(mon, device, modern);
}


3190 3191 3192 3193 3194 3195
int
qemuMonitorBlockJobSetSpeed(qemuMonitorPtr mon,
                            const char *device,
                            unsigned long long bandwidth,
                            bool modern)
{
3196
    VIR_DEBUG("device=%s, bandwidth=%lluB, modern=%d", device, bandwidth, modern);
3197

3198
    QEMU_CHECK_MONITOR_JSON(mon);
3199 3200 3201 3202 3203

    return qemuMonitorJSONBlockJobSetSpeed(mon, device, bandwidth, modern);
}


3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216
virHashTablePtr
qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
    return qemuMonitorJSONGetAllBlockJobInfo(mon);
}


/**
 * qemuMonitorGetBlockJobInfo:
 * Parse Block Job information, and populate info for the named device.
 * Return 1 if info available, 0 if device has no block job, and -1 on error.
 */
3217
int
3218 3219 3220
qemuMonitorGetBlockJobInfo(qemuMonitorPtr mon,
                           const char *alias,
                           qemuMonitorBlockJobInfoPtr info)
3221
{
3222 3223 3224
    virHashTablePtr all;
    qemuMonitorBlockJobInfoPtr data;
    int ret = 0;
3225

3226 3227 3228 3229
    VIR_DEBUG("alias=%s, info=%p", alias, info);

    if (!(all = qemuMonitorGetAllBlockJobInfo(mon)))
        return -1;
3230

3231 3232 3233 3234 3235 3236 3237
    if ((data = virHashLookup(all, alias))) {
        *info = *data;
        ret = 1;
    }

    virHashFree(all);
    return ret;
3238 3239 3240
}


3241 3242 3243 3244 3245
int
qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon,
                              const char *device,
                              virDomainBlockIoTuneInfoPtr info,
                              bool supportMaxOptions)
3246
{
3247 3248 3249
    VIR_DEBUG("device=%p, info=%p", device, info);

    QEMU_CHECK_MONITOR(mon);
3250

3251 3252 3253 3254
    if (mon->json)
        return qemuMonitorJSONSetBlockIoThrottle(mon, device, info, supportMaxOptions);
    else
        return qemuMonitorTextSetBlockIoThrottle(mon, device, info);
3255 3256
}

3257 3258 3259 3260 3261 3262

int
qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon,
                              const char *device,
                              virDomainBlockIoTuneInfoPtr reply,
                              bool supportMaxOptions)
3263
{
3264 3265 3266
    VIR_DEBUG("device=%p, reply=%p", device, reply);

    QEMU_CHECK_MONITOR(mon);
3267

3268 3269 3270 3271
    if (mon->json)
        return qemuMonitorJSONGetBlockIoThrottle(mon, device, reply, supportMaxOptions);
    else
        return qemuMonitorTextGetBlockIoThrottle(mon, device, reply);
3272 3273 3274
}


3275 3276
int
qemuMonitorVMStatusToPausedReason(const char *status)
3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318
{
    int st;

    if (!status)
        return VIR_DOMAIN_PAUSED_UNKNOWN;

    if ((st = qemuMonitorVMStatusTypeFromString(status)) < 0) {
        VIR_WARN("Qemu reported unknown VM status: '%s'", status);
        return VIR_DOMAIN_PAUSED_UNKNOWN;
    }

    switch ((qemuMonitorVMStatus) st) {
    case QEMU_MONITOR_VM_STATUS_DEBUG:
    case QEMU_MONITOR_VM_STATUS_INTERNAL_ERROR:
    case QEMU_MONITOR_VM_STATUS_RESTORE_VM:
        return VIR_DOMAIN_PAUSED_UNKNOWN;

    case QEMU_MONITOR_VM_STATUS_INMIGRATE:
    case QEMU_MONITOR_VM_STATUS_POSTMIGRATE:
    case QEMU_MONITOR_VM_STATUS_FINISH_MIGRATE:
        return VIR_DOMAIN_PAUSED_MIGRATION;

    case QEMU_MONITOR_VM_STATUS_IO_ERROR:
        return VIR_DOMAIN_PAUSED_IOERROR;

    case QEMU_MONITOR_VM_STATUS_PAUSED:
    case QEMU_MONITOR_VM_STATUS_PRELAUNCH:
        return VIR_DOMAIN_PAUSED_USER;

    case QEMU_MONITOR_VM_STATUS_RUNNING:
        VIR_WARN("Qemu reports the guest is paused but status is 'running'");
        return VIR_DOMAIN_PAUSED_UNKNOWN;

    case QEMU_MONITOR_VM_STATUS_SAVE_VM:
        return VIR_DOMAIN_PAUSED_SAVE;

    case QEMU_MONITOR_VM_STATUS_SHUTDOWN:
        return VIR_DOMAIN_PAUSED_SHUTTING_DOWN;

    case QEMU_MONITOR_VM_STATUS_WATCHDOG:
        return VIR_DOMAIN_PAUSED_WATCHDOG;

3319
    case QEMU_MONITOR_VM_STATUS_GUEST_PANICKED:
3320
        return VIR_DOMAIN_PAUSED_CRASHED;
3321

3322 3323 3324 3325 3326 3327
    /* unreachable from this point on */
    case QEMU_MONITOR_VM_STATUS_LAST:
        ;
    }
    return VIR_DOMAIN_PAUSED_UNKNOWN;
}
3328 3329


3330 3331 3332 3333 3334 3335
int
qemuMonitorOpenGraphics(qemuMonitorPtr mon,
                        const char *protocol,
                        int fd,
                        const char *fdname,
                        bool skipauth)
3336
{
3337 3338
    VIR_DEBUG("protocol=%s fd=%d fdname=%s skipauth=%d",
              protocol, fd, NULLSTR(fdname), skipauth);
3339 3340
    int ret;

3341
    QEMU_CHECK_MONITOR(mon);
3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357

    if (qemuMonitorSendFileHandle(mon, fdname, fd) < 0)
        return -1;

    if (mon->json)
        ret = qemuMonitorJSONOpenGraphics(mon, protocol, fdname, skipauth);
    else
        ret = qemuMonitorTextOpenGraphics(mon, protocol, fdname, skipauth);

    if (ret < 0) {
        if (qemuMonitorCloseFileHandle(mon, fdname) < 0)
            VIR_WARN("failed to close device handle '%s'", fdname);
    }

    return ret;
}
3358

3359 3360 3361

int
qemuMonitorSystemWakeup(qemuMonitorPtr mon)
3362
{
3363
    QEMU_CHECK_MONITOR_JSON(mon);
3364 3365 3366

    return qemuMonitorJSONSystemWakeup(mon);
}
3367

3368 3369 3370 3371 3372 3373 3374

int
qemuMonitorGetVersion(qemuMonitorPtr mon,
                      int *major,
                      int *minor,
                      int *micro,
                      char **package)
3375
{
3376 3377
    VIR_DEBUG("major=%p minor=%p micro=%p package=%p",
              major, minor, micro, package);
3378

3379
    QEMU_CHECK_MONITOR_JSON(mon);
3380 3381 3382

    return qemuMonitorJSONGetVersion(mon, major, minor, micro, package);
}
3383

3384 3385 3386 3387

int
qemuMonitorGetMachines(qemuMonitorPtr mon,
                       qemuMonitorMachineInfoPtr **machines)
3388
{
3389
    VIR_DEBUG("machines=%p", machines);
3390

3391
    QEMU_CHECK_MONITOR_JSON(mon);
3392 3393 3394 3395

    return qemuMonitorJSONGetMachines(mon, machines);
}

3396 3397 3398

void
qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine)
3399 3400 3401 3402 3403 3404 3405
{
    if (!machine)
        return;
    VIR_FREE(machine->name);
    VIR_FREE(machine->alias);
    VIR_FREE(machine);
}
3406

3407 3408 3409 3410

int
qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon,
                             char ***cpus)
3411
{
3412
    VIR_DEBUG("cpus=%p", cpus);
3413

3414
    QEMU_CHECK_MONITOR_JSON(mon);
3415 3416 3417

    return qemuMonitorJSONGetCPUDefinitions(mon, cpus);
}
3418 3419


3420 3421 3422
int
qemuMonitorGetCommands(qemuMonitorPtr mon,
                       char ***commands)
3423
{
3424
    VIR_DEBUG("commands=%p", commands);
3425

3426
    QEMU_CHECK_MONITOR_JSON(mon);
3427 3428 3429

    return qemuMonitorJSONGetCommands(mon, commands);
}
3430 3431


3432 3433 3434
int
qemuMonitorGetEvents(qemuMonitorPtr mon,
                     char ***events)
3435
{
3436
    VIR_DEBUG("events=%p", events);
3437

3438
    QEMU_CHECK_MONITOR_JSON(mon);
3439 3440 3441

    return qemuMonitorJSONGetEvents(mon, events);
}
3442 3443


3444 3445 3446 3447 3448
/* Collect the parameters associated with a given command line option.
 * Return count of known parameters or -1 on error.  */
int
qemuMonitorGetCommandLineOptionParameters(qemuMonitorPtr mon,
                                          const char *option,
3449 3450
                                          char ***params,
                                          bool *found)
3451
{
3452
    VIR_DEBUG("option=%s params=%p", option, params);
3453

3454
    QEMU_CHECK_MONITOR_JSON(mon);
3455

3456 3457
    return qemuMonitorJSONGetCommandLineOptionParameters(mon, option,
                                                         params, found);
3458 3459 3460
}


3461 3462 3463 3464
int
qemuMonitorGetKVMState(qemuMonitorPtr mon,
                       bool *enabled,
                       bool *present)
3465
{
3466
    VIR_DEBUG("enabled=%p present=%p", enabled, present);
3467

3468
    QEMU_CHECK_MONITOR_JSON(mon);
3469 3470 3471 3472 3473

    return qemuMonitorJSONGetKVMState(mon, enabled, present);
}


3474 3475 3476
int
qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
                          char ***types)
3477
{
3478
    VIR_DEBUG("types=%p", types);
3479

3480
    QEMU_CHECK_MONITOR_JSON(mon);
3481 3482 3483

    return qemuMonitorJSONGetObjectTypes(mon, types);
}
3484 3485


3486 3487 3488 3489
int
qemuMonitorGetObjectProps(qemuMonitorPtr mon,
                          const char *type,
                          char ***props)
3490
{
3491
    VIR_DEBUG("type=%s props=%p", type, props);
3492

3493
    QEMU_CHECK_MONITOR_JSON(mon);
3494 3495 3496

    return qemuMonitorJSONGetObjectProps(mon, type, props);
}
3497 3498


3499 3500
char *
qemuMonitorGetTargetArch(qemuMonitorPtr mon)
3501
{
3502
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
3503 3504 3505

    return qemuMonitorJSONGetTargetArch(mon);
}
3506 3507


3508 3509 3510 3511
int
qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon,
                                    char ***capabilities)
{
3512
    QEMU_CHECK_MONITOR(mon);
3513 3514 3515 3516 3517 3518 3519 3520 3521

    /* No capability is supported without JSON monitor */
    if (!mon->json)
        return 0;

    return qemuMonitorJSONGetMigrationCapabilities(mon, capabilities);
}


3522 3523 3524
/**
 * Returns 1 if @capability is supported, 0 if it's not, or -1 on error.
 */
3525 3526 3527
int
qemuMonitorGetMigrationCapability(qemuMonitorPtr mon,
                                  qemuMonitorMigrationCaps capability)
3528
{
3529
    VIR_DEBUG("capability=%d", capability);
3530

3531
    QEMU_CHECK_MONITOR(mon);
3532 3533 3534 3535 3536 3537 3538 3539

    /* No capability is supported without JSON monitor */
    if (!mon->json)
        return 0;

    return qemuMonitorJSONGetMigrationCapability(mon, capability);
}

3540 3541 3542 3543 3544

int
qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
                                  qemuMonitorMigrationCaps capability,
                                  bool state)
3545
{
3546
    VIR_DEBUG("capability=%d", capability);
3547

3548
    QEMU_CHECK_MONITOR_JSON(mon);
3549

3550
    return qemuMonitorJSONSetMigrationCapability(mon, capability, state);
3551
}
3552

3553 3554 3555 3556 3557

int
qemuMonitorNBDServerStart(qemuMonitorPtr mon,
                          const char *host,
                          unsigned int port)
3558
{
3559
    VIR_DEBUG("host=%s port=%u", host, port);
3560

3561
    QEMU_CHECK_MONITOR_JSON(mon);
3562 3563 3564

    return qemuMonitorJSONNBDServerStart(mon, host, port);
}
3565

3566 3567 3568 3569 3570

int
qemuMonitorNBDServerAdd(qemuMonitorPtr mon,
                        const char *deviceID,
                        bool writable)
3571
{
3572
    VIR_DEBUG("deviceID=%s", deviceID);
3573

3574
    QEMU_CHECK_MONITOR_JSON(mon);
3575 3576 3577

    return qemuMonitorJSONNBDServerAdd(mon, deviceID, writable);
}
3578

3579 3580 3581

int
qemuMonitorNBDServerStop(qemuMonitorPtr mon)
3582
{
3583
    QEMU_CHECK_MONITOR_JSON(mon);
3584 3585 3586

    return qemuMonitorJSONNBDServerStop(mon);
}
S
Stefan Berger 已提交
3587 3588


3589 3590
int
qemuMonitorGetTPMModels(qemuMonitorPtr mon,
S
Stefan Berger 已提交
3591 3592
                            char ***tpmmodels)
{
3593
    VIR_DEBUG("tpmmodels=%p", tpmmodels);
S
Stefan Berger 已提交
3594

3595
    QEMU_CHECK_MONITOR_JSON(mon);
S
Stefan Berger 已提交
3596 3597 3598 3599 3600

    return qemuMonitorJSONGetTPMModels(mon, tpmmodels);
}


3601 3602 3603
int
qemuMonitorGetTPMTypes(qemuMonitorPtr mon,
                       char ***tpmtypes)
S
Stefan Berger 已提交
3604
{
3605
    VIR_DEBUG("tpmtypes=%p", tpmtypes);
S
Stefan Berger 已提交
3606

3607
    QEMU_CHECK_MONITOR_JSON(mon);
S
Stefan Berger 已提交
3608 3609 3610

    return qemuMonitorJSONGetTPMTypes(mon, tpmtypes);
}
3611

3612 3613 3614 3615 3616

int
qemuMonitorAttachCharDev(qemuMonitorPtr mon,
                         const char *chrID,
                         virDomainChrSourceDefPtr chr)
3617
{
3618
    VIR_DEBUG("chrID=%s chr=%p", chrID, chr);
3619

3620
    QEMU_CHECK_MONITOR_JSON(mon);
3621 3622 3623

    return qemuMonitorJSONAttachCharDev(mon, chrID, chr);
}
3624

3625 3626 3627 3628

int
qemuMonitorDetachCharDev(qemuMonitorPtr mon,
                         const char *chrID)
3629
{
3630
    VIR_DEBUG("chrID=%s", chrID);
3631

3632
    QEMU_CHECK_MONITOR_JSON(mon);
3633 3634 3635

    return qemuMonitorJSONDetachCharDev(mon, chrID);
}
3636

3637

3638 3639 3640 3641
int
qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
                            char ***aliases)
{
3642
    VIR_DEBUG("aliases=%p", aliases);
3643

3644
    QEMU_CHECK_MONITOR_JSON(mon);
3645 3646 3647

    return qemuMonitorJSONGetDeviceAliases(mon, aliases);
}
3648 3649 3650 3651 3652 3653 3654 3655


/**
 * qemuMonitorSetDomainLog:
 * Set the file descriptor of the open VM log file to report potential
 * early startup errors of qemu.
 *
 * @mon: Monitor object to set the log file reading on
3656 3657 3658
 * @func: the callback to report errors
 * @opaque: data to pass to @func
 * @destroy: optional callback to free @opaque
3659
 */
3660 3661 3662 3663 3664
void
qemuMonitorSetDomainLog(qemuMonitorPtr mon,
                        qemuMonitorReportDomainLogError func,
                        void *opaque,
                        virFreeCallback destroy)
3665
{
3666 3667
    if (mon->logDestroy && mon->logOpaque)
        mon->logDestroy(mon->logOpaque);
3668

3669 3670 3671
    mon->logFunc = func;
    mon->logOpaque = opaque;
    mon->logDestroy = destroy;
3672
}
3673 3674 3675 3676 3677 3678


/**
 * qemuMonitorJSONGetGuestCPU:
 * @mon: Pointer to the monitor
 * @arch: arch of the guest
3679
 * @data: returns the cpu data
3680 3681 3682
 *
 * Retrieve the definition of the guest CPU from a running qemu instance.
 *
3683 3684
 * Returns 0 on success, -2 if the operation is not supported by the guest,
 * -1 on other errors.
3685
 */
3686
int
3687
qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
3688 3689
                       virArch arch,
                       virCPUDataPtr *data)
3690
{
3691
    VIR_DEBUG("arch='%s' data='%p'", virArchToString(arch), data);
3692

3693
    QEMU_CHECK_MONITOR_JSON(mon);
3694

3695 3696 3697
    *data = NULL;

    return qemuMonitorJSONGetGuestCPU(mon, arch, data);
3698
}
3699

3700

3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715
/**
 * qemuMonitorRTCResetReinjection:
 * @mon: Pointer to the monitor
 *
 * Issue rtc-reset-reinjection command.
 * This should be used in cases where guest time is restored via
 * guest agent, so RTC injection is not needed (in fact it would
 * confuse guest's RTC).
 *
 * Returns 0 on success
 *        -1 on error.
 */
int
qemuMonitorRTCResetReinjection(qemuMonitorPtr mon)
{
3716
    QEMU_CHECK_MONITOR_JSON(mon);
3717 3718 3719

    return qemuMonitorJSONRTCResetReinjection(mon);
}
3720

3721

3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734
/**
 * qemuMonitorGetIOThreads:
 * @mon: Pointer to the monitor
 * @iothreads: Location to return array of IOThreadInfo data
 *
 * Issue query-iothreads command.
 * Retrieve the list of iothreads defined/running for the machine
 *
 * Returns count of IOThreadInfo structures on success
 *        -1 on error.
 */
int
qemuMonitorGetIOThreads(qemuMonitorPtr mon,
3735
                        qemuMonitorIOThreadInfoPtr **iothreads)
3736 3737
{

3738
    VIR_DEBUG("iothreads=%p", iothreads);
3739

3740
    QEMU_CHECK_MONITOR(mon);
3741

3742
    /* Requires JSON to make the query */
3743
    if (!mon->json) {
3744 3745
        *iothreads = NULL;
        return 0;
3746 3747 3748 3749 3750
    }

    return qemuMonitorJSONGetIOThreads(mon, iothreads);
}

3751

3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767
/**
 * qemuMonitorGetMemoryDeviceInfo:
 * @mon: pointer to the monitor
 * @info: Location to return the hash of qemuMonitorMemoryDeviceInfo
 *
 * Retrieve state and addresses of frontend memory devices present in
 * the guest.
 *
 * Returns 0 on success and fills @info with a newly allocated struct; if the
 * data can't be retrieved due to lack of support in qemu, returns -2. On
 * other errors returns -1.
 */
int
qemuMonitorGetMemoryDeviceInfo(qemuMonitorPtr mon,
                               virHashTablePtr *info)
{
3768
    VIR_DEBUG("info=%p", info);
3769 3770 3771 3772
    int ret;

    *info = NULL;

3773
    QEMU_CHECK_MONITOR(mon);
3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787

    if (!mon->json)
        return -2;

    if (!(*info = virHashCreate(10, virHashValueFree)))
        return -1;

    if ((ret = qemuMonitorJSONGetMemoryDeviceInfo(mon, *info)) < 0) {
        virHashFree(*info);
        *info = NULL;
    }

    return ret;
}
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799


int
qemuMonitorMigrateIncoming(qemuMonitorPtr mon,
                           const char *uri)
{
    VIR_DEBUG("uri=%s", uri);

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONMigrateIncoming(mon, uri);
}