qemu_monitor.c 105.7 KB
Newer Older
1 2 3
/*
 * qemu_monitor.c: interaction with QEMU monitor console
 *
4
 * Copyright (C) 2006-2014 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

    /* Log file fd of the qemu process to dig for usable info */
    int logfd;
99 100
};

101 102 103 104 105
static virClassPtr qemuMonitorClass;
static void qemuMonitorDispose(void *obj);

static int qemuMonitorOnceInit(void)
{
106
    if (!(qemuMonitorClass = virClassNew(virClassForObjectLockable(),
107 108 109
                                         "qemuMonitor",
                                         sizeof(qemuMonitor),
                                         qemuMonitorDispose)))
110 111 112 113 114 115 116
        return -1;

    return 0;
}

VIR_ONCE_GLOBAL_INIT(qemuMonitor)

117

118 119
VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
              QEMU_MONITOR_MIGRATION_STATUS_LAST,
M
Michael Avdienko 已提交
120
              "inactive", "active", "completed", "failed", "cancelled", "setup")
121

122 123 124 125
VIR_ENUM_IMPL(qemuMonitorMigrationCaps,
              QEMU_MONITOR_MIGRATION_CAPS_LAST,
              "xbzrle")

126 127 128 129
VIR_ENUM_IMPL(qemuMonitorVMStatus,
              QEMU_MONITOR_VM_STATUS_LAST,
              "debug", "inmigrate", "internal-error", "io-error", "paused",
              "postmigrate", "prelaunch", "finish-migrate", "restore-vm",
130
              "running", "save-vm", "shutdown", "watchdog", "guest-panic")
131

132 133 134 135 136 137 138 139 140 141 142 143 144 145
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")

146
char *qemuMonitorEscapeArg(const char *in)
147 148
{
    int len = 0;
149
    size_t i, j;
150 151 152 153 154 155 156
    char *out;

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

    for (i = 0; in[i] != '\0'; i++) {
157
        switch (in[i]) {
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
        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++) {
174
        switch (in[i]) {
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
        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;
}

198 199
char *qemuMonitorUnescapeArg(const char *in)
{
200
    size_t i, j;
201
    char *out;
202
    int len = strlen(in);
203 204
    char next;

205
    if (VIR_ALLOC_N(out, len + 1) < 0)
206 207 208 209 210 211
        return NULL;

    for (i = j = 0; i < len; ++i) {
        next = in[i];
        if (in[i] == '\\') {
            ++i;
212
            switch (in[i]) {
213 214 215 216 217 218 219 220 221 222 223
            case 'r':
                next = '\r';
                break;
            case 'n':
                next = '\n';
                break;
            case '"':
            case '\\':
                next = in[i];
                break;
            default:
224
                /* invalid input (including trailing '\' at end of in) */
225 226 227 228 229 230 231 232 233 234 235
                VIR_FREE(out);
                return NULL;
            }
        }
        out[j++] = next;
    }
    out[j] = '\0';

    return out;
}

J
Jiri Denemark 已提交
236
#if DEBUG_RAW_IO
237
# include <c-ctype.h>
238 239
static char * qemuMonitorEscapeNonPrintable(const char *text)
{
240
    size_t i;
241
    virBuffer buf = VIR_BUFFER_INITIALIZER;
242
    for (i = 0; text[i] != '\0'; i++) {
243 244
        if (c_isprint(text[i]) ||
            text[i] == '\n' ||
E
Eric Blake 已提交
245 246
            (text[i] == '\r' && text[i + 1] == '\n'))
            virBufferAddChar(&buf, text[i]);
247
        else
248
            virBufferAsprintf(&buf, "0x%02x", text[i]);
249 250 251 252 253
    }
    return virBufferContentAndReset(&buf);
}
#endif

254
static void qemuMonitorDispose(void *obj)
255
{
256 257
    qemuMonitorPtr mon = obj;

258
    VIR_DEBUG("mon=%p", mon);
259
    if (mon->cb && mon->cb->destroy)
260
        (mon->cb->destroy)(mon, mon->vm, mon->callbackOpaque);
261 262
    virObjectUnref(mon->vm);

263
    virResetError(&mon->lastError);
264
    virCondDestroy(&mon->notify);
E
Eric Blake 已提交
265
    VIR_FREE(mon->buffer);
266
    virJSONValueFree(mon->options);
267
    VIR_FREE(mon->balloonpath);
268
    VIR_FORCE_CLOSE(mon->logfd);
269 270 271 272
}


static int
273
qemuMonitorOpenUnix(const char *monitor, pid_t cpid)
274 275 276
{
    struct sockaddr_un addr;
    int monfd;
277
    int timeout = 30; /* In seconds */
278 279
    int ret;
    size_t i = 0;
280 281

    if ((monfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
282
        virReportSystemError(errno,
283 284 285 286 287 288 289
                             "%s", _("failed to create socket"));
        return -1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    if (virStrcpyStatic(addr.sun_path, monitor) == NULL) {
290 291
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Monitor path %s too big for destination"), monitor);
292 293 294 295 296 297 298 299 300
        goto error;
    }

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

        if (ret == 0)
            break;

301
        if ((errno == ENOENT || errno == ECONNREFUSED) &&
302
            (!cpid || virProcessKill(cpid, 0) == 0)) {
303 304 305 306 307
            /* ENOENT       : Socket may not have shown up yet
             * ECONNREFUSED : Leftover socket hasn't been removed yet */
            continue;
        }

308
        virReportSystemError(errno, "%s",
309 310 311 312 313 314
                             _("failed to connect to monitor socket"));
        goto error;

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

    if (ret != 0) {
315
        virReportSystemError(errno, "%s",
316
                             _("monitor socket did not show up"));
317 318 319
        goto error;
    }

320
    return monfd;
321 322

error:
323
    VIR_FORCE_CLOSE(monfd);
324 325 326 327
    return -1;
}

static int
328
qemuMonitorOpenPty(const char *monitor)
329 330 331 332
{
    int monfd;

    if ((monfd = open(monitor, O_RDWR)) < 0) {
333 334
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Unable to open monitor path %s"), monitor);
335 336 337
        return -1;
    }

338
    return monfd;
339
}
340

341

342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
/* Get a possible error from qemu's log. This function closes the
 * corresponding log fd */
static char *
qemuMonitorGetErrorFromLog(qemuMonitorPtr mon)
{
    int len;
    char *logbuf = NULL;
    int orig_errno = errno;

    if (mon->logfd < 0)
        return NULL;

    if (VIR_ALLOC_N_QUIET(logbuf, 4096) < 0)
        goto error;

    if ((len = qemuProcessReadLog(mon->logfd, logbuf, 4096 - 1, 0, true)) <= 0)
        goto error;

cleanup:
    errno = orig_errno;
    VIR_FORCE_CLOSE(mon->logfd);
    return logbuf;

error:
    VIR_FREE(logbuf);
    goto cleanup;
}


371 372 373 374
/* This method processes data that has been received
 * from the monitor. Looking for async events and
 * replies/errors.
 */
375 376 377 378 379 380 381 382 383 384 385
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;

386
#if DEBUG_IO
387
# if DEBUG_RAW_IO
388 389
    char *str1 = qemuMonitorEscapeNonPrintable(msg ? msg->txBuffer : "");
    char *str2 = qemuMonitorEscapeNonPrintable(mon->buffer);
390
    VIR_ERROR(_("Process %d %p %p [[[[%s]]][[[%s]]]"), (int)mon->bufferOffset, mon->msg, msg, str1, str2);
391 392
    VIR_FREE(str1);
    VIR_FREE(str2);
393
# else
394
    VIR_DEBUG("Process %d", (int)mon->bufferOffset);
395
# endif
396 397
#endif

398 399 400
    PROBE(QEMU_MONITOR_IO_PROCESS,
          "mon=%p buf=%s len=%zu", mon, mon->buffer, mon->bufferOffset);

D
Daniel P. Berrange 已提交
401 402 403 404 405 406 407 408
    if (mon->json)
        len = qemuMonitorJSONIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
    else
        len = qemuMonitorTextIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
409

410
    if (len < 0)
411 412
        return -1;

E
Eric Blake 已提交
413 414
    if (len && mon->waitGreeting)
        mon->waitGreeting = false;
415

416 417 418 419 420 421 422
    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;
    }
423
#if DEBUG_IO
424
    VIR_DEBUG("Process done %d used %d", (int)mon->bufferOffset, len);
425
#endif
426 427 428 429 430 431
    if (msg && msg->finished)
        virCondBroadcast(&mon->notify);
    return len;
}


S
Stefan Berger 已提交
432
/* Call this function while holding the monitor lock. */
433 434 435 436 437 438 439 440 441 442 443 444 445
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));
446
    memset(control, 0, sizeof(control));
447 448 449 450 451 452 453 454 455 456 457

    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);
458 459 460
    /* 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);
461 462 463 464 465 466 467 468 469 470 471 472
    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;
}

S
Stefan Berger 已提交
473 474 475 476
/*
 * Called when the monitor is able to write data
 * Call this function while holding the monitor lock.
 */
477 478 479 480 481 482 483 484 485
static int
qemuMonitorIOWrite(qemuMonitorPtr mon)
{
    int done;

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

486
    if (mon->msg->txFD != -1 && !mon->hasSendFD) {
487 488
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Monitor does not support sending of file descriptors"));
489 490 491
        return -1;
    }

492 493 494 495 496 497 498 499 500 501
    if (mon->msg->txFD == -1)
        done = write(mon->fd,
                     mon->msg->txBuffer + mon->msg->txOffset,
                     mon->msg->txLength - mon->msg->txOffset);
    else
        done = qemuMonitorIOWriteWithFD(mon,
                                        mon->msg->txBuffer + mon->msg->txOffset,
                                        mon->msg->txLength - mon->msg->txOffset,
                                        mon->msg->txFD);

502 503 504 505 506 507 508 509 510 511 512 513
    PROBE(QEMU_MONITOR_IO_WRITE,
          "mon=%p buf=%s len=%d ret=%d errno=%d",
          mon,
          mon->msg->txBuffer + mon->msg->txOffset,
          mon->msg->txLength - mon->msg->txOffset,
          done, errno);

    if (mon->msg->txFD != -1)
        PROBE(QEMU_MONITOR_IO_SEND_FD,
              "mon=%p fd=%d ret=%d errno=%d",
              mon, mon->msg->txFD, done, errno);

514 515 516 517
    if (done < 0) {
        if (errno == EAGAIN)
            return 0;

518 519
        virReportSystemError(errno, "%s",
                             _("Unable to write to monitor"));
520 521 522 523 524 525 526 527
        return -1;
    }
    mon->msg->txOffset += done;
    return done;
}

/*
 * Called when the monitor has incoming data to read
S
Stefan Berger 已提交
528
 * Call this function while holding the monitor lock.
529 530 531 532 533 534 535 536 537 538 539
 *
 * 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,
540
                          mon->bufferLength + 1024) < 0)
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
            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;
556 557
            virReportSystemError(errno, "%s",
                                 _("Unable to read from monitor"));
558 559 560 561 562 563 564 565 566 567 568 569
            ret = -1;
            break;
        }
        if (got == 0)
            break;

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

570
#if DEBUG_IO
571
    VIR_DEBUG("Now read %d bytes of data", (int)mon->bufferOffset);
572
#endif
573 574 575 576 577 578 579 580 581 582 583

    return ret;
}


static void qemuMonitorUpdateWatch(qemuMonitorPtr mon)
{
    int events =
        VIR_EVENT_HANDLE_HANGUP |
        VIR_EVENT_HANDLE_ERROR;

584 585 586
    if (!mon->watch)
        return;

587
    if (mon->lastError.code == VIR_ERR_OK) {
588 589
        events |= VIR_EVENT_HANDLE_READABLE;

590
        if ((mon->msg && mon->msg->txOffset < mon->msg->txLength) &&
E
Eric Blake 已提交
591
            !mon->waitGreeting)
592 593 594 595
            events |= VIR_EVENT_HANDLE_WRITABLE;
    }

    virEventUpdateHandle(mon->watch, events);
596 597
}

598 599

static void
600 601
qemuMonitorIO(int watch, int fd, int events, void *opaque)
{
602
    qemuMonitorPtr mon = opaque;
603 604
    bool error = false;
    bool eof = false;
605
    bool hangup = false;
606

607 608
    virObjectRef(mon);

S
Stefan Berger 已提交
609
    /* lock access to the monitor and protect fd */
610
    virObjectLock(mon);
611
#if DEBUG_IO
612
    VIR_DEBUG("Monitor %p I/O on watch %d fd %d events %d", mon, watch, fd, events);
613
#endif
614
    if (mon->fd == -1 || mon->watch == 0) {
615
        virObjectUnlock(mon);
616 617 618
        virObjectUnref(mon);
        return;
    }
619

620
    if (mon->fd != fd || mon->watch != watch) {
621
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
622
            eof = true;
623 624 625
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("event from unexpected fd %d!=%d / watch %d!=%d"),
                       mon->fd, fd, mon->watch, watch);
626 627
        error = true;
    } else if (mon->lastError.code != VIR_ERR_OK) {
628
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
629
            eof = true;
630
        error = true;
631
    } else {
632 633 634
        if (events & VIR_EVENT_HANDLE_WRITABLE) {
            if (qemuMonitorIOWrite(mon) < 0)
                error = true;
635 636
            events &= ~VIR_EVENT_HANDLE_WRITABLE;
        }
637 638

        if (!error &&
639 640
            events & VIR_EVENT_HANDLE_READABLE) {
            int got = qemuMonitorIORead(mon);
641 642
            events &= ~VIR_EVENT_HANDLE_READABLE;
            if (got < 0) {
643
                error = true;
644 645 646 647 648
            } 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 */
649 650 651
                events = 0;

                if (qemuMonitorIOProcess(mon) < 0)
652
                    error = true;
653
            }
654 655
        }

656 657 658 659 660 661 662 663
        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;
            }
664 665
        }

666 667
        if (!error && !eof &&
            events & VIR_EVENT_HANDLE_ERROR) {
668 669
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Invalid file descriptor while waiting for monitor"));
670
            eof = true;
671
            events &= ~VIR_EVENT_HANDLE_ERROR;
672 673
        }
        if (!error && events) {
674 675 676
            virReportError(VIR_ERR_INTERNAL_ERROR,
                           _("Unhandled event %d for monitor fd %d"),
                           events, mon->fd);
677
            error = true;
678 679 680
        }
    }

681
    if (error || eof) {
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701
        if (hangup) {
            /* 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
             * startup phases where the message from qemu is certainly more
             * interesting than a "connection reset by peer" message.
             */
            char *qemuMessage;

            if ((qemuMessage = qemuMonitorGetErrorFromLog(mon))) {
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("early end of file from monitor: "
                                 "possible problem:\n%s"),
                               qemuMessage);
                virCopyLastError(&mon->lastError);
                virResetLastError();
            }

            VIR_FREE(qemuMessage);
        }

702 703 704 705 706 707
        if (mon->lastError.code != VIR_ERR_OK) {
            /* Already have an error, so clear any new error */
            virResetLastError();
        } else {
            virErrorPtr err = virGetLastError();
            if (!err)
708 709
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("Error while processing monitor IO"));
710 711 712 713 714 715 716 717 718 719 720 721
            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);
        }
    }
722 723 724

    qemuMonitorUpdateWatch(mon);

725 726 727
    /* 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 */
728
    if (eof) {
J
Jiri Denemark 已提交
729
        qemuMonitorEofNotifyCallback eofNotify = mon->cb->eofNotify;
730
        virDomainObjPtr vm = mon->vm;
731

732 733
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
734
        virObjectUnlock(mon);
735
        VIR_DEBUG("Triggering EOF callback");
736
        (eofNotify)(mon, vm, mon->callbackOpaque);
737
        virObjectUnref(mon);
738
    } else if (error) {
J
Jiri Denemark 已提交
739
        qemuMonitorErrorNotifyCallback errorNotify = mon->cb->errorNotify;
740
        virDomainObjPtr vm = mon->vm;
741

742 743
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
744
        virObjectUnlock(mon);
745
        VIR_DEBUG("Triggering error callback");
746
        (errorNotify)(mon, vm, mon->callbackOpaque);
747
        virObjectUnref(mon);
748
    } else {
749
        virObjectUnlock(mon);
750
        virObjectUnref(mon);
751
    }
752 753 754
}


755 756 757 758
static qemuMonitorPtr
qemuMonitorOpenInternal(virDomainObjPtr vm,
                        int fd,
                        bool hasSendFD,
E
Eric Blake 已提交
759
                        bool json,
760 761
                        qemuMonitorCallbacksPtr cb,
                        void *opaque)
762
{
763 764
    qemuMonitorPtr mon;

765
    if (!cb->eofNotify) {
766 767
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("EOF notify callback must be supplied"));
768 769
        return NULL;
    }
770 771 772 773 774
    if (!cb->errorNotify) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Error notify callback must be supplied"));
        return NULL;
    }
775

776 777 778
    if (qemuMonitorInitialize() < 0)
        return NULL;

779
    if (!(mon = virObjectLockableNew(qemuMonitorClass)))
780 781
        return NULL;

782
    mon->fd = -1;
783
    mon->logfd = -1;
784
    if (virCondInit(&mon->notify) < 0) {
785 786
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("cannot initialize monitor condition"));
787
        goto cleanup;
788
    }
789 790
    mon->fd = fd;
    mon->hasSendFD = hasSendFD;
791
    mon->vm = virObjectRef(vm);
D
Daniel P. Berrange 已提交
792
    mon->json = json;
793
    if (json)
E
Eric Blake 已提交
794
        mon->waitGreeting = true;
795
    mon->cb = cb;
796
    mon->callbackOpaque = opaque;
797

798
    if (virSetCloseExec(mon->fd) < 0) {
799 800
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to set monitor close-on-exec flag"));
801 802 803
        goto cleanup;
    }
    if (virSetNonBlock(mon->fd) < 0) {
804 805
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to put monitor into non-blocking mode"));
806 807 808 809
        goto cleanup;
    }


E
Eric Blake 已提交
810
    virObjectLock(mon);
811
    virObjectRef(mon);
812
    if ((mon->watch = virEventAddHandle(mon->fd,
813 814 815
                                        VIR_EVENT_HANDLE_HANGUP |
                                        VIR_EVENT_HANDLE_ERROR |
                                        VIR_EVENT_HANDLE_READABLE,
816
                                        qemuMonitorIO,
817 818
                                        mon,
                                        virObjectFreeCallback)) < 0) {
819
        virObjectUnref(mon);
E
Eric Blake 已提交
820
        virObjectUnlock(mon);
821 822
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("unable to register monitor events"));
823 824 825
        goto cleanup;
    }

826 827
    PROBE(QEMU_MONITOR_NEW,
          "mon=%p refs=%d fd=%d",
828
          mon, mon->parent.parent.u.s.refs, mon->fd);
829
    virObjectUnlock(mon);
830

831 832 833
    return mon;

cleanup:
834 835 836 837 838 839
    /* 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;
840 841
    /* The caller owns 'fd' on failure */
    mon->fd = -1;
842 843 844 845
    qemuMonitorClose(mon);
    return NULL;
}

846 847 848
qemuMonitorPtr
qemuMonitorOpen(virDomainObjPtr vm,
                virDomainChrSourceDefPtr config,
E
Eric Blake 已提交
849
                bool json,
850 851
                qemuMonitorCallbacksPtr cb,
                void *opaque)
852 853 854 855 856 857 858 859
{
    int fd;
    bool hasSendFD = false;
    qemuMonitorPtr ret;

    switch (config->type) {
    case VIR_DOMAIN_CHR_TYPE_UNIX:
        hasSendFD = true;
860
        if ((fd = qemuMonitorOpenUnix(config->data.nix.path, vm ? vm->pid : 0)) < 0)
861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
            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;
    }

876
    ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb, opaque);
877 878 879 880 881 882 883 884
    if (!ret)
        VIR_FORCE_CLOSE(fd);
    return ret;
}


qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm,
                                 int sockfd,
E
Eric Blake 已提交
885
                                 bool json,
886 887
                                 qemuMonitorCallbacksPtr cb,
                                 void *opaque)
888
{
889
    return qemuMonitorOpenInternal(vm, sockfd, true, json, cb, opaque);
890 891
}

892

893
void qemuMonitorClose(qemuMonitorPtr mon)
894 895
{
    if (!mon)
896
        return;
897

898
    virObjectLock(mon);
899
    PROBE(QEMU_MONITOR_CLOSE,
900
          "mon=%p refs=%d", mon, mon->parent.parent.u.s.refs);
S
Stefan Berger 已提交
901 902

    if (mon->fd >= 0) {
903
        if (mon->watch) {
904
            virEventRemoveHandle(mon->watch);
905 906
            mon->watch = 0;
        }
S
Stefan Berger 已提交
907
        VIR_FORCE_CLOSE(mon->fd);
908
    }
909

910 911 912 913 914 915 916
    /* 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();

917 918
            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
                           _("Qemu monitor was closed"));
919 920 921 922 923 924 925 926 927 928 929 930
            virCopyLastError(&mon->lastError);
            if (err) {
                virSetError(err);
                virFreeError(err);
            } else {
                virResetLastError();
            }
        }
        mon->msg->finished = 1;
        virCondSignal(&mon->notify);
    }

931
    virObjectUnlock(mon);
932
    virObjectUnref(mon);
933 934 935
}


936 937 938 939
char *qemuMonitorNextCommandID(qemuMonitorPtr mon)
{
    char *id;

940
    ignore_value(virAsprintf(&id, "libvirt-%d", ++mon->nextSerial));
941 942 943 944
    return id;
}


945 946
int qemuMonitorSend(qemuMonitorPtr mon,
                    qemuMonitorMessagePtr msg)
947
{
948
    int ret = -1;
949

E
Eric Blake 已提交
950
    /* Check whether qemu quit unexpectedly */
951 952 953 954
    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);
955 956 957
        return -1;
    }

958 959
    mon->msg = msg;
    qemuMonitorUpdateWatch(mon);
960

961 962 963 964
    PROBE(QEMU_MONITOR_SEND_MSG,
          "mon=%p msg=%s fd=%d",
          mon, mon->msg->txBuffer, mon->msg->txFD);

965
    while (!mon->msg->finished) {
966
        if (virCondWait(&mon->notify, &mon->parent.lock) < 0) {
967 968
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to wait on monitor condition"));
969
            goto cleanup;
970 971 972 973 974 975 976 977
        }
    }

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

980
    ret = 0;
981

982 983 984
cleanup:
    mon->msg = NULL;
    qemuMonitorUpdateWatch(mon);
985

986
    return ret;
987
}
988 989


990 991 992 993 994 995 996 997 998 999 1000 1001
virJSONValuePtr
qemuMonitorGetOptions(qemuMonitorPtr mon)
{
    return mon->options;
}

void
qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options)
{
    mon->options = options;
}

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025
/* Search the qom objects for the balloon driver object by it's known name
 * of "virtio-balloon-pci".  The entry for the driver will be found in the
 * returned 'type' field using the syntax "child<virtio-balloon-pci>".
 *
 * 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.
 *
 * This procedure will be call recursively until found or the qom-list is
 * exhausted.
 *
 * Returns:
 *
 *   1  - Found
 *   0  - Not found still looking
 *  -1  - Error bail out
 *
 * NOTE: This assumes we have already called qemuDomainObjEnterMonitor()
 */
static int
qemuMonitorFindBalloonObjectPath(qemuMonitorPtr mon,
                                 virDomainObjPtr vm,
                                 const char *curpath)
{
1026
    ssize_t i, j, npaths = 0, nprops = 0;
1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
    int ret = 0;
    char *nextpath = NULL;
    qemuMonitorJSONListPathPtr *paths = NULL;
    qemuMonitorJSONListPathPtr *bprops = NULL;

    if (mon->balloonpath) {
        return 1;
    } else if (mon->ballooninit) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Cannot determine balloon device path"));
        return -1;
    }

    /* Not supported */
    if (!vm->def->memballoon ||
        vm->def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Memory balloon model must be virtio to "
                         "get memballoon path"));
        return -1;
    }

    VIR_DEBUG("Searching for Balloon Object Path starting at %s", curpath);

    npaths = qemuMonitorJSONGetObjectListPaths(mon, curpath, &paths);
1052 1053
    if (npaths < 0)
        return -1;
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069

    for (i = 0; i < npaths && ret == 0; i++) {

        if (STREQ_NULLABLE(paths[i]->type, "link<virtio-balloon-pci>")) {
            VIR_DEBUG("Path to <virtio-balloon-pci> is '%s/%s'",
                      curpath, paths[i]->name);
            if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) {
                ret = -1;
                goto cleanup;
            }

            /* Now look at the each of the property entries to determine
             * whether "guest-stats-polling-interval" exists.  If not,
             * then this version of qemu/kvm does not support the feature.
             */
            nprops = qemuMonitorJSONGetObjectListPaths(mon, nextpath, &bprops);
1070 1071 1072 1073 1074
            if (nprops < 0) {
                ret = -1;
                goto cleanup;
            }

1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
            for (j = 0; j < nprops; j++) {
                if (STREQ(bprops[j]->name, "guest-stats-polling-interval")) {
                    VIR_DEBUG("Found Balloon Object Path %s", nextpath);
                    mon->balloonpath = nextpath;
                    nextpath = NULL;
                    ret = 1;
                    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."));
            ret = -1;
            goto cleanup;
        }

        /* Type entries that begin with "child<" are a branch that can be
         * traversed looking for more entries
         */
        if (paths[i]->type && STRPREFIX(paths[i]->type, "child<")) {
            if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) {
                ret = -1;
                goto cleanup;
            }
            ret = qemuMonitorFindBalloonObjectPath(mon, vm, nextpath);
        }
    }

cleanup:
    for (i = 0; i < npaths; i++)
        qemuMonitorJSONListPathFree(paths[i]);
    VIR_FREE(paths);
    for (j = 0; j < nprops; j++)
        qemuMonitorJSONListPathFree(bprops[j]);
    VIR_FREE(bprops);
    VIR_FREE(nextpath);
    return ret;
}

1116 1117 1118 1119
int qemuMonitorHMPCommandWithFd(qemuMonitorPtr mon,
                                const char *cmd,
                                int scm_fd,
                                char **reply)
1120
{
1121 1122 1123 1124 1125 1126 1127 1128
    char *json_cmd = NULL;
    int ret = -1;

    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);
1129 1130
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to unescape command"));
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
            goto cleanup;
        }
        ret = qemuMonitorJSONHumanCommandWithFd(mon, json_cmd, scm_fd, reply);
    } else {
        ret = qemuMonitorTextCommandWithFd(mon, cmd, scm_fd, reply);
    }

cleanup:
    VIR_FREE(json_cmd);
    return ret;
1141 1142
}

E
Eric Blake 已提交
1143 1144 1145
/* Ensure proper locking around callbacks.  */
#define QEMU_MONITOR_CALLBACK(mon, ret, callback, ...)          \
    do {                                                        \
1146
        virObjectRef(mon);                                      \
1147
        virObjectUnlock(mon);                                   \
E
Eric Blake 已提交
1148
        if ((mon)->cb && (mon)->cb->callback)                   \
1149 1150
            (ret) = (mon)->cb->callback(mon, __VA_ARGS__,       \
                                        (mon)->callbackOpaque); \
1151
        virObjectLock(mon);                                     \
1152
        virObjectUnref(mon);                                    \
E
Eric Blake 已提交
1153
    } while (0)
1154

1155 1156 1157 1158 1159 1160
int qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
                             virConnectPtr conn,
                             const char *path,
                             char **secret,
                             size_t *secretLen)
{
1161
    int ret = -1;
1162 1163 1164
    *secret = NULL;
    *secretLen = 0;

E
Eric Blake 已提交
1165 1166
    QEMU_MONITOR_CALLBACK(mon, ret, diskSecretLookup, conn, mon->vm,
                          path, secret, secretLen);
1167
    return ret;
1168
}
1169 1170


1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
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;
}


1185 1186 1187 1188 1189
int qemuMonitorEmitShutdown(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1190
    QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm);
1191 1192 1193 1194 1195 1196 1197 1198 1199
    return ret;
}


int qemuMonitorEmitReset(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1200
    QEMU_MONITOR_CALLBACK(mon, ret, domainReset, mon->vm);
1201 1202 1203 1204 1205 1206 1207 1208 1209
    return ret;
}


int qemuMonitorEmitPowerdown(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1210
    QEMU_MONITOR_CALLBACK(mon, ret, domainPowerdown, mon->vm);
1211 1212 1213 1214 1215 1216 1217 1218 1219
    return ret;
}


int qemuMonitorEmitStop(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1220
    QEMU_MONITOR_CALLBACK(mon, ret, domainStop, mon->vm);
1221 1222 1223 1224
    return ret;
}


1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
int qemuMonitorEmitResume(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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


1235 1236 1237 1238 1239 1240 1241 1242 1243
int qemuMonitorEmitGuestPanic(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);
    QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm);
    return ret;
}


1244 1245 1246 1247 1248
int qemuMonitorEmitRTCChange(qemuMonitorPtr mon, long long offset)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1249
    QEMU_MONITOR_CALLBACK(mon, ret, domainRTCChange, mon->vm, offset);
1250 1251 1252 1253
    return ret;
}


1254 1255 1256 1257 1258
int qemuMonitorEmitWatchdog(qemuMonitorPtr mon, int action)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1259
    QEMU_MONITOR_CALLBACK(mon, ret, domainWatchdog, mon->vm, action);
1260 1261 1262 1263
    return ret;
}


1264 1265
int qemuMonitorEmitIOError(qemuMonitorPtr mon,
                           const char *diskAlias,
1266 1267
                           int action,
                           const char *reason)
1268 1269 1270 1271
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1272 1273
    QEMU_MONITOR_CALLBACK(mon, ret, domainIOError, mon->vm,
                          diskAlias, action, reason);
1274 1275 1276 1277
    return ret;
}


1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
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)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1293 1294 1295 1296
    QEMU_MONITOR_CALLBACK(mon, ret, domainGraphics, mon->vm, phase,
                          localFamily, localNode, localService,
                          remoteFamily, remoteNode, remoteService,
                          authScheme, x509dname, saslUsername);
1297 1298 1299
    return ret;
}

1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
int qemuMonitorEmitTrayChange(qemuMonitorPtr mon,
                              const char *devAlias,
                              int reason)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

O
Osier Yang 已提交
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322
int qemuMonitorEmitPMWakeup(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

O
Osier Yang 已提交
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332
int qemuMonitorEmitPMSuspend(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

1333 1334 1335 1336 1337 1338 1339 1340 1341 1342
int qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
int qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
                            const char *diskAlias,
                            int type,
                            int status)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

1356

1357 1358 1359 1360 1361 1362 1363 1364 1365 1366
int qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
                                 unsigned long long actual)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

1367

1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
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;
}


1381
int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
1382 1383
{
    int ret;
1384
    VIR_DEBUG("mon=%p", mon);
1385 1386

    if (!mon) {
1387 1388
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1389 1390
        return -1;
    }
1391

1392
    if (mon->json) {
1393
        ret = qemuMonitorJSONSetCapabilities(mon);
1394
        if (ret < 0)
1395
            goto cleanup;
1396
    } else {
1397
        ret = 0;
1398
    }
1399 1400

cleanup:
1401 1402 1403 1404
    return ret;
}


1405 1406 1407 1408
int
qemuMonitorStartCPUs(qemuMonitorPtr mon,
                     virConnectPtr conn)
{
D
Daniel P. Berrange 已提交
1409
    int ret;
1410
    VIR_DEBUG("mon=%p", mon);
1411 1412

    if (!mon) {
1413 1414
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1415 1416
        return -1;
    }
1417

D
Daniel P. Berrange 已提交
1418 1419 1420 1421 1422
    if (mon->json)
        ret = qemuMonitorJSONStartCPUs(mon, conn);
    else
        ret = qemuMonitorTextStartCPUs(mon, conn);
    return ret;
1423 1424 1425 1426 1427 1428
}


int
qemuMonitorStopCPUs(qemuMonitorPtr mon)
{
D
Daniel P. Berrange 已提交
1429
    int ret;
1430
    VIR_DEBUG("mon=%p", mon);
1431 1432

    if (!mon) {
1433 1434
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1435 1436
        return -1;
    }
1437

D
Daniel P. Berrange 已提交
1438 1439 1440 1441 1442
    if (mon->json)
        ret = qemuMonitorJSONStopCPUs(mon);
    else
        ret = qemuMonitorTextStopCPUs(mon);
    return ret;
1443 1444 1445
}


1446
int
1447 1448 1449
qemuMonitorGetStatus(qemuMonitorPtr mon,
                     bool *running,
                     virDomainPausedReason *reason)
1450 1451
{
    int ret;
1452
    VIR_DEBUG("mon=%p, running=%p, reason=%p", mon, running, reason);
1453 1454

    if (!mon || !running) {
1455 1456
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("both monitor and running must not be NULL"));
1457 1458 1459 1460
        return -1;
    }

    if (mon->json)
1461
        ret = qemuMonitorJSONGetStatus(mon, running, reason);
1462
    else
1463
        ret = qemuMonitorTextGetStatus(mon, running, reason);
1464 1465 1466 1467
    return ret;
}


1468 1469
int qemuMonitorSystemPowerdown(qemuMonitorPtr mon)
{
D
Daniel P. Berrange 已提交
1470
    int ret;
1471
    VIR_DEBUG("mon=%p", mon);
1472 1473

    if (!mon) {
1474 1475
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1476 1477
        return -1;
    }
1478

D
Daniel P. Berrange 已提交
1479 1480 1481 1482 1483
    if (mon->json)
        ret = qemuMonitorJSONSystemPowerdown(mon);
    else
        ret = qemuMonitorTextSystemPowerdown(mon);
    return ret;
1484 1485 1486
}


1487 1488 1489 1490 1491 1492
int qemuMonitorSystemReset(qemuMonitorPtr mon)
{
    int ret;
    VIR_DEBUG("mon=%p", mon);

    if (!mon) {
1493 1494
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505
        return -1;
    }

    if (mon->json)
        ret = qemuMonitorJSONSystemReset(mon);
    else
        ret = qemuMonitorTextSystemReset(mon);
    return ret;
}


1506 1507 1508
int qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
                          int **pids)
{
D
Daniel P. Berrange 已提交
1509
    int ret;
1510
    VIR_DEBUG("mon=%p", mon);
1511 1512

    if (!mon) {
1513 1514
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1515 1516
        return -1;
    }
1517

D
Daniel P. Berrange 已提交
1518 1519 1520 1521 1522
    if (mon->json)
        ret = qemuMonitorJSONGetCPUInfo(mon, pids);
    else
        ret = qemuMonitorTextGetCPUInfo(mon, pids);
    return ret;
1523 1524
}

1525 1526 1527 1528 1529 1530 1531 1532
int qemuMonitorSetLink(qemuMonitorPtr mon,
                       const char *name,
                       enum virDomainNetInterfaceLinkState state)
{
    int ret;
    VIR_DEBUG("mon=%p, name=%p:%s, state=%u", mon, name, name, state);

    if (!mon || !name) {
1533 1534
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor || name must not be NULL"));
1535 1536 1537 1538 1539 1540 1541 1542 1543
        return -1;
    }

    if (mon->json)
        ret = qemuMonitorJSONSetLink(mon, name, state);
    else
        ret = qemuMonitorTextSetLink(mon, name, state);
    return ret;
}
1544 1545 1546 1547 1548 1549 1550 1551

int qemuMonitorGetVirtType(qemuMonitorPtr mon,
                           int *virtType)
{
    int ret;
    VIR_DEBUG("mon=%p", mon);

    if (!mon) {
1552 1553
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564
        return -1;
    }

    if (mon->json)
        ret = qemuMonitorJSONGetVirtType(mon, virtType);
    else
        ret = qemuMonitorTextGetVirtType(mon, virtType);
    return ret;
}


1565
int qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
1566
                              unsigned long long *currmem)
1567
{
D
Daniel P. Berrange 已提交
1568
    int ret;
1569
    VIR_DEBUG("mon=%p", mon);
1570 1571

    if (!mon) {
1572 1573
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1574 1575
        return -1;
    }
1576

D
Daniel P. Berrange 已提交
1577 1578 1579 1580 1581
    if (mon->json)
        ret = qemuMonitorJSONGetBalloonInfo(mon, currmem);
    else
        ret = qemuMonitorTextGetBalloonInfo(mon, currmem);
    return ret;
1582 1583 1584
}


1585 1586 1587 1588 1589
int qemuMonitorGetMemoryStats(qemuMonitorPtr mon,
                              virDomainMemoryStatPtr stats,
                              unsigned int nr_stats)
{
    int ret;
1590
    VIR_DEBUG("mon=%p stats=%p nstats=%u", mon, stats, nr_stats);
1591 1592

    if (!mon) {
1593 1594
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1595 1596
        return -1;
    }
1597

1598 1599 1600 1601 1602 1603
    if (mon->json) {
        ignore_value(qemuMonitorFindBalloonObjectPath(mon, mon->vm, "/"));
        mon->ballooninit = true;
        ret = qemuMonitorJSONGetMemoryStats(mon, mon->balloonpath,
                                            stats, nr_stats);
    } else {
1604
        ret = qemuMonitorTextGetMemoryStats(mon, stats, nr_stats);
1605
    }
1606 1607 1608
    return ret;
}

1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,
                                    int period)
{
    int ret = -1;
    VIR_DEBUG("mon=%p period=%d", mon, period);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    if (qemuMonitorFindBalloonObjectPath(mon, mon->vm, "/") == 1) {
        ret = qemuMonitorJSONSetMemoryStatsPeriod(mon, mon->balloonpath,
                                                  period);
    }
    mon->ballooninit = true;
    return ret;
}

1635 1636 1637 1638 1639 1640
int
qemuMonitorBlockIOStatusToError(const char *status)
{
    int st = qemuMonitorBlockIOStatusTypeFromString(status);

    if (st < 0) {
1641 1642
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unknown block IO status: %s"), status);
1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
        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;
}

1661 1662
virHashTablePtr
qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
1663 1664
{
    int ret;
1665 1666 1667
    virHashTablePtr table;

    VIR_DEBUG("mon=%p", mon);
1668 1669

    if (!mon) {
1670 1671
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1672
        return NULL;
1673 1674
    }

1675 1676 1677
    if (!(table = virHashCreate(32, (virHashDataFree) free)))
        return NULL;

1678
    if (mon->json)
1679
        ret = qemuMonitorJSONGetBlockInfo(mon, table);
1680
    else
1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692
        ret = qemuMonitorTextGetBlockInfo(mon, table);

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

    return table;
}

struct qemuDomainDiskInfo *
qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
E
Eric Blake 已提交
1693
                           const char *dev)
1694 1695 1696
{
    struct qemuDomainDiskInfo *info;

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

E
Eric Blake 已提交
1699
    if (!(info = virHashLookup(blockInfo, dev))) {
1700 1701
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("cannot find info for device '%s'"),
E
Eric Blake 已提交
1702
                       NULLSTR(dev));
1703 1704 1705
    }

    return info;
1706
}
1707

1708
int qemuMonitorGetBlockStatsInfo(qemuMonitorPtr mon,
1709
                                 const char *dev_name,
1710 1711
                                 long long *rd_req,
                                 long long *rd_bytes,
1712
                                 long long *rd_total_times,
1713 1714
                                 long long *wr_req,
                                 long long *wr_bytes,
1715 1716 1717
                                 long long *wr_total_times,
                                 long long *flush_req,
                                 long long *flush_total_times,
1718 1719
                                 long long *errs)
{
D
Daniel P. Berrange 已提交
1720
    int ret;
1721
    VIR_DEBUG("mon=%p dev=%s", mon, dev_name);
1722 1723

    if (!mon) {
1724 1725
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1726 1727
        return -1;
    }
1728

D
Daniel P. Berrange 已提交
1729
    if (mon->json)
1730
        ret = qemuMonitorJSONGetBlockStatsInfo(mon, dev_name,
D
Daniel P. Berrange 已提交
1731
                                               rd_req, rd_bytes,
1732
                                               rd_total_times,
D
Daniel P. Berrange 已提交
1733
                                               wr_req, wr_bytes,
1734 1735 1736
                                               wr_total_times,
                                               flush_req,
                                               flush_total_times,
D
Daniel P. Berrange 已提交
1737 1738
                                               errs);
    else
1739
        ret = qemuMonitorTextGetBlockStatsInfo(mon, dev_name,
D
Daniel P. Berrange 已提交
1740
                                               rd_req, rd_bytes,
1741
                                               rd_total_times,
D
Daniel P. Berrange 已提交
1742
                                               wr_req, wr_bytes,
1743 1744 1745
                                               wr_total_times,
                                               flush_req,
                                               flush_total_times,
D
Daniel P. Berrange 已提交
1746 1747
                                               errs);
    return ret;
1748 1749
}

1750 1751 1752 1753 1754 1755 1756 1757 1758 1759
/* Return 0 and update @nparams with the number of block stats
 * QEMU supports if success. Return -1 if failure.
 */
int qemuMonitorGetBlockStatsParamsNumber(qemuMonitorPtr mon,
                                         int *nparams)
{
    int ret;
    VIR_DEBUG("mon=%p nparams=%p", mon, nparams);

    if (!mon) {
1760 1761
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
        return -1;
    }

    if (mon->json)
        ret = qemuMonitorJSONGetBlockStatsParamsNumber(mon, nparams);
    else
        ret = qemuMonitorTextGetBlockStatsParamsNumber(mon, nparams);

    return ret;
}

1773
int qemuMonitorGetBlockExtent(qemuMonitorPtr mon,
1774
                              const char *dev_name,
1775 1776 1777
                              unsigned long long *extent)
{
    int ret;
E
Eric Blake 已提交
1778
    VIR_DEBUG("mon=%p, dev_name=%p", mon, dev_name);
1779 1780

    if (mon->json)
1781
        ret = qemuMonitorJSONGetBlockExtent(mon, dev_name, extent);
1782
    else
1783
        ret = qemuMonitorTextGetBlockExtent(mon, dev_name, extent);
1784 1785 1786 1787

    return ret;
}

1788 1789 1790 1791 1792
int qemuMonitorBlockResize(qemuMonitorPtr mon,
                           const char *device,
                           unsigned long long size)
{
    int ret;
E
Eric Blake 已提交
1793
    VIR_DEBUG("mon=%p, devname=%p size=%llu", mon, device, size);
1794 1795 1796 1797 1798 1799 1800 1801

    if (mon->json)
        ret = qemuMonitorJSONBlockResize(mon, device, size);
    else
        ret = qemuMonitorTextBlockResize(mon, device, size);

    return ret;
}
1802 1803 1804 1805

int qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
                              const char *password)
{
D
Daniel P. Berrange 已提交
1806
    int ret;
1807
    VIR_DEBUG("mon=%p, password=%p",
1808 1809 1810
          mon, password);

    if (!mon) {
1811 1812
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1813 1814
        return -1;
    }
1815

1816 1817 1818
    if (!password)
        password = "";

D
Daniel P. Berrange 已提交
1819 1820 1821 1822 1823
    if (mon->json)
        ret = qemuMonitorJSONSetVNCPassword(mon, password);
    else
        ret = qemuMonitorTextSetVNCPassword(mon, password);
    return ret;
1824 1825
}

1826 1827 1828 1829 1830 1831 1832 1833
static const char* qemuMonitorTypeToProtocol(int type)
{
    switch (type) {
    case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
        return "vnc";
    case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
        return "spice";
    default:
1834 1835 1836
        virReportError(VIR_ERR_INVALID_ARG,
                       _("unsupported protocol type %s"),
                       virDomainGraphicsTypeToString(type));
1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852
        return NULL;
    }
}

/* Returns -2 if not supported with this monitor connection */
int qemuMonitorSetPassword(qemuMonitorPtr mon,
                           int type,
                           const char *password,
                           const char *action_if_connected)
{
    const char *protocol = qemuMonitorTypeToProtocol(type);
    int ret;

    if (!protocol)
        return -1;

1853
    VIR_DEBUG("mon=%p, protocol=%s, password=%p, action_if_connected=%s",
1854 1855 1856
          mon, protocol, password, action_if_connected);

    if (!mon) {
1857 1858
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
        return -1;
    }

    if (!password)
        password = "";

    if (!action_if_connected)
        action_if_connected = "keep";

    if (mon->json)
        ret = qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected);
    else
        ret = qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected);
    return ret;
}

int qemuMonitorExpirePassword(qemuMonitorPtr mon,
                              int type,
                              const char *expire_time)
{
    const char *protocol = qemuMonitorTypeToProtocol(type);
    int ret;

    if (!protocol)
        return -1;

1885
    VIR_DEBUG("mon=%p, protocol=%s, expire_time=%s",
1886 1887 1888
          mon, protocol, expire_time);

    if (!mon) {
1889 1890
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
        return -1;
    }

    if (!expire_time)
        expire_time = "now";

    if (mon->json)
        ret = qemuMonitorJSONExpirePassword(mon, protocol, expire_time);
    else
        ret = qemuMonitorTextExpirePassword(mon, protocol, expire_time);
    return ret;
}
1903 1904 1905 1906

int qemuMonitorSetBalloon(qemuMonitorPtr mon,
                          unsigned long newmem)
{
D
Daniel P. Berrange 已提交
1907
    int ret;
1908
    VIR_DEBUG("mon=%p newmem=%lu", mon, newmem);
1909 1910

    if (!mon) {
1911 1912
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1913 1914
        return -1;
    }
1915

D
Daniel P. Berrange 已提交
1916 1917 1918 1919 1920
    if (mon->json)
        ret = qemuMonitorJSONSetBalloon(mon, newmem);
    else
        ret = qemuMonitorTextSetBalloon(mon, newmem);
    return ret;
1921 1922
}

1923

1924
int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, bool online)
1925 1926
{
    int ret;
1927
    VIR_DEBUG("mon=%p cpu=%d online=%d", mon, cpu, online);
1928 1929

    if (!mon) {
1930 1931
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1932 1933
        return -1;
    }
1934 1935 1936 1937 1938 1939 1940 1941 1942

    if (mon->json)
        ret = qemuMonitorJSONSetCPU(mon, cpu, online);
    else
        ret = qemuMonitorTextSetCPU(mon, cpu, online);
    return ret;
}


1943
int qemuMonitorEjectMedia(qemuMonitorPtr mon,
1944
                          const char *dev_name,
1945
                          bool force)
1946
{
D
Daniel P. Berrange 已提交
1947
    int ret;
1948
    VIR_DEBUG("mon=%p dev_name=%s force=%d", mon, dev_name, force);
1949 1950

    if (!mon) {
1951 1952
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1953 1954
        return -1;
    }
1955

D
Daniel P. Berrange 已提交
1956
    if (mon->json)
1957
        ret = qemuMonitorJSONEjectMedia(mon, dev_name, force);
D
Daniel P. Berrange 已提交
1958
    else
1959
        ret = qemuMonitorTextEjectMedia(mon, dev_name, force);
D
Daniel P. Berrange 已提交
1960
    return ret;
1961 1962 1963 1964
}


int qemuMonitorChangeMedia(qemuMonitorPtr mon,
1965
                           const char *dev_name,
1966 1967
                           const char *newmedia,
                           const char *format)
1968
{
D
Daniel P. Berrange 已提交
1969
    int ret;
1970 1971
    VIR_DEBUG("mon=%p dev_name=%s newmedia=%s format=%s",
          mon, dev_name, newmedia, format);
1972 1973

    if (!mon) {
1974 1975
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1976 1977
        return -1;
    }
1978

D
Daniel P. Berrange 已提交
1979
    if (mon->json)
1980
        ret = qemuMonitorJSONChangeMedia(mon, dev_name, newmedia, format);
D
Daniel P. Berrange 已提交
1981
    else
1982
        ret = qemuMonitorTextChangeMedia(mon, dev_name, newmedia, format);
D
Daniel P. Berrange 已提交
1983
    return ret;
1984 1985 1986 1987 1988 1989 1990 1991
}


int qemuMonitorSaveVirtualMemory(qemuMonitorPtr mon,
                                 unsigned long long offset,
                                 size_t length,
                                 const char *path)
{
D
Daniel P. Berrange 已提交
1992
    int ret;
1993
    VIR_DEBUG("mon=%p offset=%llu length=%zu path=%s",
1994 1995 1996
          mon, offset, length, path);

    if (!mon) {
1997 1998
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
1999 2000
        return -1;
    }
2001

D
Daniel P. Berrange 已提交
2002 2003 2004 2005 2006
    if (mon->json)
        ret = qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path);
    else
        ret = qemuMonitorTextSaveVirtualMemory(mon, offset, length, path);
    return ret;
2007 2008 2009 2010 2011 2012 2013
}

int qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
                                  unsigned long long offset,
                                  size_t length,
                                  const char *path)
{
D
Daniel P. Berrange 已提交
2014
    int ret;
2015
    VIR_DEBUG("mon=%p offset=%llu length=%zu path=%s",
2016 2017 2018
          mon, offset, length, path);

    if (!mon) {
2019 2020
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2021 2022
        return -1;
    }
2023

D
Daniel P. Berrange 已提交
2024 2025 2026 2027 2028
    if (mon->json)
        ret = qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path);
    else
        ret = qemuMonitorTextSavePhysicalMemory(mon, offset, length, path);
    return ret;
2029 2030 2031 2032 2033 2034
}


int qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
                                 unsigned long bandwidth)
{
D
Daniel P. Berrange 已提交
2035
    int ret;
2036
    VIR_DEBUG("mon=%p bandwidth=%lu", mon, bandwidth);
2037 2038

    if (!mon) {
2039 2040
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2041 2042
        return -1;
    }
2043

D
Daniel P. Berrange 已提交
2044 2045 2046 2047 2048
    if (mon->json)
        ret = qemuMonitorJSONSetMigrationSpeed(mon, bandwidth);
    else
        ret = qemuMonitorTextSetMigrationSpeed(mon, bandwidth);
    return ret;
2049 2050
}

2051 2052 2053 2054 2055

int qemuMonitorSetMigrationDowntime(qemuMonitorPtr mon,
                                    unsigned long long downtime)
{
    int ret;
2056
    VIR_DEBUG("mon=%p downtime=%llu", mon, downtime);
2057 2058

    if (!mon) {
2059 2060
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2061 2062
        return -1;
    }
2063 2064 2065 2066 2067 2068 2069 2070 2071

    if (mon->json)
        ret = qemuMonitorJSONSetMigrationDowntime(mon, downtime);
    else
        ret = qemuMonitorTextSetMigrationDowntime(mon, downtime);
    return ret;
}


2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114
int
qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long *cacheSize)
{
    VIR_DEBUG("mon=%p cacheSize=%p", mon, cacheSize);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetMigrationCacheSize(mon, cacheSize);
}

int
qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long cacheSize)
{
    VIR_DEBUG("mon=%p cacheSize=%llu", mon, cacheSize);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONSetMigrationCacheSize(mon, cacheSize);
}


2115
int qemuMonitorGetMigrationStatus(qemuMonitorPtr mon,
2116
                                  qemuMonitorMigrationStatusPtr status)
2117
{
D
Daniel P. Berrange 已提交
2118
    int ret;
2119
    VIR_DEBUG("mon=%p", mon);
2120 2121

    if (!mon) {
2122 2123
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2124 2125
        return -1;
    }
2126

D
Daniel P. Berrange 已提交
2127
    if (mon->json)
2128
        ret = qemuMonitorJSONGetMigrationStatus(mon, status);
D
Daniel P. Berrange 已提交
2129
    else
2130
        ret = qemuMonitorTextGetMigrationStatus(mon, status);
D
Daniel P. Berrange 已提交
2131
    return ret;
2132 2133 2134
}


2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158
int qemuMonitorGetSpiceMigrationStatus(qemuMonitorPtr mon,
                                       bool *spice_migrated)
{
    int ret;
    VIR_DEBUG("mon=%p", mon);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (mon->json) {
        ret = qemuMonitorJSONGetSpiceMigrationStatus(mon, spice_migrated);
    } else {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return ret;
}


E
Eric Blake 已提交
2159 2160 2161 2162 2163
int qemuMonitorMigrateToFd(qemuMonitorPtr mon,
                           unsigned int flags,
                           int fd)
{
    int ret;
2164
    VIR_DEBUG("mon=%p fd=%d flags=%x",
E
Eric Blake 已提交
2165 2166 2167
          mon, fd, flags);

    if (!mon) {
2168 2169
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
E
Eric Blake 已提交
2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182
        return -1;
    }

    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)
2183
            VIR_WARN("failed to close migration handle");
E
Eric Blake 已提交
2184 2185 2186 2187 2188 2189
    }

    return ret;
}


2190
int qemuMonitorMigrateToHost(qemuMonitorPtr mon,
2191
                             unsigned int flags,
2192 2193 2194
                             const char *hostname,
                             int port)
{
D
Daniel P. Berrange 已提交
2195
    int ret;
2196
    char *uri = NULL;
2197
    VIR_DEBUG("mon=%p hostname=%s port=%d flags=%x",
2198
          mon, hostname, port, flags);
2199 2200

    if (!mon) {
2201 2202
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2203 2204
        return -1;
    }
2205

2206

2207
    if (virAsprintf(&uri, "tcp:%s:%d", hostname, port) < 0)
2208 2209
        return -1;

D
Daniel P. Berrange 已提交
2210
    if (mon->json)
2211
        ret = qemuMonitorJSONMigrate(mon, flags, uri);
D
Daniel P. Berrange 已提交
2212
    else
2213 2214 2215
        ret = qemuMonitorTextMigrate(mon, flags, uri);

    VIR_FREE(uri);
D
Daniel P. Berrange 已提交
2216
    return ret;
2217 2218 2219 2220
}


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

    if (!mon) {
2231 2232
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2233 2234
        return -1;
    }
2235

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

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

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

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

int qemuMonitorMigrateToFile(qemuMonitorPtr mon,
2255
                             unsigned int flags,
2256 2257 2258 2259
                             const char * const *argv,
                             const char *target,
                             unsigned long long offset)
{
2260 2261 2262 2263
    char *argstr;
    char *dest = NULL;
    int ret = -1;
    char *safe_target = NULL;
2264
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2265
    VIR_DEBUG("mon=%p argv=%p target=%s offset=%llu flags=%x",
2266
          mon, argv, target, offset, flags);
2267 2268

    if (!mon) {
2269 2270
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2271 2272
        return -1;
    }
2273 2274

    if (offset % QEMU_MONITOR_MIGRATE_TO_FILE_BS) {
2275 2276 2277
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("file offset must be a multiple of %llu"),
                       QEMU_MONITOR_MIGRATE_TO_FILE_BS);
2278 2279 2280
        return -1;
    }

2281
    argstr = virArgvToString(argv);
2282
    if (!argstr)
2283 2284 2285
        goto cleanup;

    /* Migrate to file */
2286 2287
    virBufferEscapeShell(&buf, target);
    if (virBufferError(&buf)) {
2288
        virReportOOMError();
2289
        virBufferFreeAndReset(&buf);
2290 2291
        goto cleanup;
    }
2292
    safe_target = virBufferContentAndReset(&buf);
2293 2294 2295 2296 2297 2298 2299

    /* Two dd processes, sharing the same stdout, are necessary to
     * allow starting at an alignment of 512, but without wasting
     * padding to get to the larger alignment useful for speed.  Use
     * <> redirection to avoid truncating a regular file.  */
    if (virAsprintf(&dest, "exec:" VIR_WRAPPER_SHELL_PREFIX "%s | "
                    "{ dd bs=%llu seek=%llu if=/dev/null && "
2300
                    "dd ibs=%llu obs=%llu; } 1<>%s" VIR_WRAPPER_SHELL_SUFFIX,
2301 2302 2303
                    argstr, QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                    offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                    QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
2304
                    QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
2305
                    safe_target) < 0)
2306 2307
        goto cleanup;

2308
    if (mon->json)
2309
        ret = qemuMonitorJSONMigrate(mon, flags, dest);
2310
    else
2311 2312 2313 2314 2315 2316
        ret = qemuMonitorTextMigrate(mon, flags, dest);

cleanup:
    VIR_FREE(safe_target);
    VIR_FREE(argstr);
    VIR_FREE(dest);
D
Daniel P. Berrange 已提交
2317
    return ret;
2318 2319 2320
}

int qemuMonitorMigrateToUnix(qemuMonitorPtr mon,
2321
                             unsigned int flags,
2322 2323
                             const char *unixfile)
{
2324 2325
    char *dest = NULL;
    int ret = -1;
2326
    VIR_DEBUG("mon=%p, unixfile=%s flags=%x",
2327
          mon, unixfile, flags);
2328 2329

    if (!mon) {
2330 2331
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2332 2333
        return -1;
    }
2334

2335
    if (virAsprintf(&dest, "unix:%s", unixfile) < 0)
2336 2337
        return -1;

D
Daniel P. Berrange 已提交
2338
    if (mon->json)
2339
        ret = qemuMonitorJSONMigrate(mon, flags, dest);
D
Daniel P. Berrange 已提交
2340
    else
2341 2342 2343
        ret = qemuMonitorTextMigrate(mon, flags, dest);

    VIR_FREE(dest);
D
Daniel P. Berrange 已提交
2344
    return ret;
2345 2346 2347 2348
}

int qemuMonitorMigrateCancel(qemuMonitorPtr mon)
{
D
Daniel P. Berrange 已提交
2349
    int ret;
2350
    VIR_DEBUG("mon=%p", mon);
2351 2352

    if (!mon) {
2353 2354
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2355 2356
        return -1;
    }
2357

D
Daniel P. Berrange 已提交
2358 2359 2360 2361 2362
    if (mon->json)
        ret = qemuMonitorJSONMigrateCancel(mon);
    else
        ret = qemuMonitorTextMigrateCancel(mon);
    return ret;
2363 2364
}

2365 2366
int
qemuMonitorDumpToFd(qemuMonitorPtr mon, int fd)
2367 2368
{
    int ret;
2369
    VIR_DEBUG("mon=%p fd=%d", mon, fd);
2370 2371

    if (!mon) {
2372 2373
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2374 2375 2376 2377 2378 2379 2380
        return -1;
    }

    if (!mon->json) {
        /* We don't have qemuMonitorTextDump(), so we should check mon->json
         * here.
         */
2381
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2382
                       _("dump-guest-memory is not supported in text mode"));
2383 2384 2385 2386 2387 2388
        return -1;
    }

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

2389
    ret = qemuMonitorJSONDump(mon, "fd:dump");
2390 2391 2392 2393 2394 2395 2396 2397

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

    return ret;
}
2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428

int qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
                                int type,
                                const char *hostname,
                                int port,
                                int tlsPort,
                                const char *tlsSubject)
{
    int ret;
    VIR_DEBUG("mon=%p type=%d hostname=%s port=%d tlsPort=%d tlsSubject=%s",
              mon, type, hostname, port, tlsPort, NULLSTR(tlsSubject));

    if (mon->json)
        ret = qemuMonitorJSONGraphicsRelocate(mon,
                                              type,
                                              hostname,
                                              port,
                                              tlsPort,
                                              tlsSubject);
    else
        ret = qemuMonitorTextGraphicsRelocate(mon,
                                              type,
                                              hostname,
                                              port,
                                              tlsPort,
                                              tlsSubject);

    return ret;
}


2429 2430 2431
int qemuMonitorAddUSBDisk(qemuMonitorPtr mon,
                          const char *path)
{
D
Daniel P. Berrange 已提交
2432
    int ret;
2433
    VIR_DEBUG("mon=%p path=%s", mon, path);
2434 2435

    if (!mon) {
2436 2437
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2438 2439
        return -1;
    }
2440

D
Daniel P. Berrange 已提交
2441 2442 2443 2444 2445
    if (mon->json)
        ret = qemuMonitorJSONAddUSBDisk(mon, path);
    else
        ret = qemuMonitorTextAddUSBDisk(mon, path);
    return ret;
2446 2447 2448 2449 2450 2451 2452
}


int qemuMonitorAddUSBDeviceExact(qemuMonitorPtr mon,
                                 int bus,
                                 int dev)
{
D
Daniel P. Berrange 已提交
2453
    int ret;
2454
    VIR_DEBUG("mon=%p bus=%d dev=%d", mon, bus, dev);
2455 2456

    if (!mon) {
2457 2458
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2459 2460
        return -1;
    }
2461

D
Daniel P. Berrange 已提交
2462 2463 2464 2465 2466
    if (mon->json)
        ret = qemuMonitorJSONAddUSBDeviceExact(mon, bus, dev);
    else
        ret = qemuMonitorTextAddUSBDeviceExact(mon, bus, dev);
    return ret;
2467 2468 2469 2470 2471 2472
}

int qemuMonitorAddUSBDeviceMatch(qemuMonitorPtr mon,
                                 int vendor,
                                 int product)
{
D
Daniel P. Berrange 已提交
2473
    int ret;
2474
    VIR_DEBUG("mon=%p vendor=%d product=%d",
2475 2476 2477
          mon, vendor, product);

    if (!mon) {
2478 2479
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2480 2481
        return -1;
    }
2482

D
Daniel P. Berrange 已提交
2483 2484 2485 2486 2487
    if (mon->json)
        ret = qemuMonitorJSONAddUSBDeviceMatch(mon, vendor, product);
    else
        ret = qemuMonitorTextAddUSBDeviceMatch(mon, vendor, product);
    return ret;
2488 2489 2490 2491
}


int qemuMonitorAddPCIHostDevice(qemuMonitorPtr mon,
2492 2493
                                virDevicePCIAddress *hostAddr,
                                virDevicePCIAddress *guestAddr)
2494
{
D
Daniel P. Berrange 已提交
2495
    int ret;
2496
    VIR_DEBUG("mon=%p domain=%d bus=%d slot=%d function=%d",
2497
          mon,
2498
          hostAddr->domain, hostAddr->bus, hostAddr->slot, hostAddr->function);
2499

2500
    if (!mon) {
2501 2502
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2503 2504 2505
        return -1;
    }

D
Daniel P. Berrange 已提交
2506
    if (mon->json)
2507
        ret = qemuMonitorJSONAddPCIHostDevice(mon, hostAddr, guestAddr);
D
Daniel P. Berrange 已提交
2508
    else
2509
        ret = qemuMonitorTextAddPCIHostDevice(mon, hostAddr, guestAddr);
D
Daniel P. Berrange 已提交
2510
    return ret;
2511 2512 2513 2514 2515 2516
}


int qemuMonitorAddPCIDisk(qemuMonitorPtr mon,
                          const char *path,
                          const char *bus,
2517
                          virDevicePCIAddress *guestAddr)
2518
{
D
Daniel P. Berrange 已提交
2519
    int ret;
2520
    VIR_DEBUG("mon=%p path=%s bus=%s",
2521 2522 2523
          mon, path, bus);

    if (!mon) {
2524 2525
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2526 2527
        return -1;
    }
2528

D
Daniel P. Berrange 已提交
2529
    if (mon->json)
2530
        ret = qemuMonitorJSONAddPCIDisk(mon, path, bus, guestAddr);
D
Daniel P. Berrange 已提交
2531
    else
2532
        ret = qemuMonitorTextAddPCIDisk(mon, path, bus, guestAddr);
D
Daniel P. Berrange 已提交
2533
    return ret;
2534 2535 2536 2537 2538
}


int qemuMonitorAddPCINetwork(qemuMonitorPtr mon,
                             const char *nicstr,
2539
                             virDevicePCIAddress *guestAddr)
2540
{
D
Daniel P. Berrange 已提交
2541
    int ret;
2542
    VIR_DEBUG("mon=%p nicstr=%s", mon, nicstr);
2543 2544

    if (!mon) {
2545 2546
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2547 2548
        return -1;
    }
2549

D
Daniel P. Berrange 已提交
2550
    if (mon->json)
2551
        ret = qemuMonitorJSONAddPCINetwork(mon, nicstr, guestAddr);
D
Daniel P. Berrange 已提交
2552
    else
2553
        ret = qemuMonitorTextAddPCINetwork(mon, nicstr, guestAddr);
D
Daniel P. Berrange 已提交
2554
    return ret;
2555 2556 2557 2558
}


int qemuMonitorRemovePCIDevice(qemuMonitorPtr mon,
2559
                               virDevicePCIAddress *guestAddr)
2560
{
D
Daniel P. Berrange 已提交
2561
    int ret;
2562
    VIR_DEBUG("mon=%p domain=%d bus=%d slot=%d function=%d",
2563
          mon, guestAddr->domain, guestAddr->bus,
2564
          guestAddr->slot, guestAddr->function);
2565

2566
    if (!mon) {
2567 2568
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2569 2570 2571
        return -1;
    }

D
Daniel P. Berrange 已提交
2572
    if (mon->json)
2573
        ret = qemuMonitorJSONRemovePCIDevice(mon, guestAddr);
D
Daniel P. Berrange 已提交
2574
    else
2575
        ret = qemuMonitorTextRemovePCIDevice(mon, guestAddr);
D
Daniel P. Berrange 已提交
2576
    return ret;
2577 2578 2579 2580 2581 2582 2583
}


int qemuMonitorSendFileHandle(qemuMonitorPtr mon,
                              const char *fdname,
                              int fd)
{
D
Daniel P. Berrange 已提交
2584
    int ret;
2585
    VIR_DEBUG("mon=%p, fdname=%s fd=%d",
2586 2587 2588
          mon, fdname, fd);

    if (!mon) {
2589 2590
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2591 2592
        return -1;
    }
2593

2594
    if (fd < 0) {
2595 2596
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("fd must be valid"));
2597 2598 2599 2600
        return -1;
    }

    if (!mon->hasSendFD) {
2601
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
2602 2603
                       _("qemu is not using a unix socket monitor, "
                         "cannot send fd %s"), fdname);
2604 2605 2606
        return -1;
    }

D
Daniel P. Berrange 已提交
2607 2608 2609 2610 2611
    if (mon->json)
        ret = qemuMonitorJSONSendFileHandle(mon, fdname, fd);
    else
        ret = qemuMonitorTextSendFileHandle(mon, fdname, fd);
    return ret;
2612 2613 2614 2615 2616 2617
}


int qemuMonitorCloseFileHandle(qemuMonitorPtr mon,
                               const char *fdname)
{
2618 2619 2620
    int ret = -1;
    virErrorPtr error;

2621
    VIR_DEBUG("mon=%p fdname=%s",
2622 2623
          mon, fdname);

2624 2625
    error = virSaveLastError();

2626
    if (!mon) {
2627 2628
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2629
        goto cleanup;
2630
    }
2631

D
Daniel P. Berrange 已提交
2632 2633 2634 2635
    if (mon->json)
        ret = qemuMonitorJSONCloseFileHandle(mon, fdname);
    else
        ret = qemuMonitorTextCloseFileHandle(mon, fdname);
2636 2637 2638 2639 2640 2641

cleanup:
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
D
Daniel P. Berrange 已提交
2642
    return ret;
2643 2644 2645
}


2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717
/* 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)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, fdset=%d, fd=%d, name=%s",
              mon, fdset, fd, NULLSTR(name));

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

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

    if (mon->json)
        ret = qemuMonitorJSONAddFd(mon, fdset, fd, name);
    else
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("add fd requires JSON monitor"));
    return ret;
}


/* 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;

    VIR_DEBUG("mon=%p, fdset=%d, fd=%d", mon, fdset, fd);

    error = virSaveLastError();

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        goto cleanup;
    }

    if (mon->json)
        ret = qemuMonitorJSONRemoveFd(mon, fdset, fd);
    else
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("remove fd requires JSON monitor"));

cleanup:
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
    return ret;
}


2718
int qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
2719
                              const char *netstr,
2720 2721
                              int *tapfd, char **tapfdName, int tapfdSize,
                              int *vhostfd, char **vhostfdName, int vhostfdSize)
2722
{
2723
    int ret = -1;
2724
    size_t i = 0, j = 0;
2725 2726 2727 2728 2729

    VIR_DEBUG("mon=%p netstr=%s tapfd=%p tapfdName=%p tapfdSize=%d "
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
              mon, netstr, tapfd, tapfdName, tapfdSize,
              vhostfd, vhostfdName, vhostfdSize);
2730 2731

    if (!mon) {
2732 2733
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2734 2735
        return -1;
    }
2736

2737 2738 2739 2740 2741 2742 2743
    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;
2744 2745
    }

D
Daniel P. Berrange 已提交
2746
    if (mon->json)
2747
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2748
                       _("JSON monitor should be using AddNetdev"));
D
Daniel P. Berrange 已提交
2749 2750
    else
        ret = qemuMonitorTextAddHostNetwork(mon, netstr);
2751 2752 2753

cleanup:
    if (ret < 0) {
2754 2755 2756 2757 2758 2759 2760 2761
        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]);
        }
2762 2763
    }

D
Daniel P. Berrange 已提交
2764
    return ret;
2765 2766 2767 2768 2769 2770 2771
}


int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
                                 int vlan,
                                 const char *netname)
{
G
Guido Günther 已提交
2772
    int ret = -1;
2773
    VIR_DEBUG("mon=%p netname=%s",
2774 2775 2776
          mon, netname);

    if (!mon) {
2777 2778
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2779 2780
        return -1;
    }
2781

D
Daniel P. Berrange 已提交
2782
    if (mon->json)
2783
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2784
                       _("JSON monitor should be using RemoveNetdev"));
D
Daniel P. Berrange 已提交
2785 2786 2787
    else
        ret = qemuMonitorTextRemoveHostNetwork(mon, vlan, netname);
    return ret;
2788
}
2789

2790 2791

int qemuMonitorAddNetdev(qemuMonitorPtr mon,
2792
                         const char *netdevstr,
2793 2794
                         int *tapfd, char **tapfdName, int tapfdSize,
                         int *vhostfd, char **vhostfdName, int vhostfdSize)
2795
{
2796
    int ret = -1;
2797
    size_t i = 0, j = 0;
2798 2799 2800 2801

    VIR_DEBUG("mon=%p netdevstr=%s tapfd=%p tapfdName=%p tapfdSize=%d"
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
              mon, netdevstr, tapfd, tapfdName, tapfdSize,
2802
              vhostfd, vhostfdName, vhostfdSize);
2803 2804

    if (!mon) {
2805 2806
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2807 2808
        return -1;
    }
2809

2810 2811 2812 2813 2814 2815 2816
    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;
2817 2818
    }

2819 2820 2821 2822
    if (mon->json)
        ret = qemuMonitorJSONAddNetdev(mon, netdevstr);
    else
        ret = qemuMonitorTextAddNetdev(mon, netdevstr);
2823 2824 2825

cleanup:
    if (ret < 0) {
2826 2827 2828 2829 2830 2831 2832 2833
        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]);
        }
2834 2835
    }

2836 2837 2838 2839 2840 2841 2842
    return ret;
}

int qemuMonitorRemoveNetdev(qemuMonitorPtr mon,
                            const char *alias)
{
    int ret;
2843
    VIR_DEBUG("mon=%p alias=%s",
2844 2845 2846
          mon, alias);

    if (!mon) {
2847 2848
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2849 2850
        return -1;
    }
2851 2852 2853 2854 2855 2856 2857 2858 2859

    if (mon->json)
        ret = qemuMonitorJSONRemoveNetdev(mon, alias);
    else
        ret = qemuMonitorTextRemoveNetdev(mon, alias);
    return ret;
}


2860 2861 2862
int qemuMonitorGetPtyPaths(qemuMonitorPtr mon,
                           virHashTablePtr paths)
{
2863
    int ret;
2864
    VIR_DEBUG("mon=%p",
2865 2866 2867
          mon);

    if (!mon) {
2868 2869
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2870 2871
        return -1;
    }
2872

2873 2874 2875 2876 2877
    if (mon->json)
        ret = qemuMonitorJSONGetPtyPaths(mon, paths);
    else
        ret = qemuMonitorTextGetPtyPaths(mon, paths);
    return ret;
2878
}
2879 2880 2881 2882


int qemuMonitorAttachPCIDiskController(qemuMonitorPtr mon,
                                       const char *bus,
2883
                                       virDevicePCIAddress *guestAddr)
2884
{
2885
    VIR_DEBUG("mon=%p type=%s", mon, bus);
2886 2887
    int ret;

2888
    if (!mon) {
2889 2890
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2891 2892 2893
        return -1;
    }

2894 2895 2896 2897 2898 2899 2900
    if (mon->json)
        ret = qemuMonitorJSONAttachPCIDiskController(mon, bus, guestAddr);
    else
        ret = qemuMonitorTextAttachPCIDiskController(mon, bus, guestAddr);

    return ret;
}
2901 2902 2903 2904


int qemuMonitorAttachDrive(qemuMonitorPtr mon,
                           const char *drivestr,
2905
                           virDevicePCIAddress *controllerAddr,
2906 2907
                           virDomainDeviceDriveAddress *driveAddr)
{
2908
    VIR_DEBUG("mon=%p drivestr=%s domain=%d bus=%d slot=%d function=%d",
2909
          mon, drivestr,
2910 2911
          controllerAddr->domain, controllerAddr->bus,
          controllerAddr->slot, controllerAddr->function);
G
Guido Günther 已提交
2912
    int ret = 1;
2913

2914
    if (!mon) {
2915 2916
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2917 2918 2919
        return -1;
    }

2920
    if (mon->json)
2921
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2922
                       _("JSON monitor should be using AddDrive"));
2923 2924 2925 2926 2927
    else
        ret = qemuMonitorTextAttachDrive(mon, drivestr, controllerAddr, driveAddr);

    return ret;
}
2928 2929 2930 2931

int qemuMonitorGetAllPCIAddresses(qemuMonitorPtr mon,
                                  qemuMonitorPCIAddress **addrs)
{
2932
    VIR_DEBUG("mon=%p addrs=%p", mon, addrs);
2933 2934
    int ret;

2935
    if (!mon) {
2936 2937
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2938 2939 2940
        return -1;
    }

2941 2942 2943 2944 2945 2946
    if (mon->json)
        ret = qemuMonitorJSONGetAllPCIAddresses(mon, addrs);
    else
        ret = qemuMonitorTextGetAllPCIAddresses(mon, addrs);
    return ret;
}
2947

2948 2949
int qemuMonitorDriveDel(qemuMonitorPtr mon,
                        const char *drivestr)
2950
{
2951
    VIR_DEBUG("mon=%p drivestr=%s", mon, drivestr);
2952 2953 2954
    int ret;

    if (!mon) {
2955 2956
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2957 2958 2959 2960
        return -1;
    }

    if (mon->json)
2961
        ret = qemuMonitorJSONDriveDel(mon, drivestr);
2962
    else
2963
        ret = qemuMonitorTextDriveDel(mon, drivestr);
2964 2965 2966
    return ret;
}

2967
int qemuMonitorDelDevice(qemuMonitorPtr mon,
2968
                         const char *devalias)
2969
{
2970
    VIR_DEBUG("mon=%p devalias=%s", mon, devalias);
2971 2972
    int ret;

2973
    if (!mon) {
2974 2975
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2976 2977 2978
        return -1;
    }

2979
    if (mon->json)
2980
        ret = qemuMonitorJSONDelDevice(mon, devalias);
2981
    else
2982
        ret = qemuMonitorTextDelDevice(mon, devalias);
2983 2984 2985
    return ret;
}

2986

2987 2988 2989 2990
int qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
                               const char *devicestr,
                               int fd,
                               const char *fdname)
2991
{
2992 2993
    VIR_DEBUG("mon=%p device=%s fd=%d fdname=%s", mon, devicestr, fd,
              NULLSTR(fdname));
2994 2995
    int ret;

2996
    if (!mon) {
2997 2998
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
2999 3000 3001
        return -1;
    }

3002 3003 3004
    if (fd >= 0 && qemuMonitorSendFileHandle(mon, fdname, fd) < 0)
        return -1;

3005 3006 3007 3008
    if (mon->json)
        ret = qemuMonitorJSONAddDevice(mon, devicestr);
    else
        ret = qemuMonitorTextAddDevice(mon, devicestr);
3009 3010 3011 3012 3013 3014

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

3015 3016 3017
    return ret;
}

3018 3019 3020 3021 3022 3023
int qemuMonitorAddDevice(qemuMonitorPtr mon,
                         const char *devicestr)
{
    return qemuMonitorAddDeviceWithFd(mon, devicestr, -1, NULL);
}

3024 3025 3026
int qemuMonitorAddDrive(qemuMonitorPtr mon,
                        const char *drivestr)
{
3027
    VIR_DEBUG("mon=%p drive=%s", mon, drivestr);
3028 3029
    int ret;

3030
    if (!mon) {
3031 3032
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3033 3034 3035
        return -1;
    }

3036 3037 3038 3039 3040 3041
    if (mon->json)
        ret = qemuMonitorJSONAddDrive(mon, drivestr);
    else
        ret = qemuMonitorTextAddDrive(mon, drivestr);
    return ret;
}
3042 3043 3044 3045 3046 3047


int qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
                                  const char *alias,
                                  const char *passphrase)
{
3048
    VIR_DEBUG("mon=%p alias=%s passphrase=%p(value hidden)", mon, alias, passphrase);
3049 3050
    int ret;

3051
    if (!mon) {
3052 3053
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3054 3055 3056
        return -1;
    }

3057 3058 3059 3060 3061 3062
    if (mon->json)
        ret = qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase);
    else
        ret = qemuMonitorTextSetDrivePassphrase(mon, alias, passphrase);
    return ret;
}
C
Chris Lalancette 已提交
3063 3064 3065 3066 3067

int qemuMonitorCreateSnapshot(qemuMonitorPtr mon, const char *name)
{
    int ret;

E
Eric Blake 已提交
3068
    VIR_DEBUG("mon=%p, name=%s", mon, name);
C
Chris Lalancette 已提交
3069

3070
    if (!mon) {
3071 3072
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3073 3074 3075
        return -1;
    }

C
Chris Lalancette 已提交
3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086
    if (mon->json)
        ret = qemuMonitorJSONCreateSnapshot(mon, name);
    else
        ret = qemuMonitorTextCreateSnapshot(mon, name);
    return ret;
}

int qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name)
{
    int ret;

E
Eric Blake 已提交
3087
    VIR_DEBUG("mon=%p, name=%s", mon, name);
C
Chris Lalancette 已提交
3088

3089
    if (!mon) {
3090 3091
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3092 3093 3094
        return -1;
    }

C
Chris Lalancette 已提交
3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105
    if (mon->json)
        ret = qemuMonitorJSONLoadSnapshot(mon, name);
    else
        ret = qemuMonitorTextLoadSnapshot(mon, name);
    return ret;
}

int qemuMonitorDeleteSnapshot(qemuMonitorPtr mon, const char *name)
{
    int ret;

E
Eric Blake 已提交
3106
    VIR_DEBUG("mon=%p, name=%s", mon, name);
C
Chris Lalancette 已提交
3107

3108
    if (!mon) {
3109 3110
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3111 3112 3113
        return -1;
    }

C
Chris Lalancette 已提交
3114 3115 3116 3117 3118 3119
    if (mon->json)
        ret = qemuMonitorJSONDeleteSnapshot(mon, name);
    else
        ret = qemuMonitorTextDeleteSnapshot(mon, name);
    return ret;
}
3120

3121 3122 3123 3124
/* 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
3125
qemuMonitorDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
3126 3127
                        const char *device, const char *file,
                        const char *format, bool reuse)
3128
{
3129
    int ret = -1;
3130

3131 3132
    VIR_DEBUG("mon=%p, actions=%p, device=%s, file=%s, format=%s, reuse=%d",
              mon, actions, device, file, format, reuse);
3133 3134

    if (!mon) {
3135 3136
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3137 3138 3139
        return -1;
    }

3140
    if (mon->json)
3141 3142
        ret = qemuMonitorJSONDiskSnapshot(mon, actions, device, file, format,
                                          reuse);
3143
    else
3144
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3145
                       _("disk snapshot requires JSON monitor"));
3146 3147 3148
    return ret;
}

3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162
/* Start a drive-mirror block job.  bandwidth is in MiB/sec.  */
int
qemuMonitorDriveMirror(qemuMonitorPtr mon,
                       const char *device, const char *file,
                       const char *format, unsigned long bandwidth,
                       unsigned int flags)
{
    int ret = -1;
    unsigned long long speed;

    VIR_DEBUG("mon=%p, device=%s, file=%s, format=%s, bandwidth=%ld, "
              "flags=%x",
              mon, device, file, NULLSTR(format), bandwidth, flags);

3163 3164
    /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is
     * limited to LLONG_MAX also for unsigned values */
3165
    speed = bandwidth;
3166
    if (speed > LLONG_MAX >> 20) {
3167 3168
        virReportError(VIR_ERR_OVERFLOW,
                       _("bandwidth must be less than %llu"),
3169
                       LLONG_MAX >> 20);
3170 3171 3172 3173 3174 3175 3176 3177
        return -1;
    }
    speed <<= 20;

    if (mon->json)
        ret = qemuMonitorJSONDriveMirror(mon, device, file, format, speed,
                                         flags);
    else
3178
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3179 3180 3181 3182
                       _("drive-mirror requires JSON monitor"));
    return ret;
}

3183 3184 3185 3186 3187 3188 3189 3190
/* Use the transaction QMP command to run atomic snapshot commands.  */
int
qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr actions)
{
    int ret = -1;

    VIR_DEBUG("mon=%p, actions=%p", mon, actions);

3191
    if (mon->json)
3192
        ret = qemuMonitorJSONTransaction(mon, actions);
3193
    else
3194
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3195
                       _("transaction requires JSON monitor"));
3196 3197 3198
    return ret;
}

3199
/* Start a block-commit block job.  bandwidth is in MiB/sec.  */
3200 3201 3202 3203 3204 3205 3206 3207 3208
int
qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device,
                       const char *top, const char *base,
                       unsigned long bandwidth)
{
    int ret = -1;
    unsigned long long speed;

    VIR_DEBUG("mon=%p, device=%s, top=%s, base=%s, bandwidth=%ld",
3209
              mon, device, top, base, bandwidth);
3210

3211 3212
    /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is
     * limited to LLONG_MAX also for unsigned values */
3213
    speed = bandwidth;
3214
    if (speed > LLONG_MAX >> 20) {
3215 3216
        virReportError(VIR_ERR_OVERFLOW,
                       _("bandwidth must be less than %llu"),
3217
                       LLONG_MAX >> 20);
3218 3219 3220 3221 3222 3223 3224
        return -1;
    }
    speed <<= 20;

    if (mon->json)
        ret = qemuMonitorJSONBlockCommit(mon, device, top, base, speed);
    else
3225
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3226 3227 3228 3229
                       _("block-commit requires JSON monitor"));
    return ret;
}

3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243
/* Use the block-job-complete monitor command to pivot a block copy
 * job.  */
int
qemuMonitorDrivePivot(qemuMonitorPtr mon, const char *device,
                      const char *file, const char *format)
{
    int ret = -1;

    VIR_DEBUG("mon=%p, device=%s, file=%s, format=%s",
              mon, device, file, NULLSTR(format));

    if (mon->json)
        ret = qemuMonitorJSONDrivePivot(mon, device, file, format);
    else
3244
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3245 3246 3247 3248
                       _("drive pivot requires JSON monitor"));
    return ret;
}

3249 3250 3251 3252
int qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
                                const char *cmd,
                                char **reply,
                                bool hmp)
3253 3254 3255
{
    int ret;

3256
    VIR_DEBUG("mon=%p, cmd=%s, reply=%p, hmp=%d", mon, cmd, reply, hmp);
3257 3258

    if (mon->json)
3259
        ret = qemuMonitorJSONArbitraryCommand(mon, cmd, reply, hmp);
3260 3261 3262 3263
    else
        ret = qemuMonitorTextArbitraryCommand(mon, cmd, reply);
    return ret;
}
3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277


int qemuMonitorInjectNMI(qemuMonitorPtr mon)
{
    int ret;

    VIR_DEBUG("mon=%p", mon);

    if (mon->json)
        ret = qemuMonitorJSONInjectNMI(mon);
    else
        ret = qemuMonitorTextInjectNMI(mon);
    return ret;
}
3278

3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295
int qemuMonitorSendKey(qemuMonitorPtr mon,
                       unsigned int holdtime,
                       unsigned int *keycodes,
                       unsigned int nkeycodes)
{
    int ret;

    VIR_DEBUG("mon=%p, holdtime=%u, nkeycodes=%u",
              mon, holdtime, nkeycodes);

    if (mon->json)
        ret = qemuMonitorJSONSendKey(mon, holdtime, keycodes, nkeycodes);
    else
        ret = qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes);
    return ret;
}

3296 3297 3298 3299 3300 3301 3302 3303
int qemuMonitorScreendump(qemuMonitorPtr mon,
                          const char *file)
{
    int ret;

    VIR_DEBUG("mon=%p, file=%s", mon, file);

    if (!mon) {
E
Eric Blake 已提交
3304
        virReportError(VIR_ERR_INVALID_ARG, "%s",
3305
                       _("monitor must not be NULL"));
3306 3307 3308 3309 3310 3311 3312 3313 3314
        return -1;
    }

    if (mon->json)
        ret = qemuMonitorJSONScreendump(mon, file);
    else
        ret = qemuMonitorTextScreendump(mon, file);
    return ret;
}
3315

3316
/* bandwidth is in MiB/sec */
3317 3318
int qemuMonitorBlockJob(qemuMonitorPtr mon,
                        const char *device,
3319
                        const char *base,
3320 3321
                        unsigned long bandwidth,
                        virDomainBlockJobInfoPtr info,
3322 3323
                        qemuMonitorBlockJobCmd mode,
                        bool modern)
3324
{
E
Eric Blake 已提交
3325
    int ret = -1;
3326
    unsigned long long speed;
3327

3328 3329 3330 3331
    VIR_DEBUG("mon=%p, device=%s, base=%s, bandwidth=%luM, info=%p, mode=%o, "
              "modern=%d", mon, device, NULLSTR(base), bandwidth, info, mode,
              modern);

3332 3333
    /* Convert bandwidth MiB to bytes - unfortunately the JSON QMP protocol is
     * limited to LLONG_MAX also for unsigned values */
3334
    speed = bandwidth;
3335
    if (speed > LLONG_MAX >> 20) {
3336 3337
        virReportError(VIR_ERR_OVERFLOW,
                       _("bandwidth must be less than %llu"),
3338
                       LLONG_MAX >> 20);
3339 3340
        return -1;
    }
3341
    speed <<= 20;
3342 3343

    if (mon->json)
3344 3345
        ret = qemuMonitorJSONBlockJob(mon, device, base, speed, info, mode,
                                      modern);
3346
    else
3347
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3348
                       _("block jobs require JSON monitor"));
3349 3350
    return ret;
}
3351

3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384
int qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon,
                                  const char *device,
                                  virDomainBlockIoTuneInfoPtr info)
{
    int ret;

    VIR_DEBUG("mon=%p, device=%p, info=%p", mon, device, info);

    if (mon->json) {
        ret = qemuMonitorJSONSetBlockIoThrottle(mon, device, info);
    } else {
        ret = qemuMonitorTextSetBlockIoThrottle(mon, device, info);
    }
    return ret;
}

int qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon,
                                  const char *device,
                                  virDomainBlockIoTuneInfoPtr reply)
{
    int ret;

    VIR_DEBUG("mon=%p, device=%p, reply=%p", mon, device, reply);

    if (mon->json) {
        ret = qemuMonitorJSONGetBlockIoThrottle(mon, device, reply);
    } else {
        ret = qemuMonitorTextGetBlockIoThrottle(mon, device, reply);
    }
    return ret;
}


3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427
int qemuMonitorVMStatusToPausedReason(const char *status)
{
    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;

3428
    case QEMU_MONITOR_VM_STATUS_GUEST_PANICKED:
3429
        return VIR_DOMAIN_PAUSED_CRASHED;
3430

3431 3432 3433 3434 3435 3436
    /* unreachable from this point on */
    case QEMU_MONITOR_VM_STATUS_LAST:
        ;
    }
    return VIR_DOMAIN_PAUSED_UNKNOWN;
}
3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449


int qemuMonitorOpenGraphics(qemuMonitorPtr mon,
                            const char *protocol,
                            int fd,
                            const char *fdname,
                            bool skipauth)
{
    VIR_DEBUG("mon=%p protocol=%s fd=%d fdname=%s skipauth=%d",
              mon, protocol, fd, NULLSTR(fdname), skipauth);
    int ret;

    if (!mon) {
3450 3451
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469
        return -1;
    }

    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;
}
3470 3471 3472 3473 3474 3475

int qemuMonitorSystemWakeup(qemuMonitorPtr mon)
{
    VIR_DEBUG("mon=%p", mon);

    if (!mon) {
3476 3477
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3478 3479 3480 3481
        return -1;
    }

    if (!mon->json) {
3482
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3483
                       _("JSON monitor is required"));
3484 3485 3486 3487 3488
        return -1;
    }

    return qemuMonitorJSONSystemWakeup(mon);
}
3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3506
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3507 3508 3509 3510 3511 3512
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetVersion(mon, major, minor, micro, package);
}
3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3527
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetMachines(mon, machines);
}

void qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine)
{
    if (!machine)
        return;
    VIR_FREE(machine->name);
    VIR_FREE(machine->alias);
    VIR_FREE(machine);
}
3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3557
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3558 3559 3560 3561 3562 3563
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetCPUDefinitions(mon, cpus);
}
3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578


int qemuMonitorGetCommands(qemuMonitorPtr mon,
                           char ***commands)
{
    VIR_DEBUG("mon=%p commands=%p",
              mon, commands);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3579
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3580 3581 3582 3583 3584 3585
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetCommands(mon, commands);
}
3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600


int qemuMonitorGetEvents(qemuMonitorPtr mon,
                         char ***events)
{
    VIR_DEBUG("mon=%p events=%p",
              mon, events);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3601
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3602 3603 3604 3605 3606 3607
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetEvents(mon, events);
}
3608 3609


3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634
/* 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,
                                          char ***params)
{
    VIR_DEBUG("mon=%p option=%s params=%p", mon, option, params);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetCommandLineOptionParameters(mon, option, params);
}


3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648
int qemuMonitorGetKVMState(qemuMonitorPtr mon,
                           bool *enabled,
                           bool *present)
{
    VIR_DEBUG("mon=%p enabled=%p present=%p",
              mon, enabled, present);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3649
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3650 3651 3652 3653 3654 3655 3656 3657
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetKVMState(mon, enabled, present);
}


3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670
int qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
                              char ***types)
{
    VIR_DEBUG("mon=%p types=%p",
              mon, types);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3671
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3672 3673 3674 3675 3676 3677
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetObjectTypes(mon, types);
}
3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693


int qemuMonitorGetObjectProps(qemuMonitorPtr mon,
                              const char *type,
                              char ***props)
{
    VIR_DEBUG("mon=%p type=%s props=%p",
              mon, type, props);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
3694
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3695 3696 3697 3698 3699 3700
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetObjectProps(mon, type, props);
}
3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714


char *qemuMonitorGetTargetArch(qemuMonitorPtr mon)
{
    VIR_DEBUG("mon=%p",
              mon);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return NULL;
    }

    if (!mon->json) {
3715
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3716 3717 3718 3719 3720 3721
                       _("JSON monitor is required"));
        return NULL;
    }

    return qemuMonitorJSONGetTargetArch(mon);
}
3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763


/**
 * Returns 1 if @capability is supported, 0 if it's not, or -1 on error.
 */
int qemuMonitorGetMigrationCapability(qemuMonitorPtr mon,
                                      qemuMonitorMigrationCaps capability)
{
    VIR_DEBUG("mon=%p capability=%d", mon, capability);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

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

    return qemuMonitorJSONGetMigrationCapability(mon, capability);
}

int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon,
                                      qemuMonitorMigrationCaps capability)
{
    VIR_DEBUG("mon=%p capability=%d", mon, capability);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONSetMigrationCapability(mon, capability);
}
3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONNBDServerStart(mon, host, port);
}
3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONNBDServerAdd(mon, deviceID, writable);
}
3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826

int qemuMonitorNBDServerStop(qemuMonitorPtr mon)
{
    VIR_DEBUG("mon=%p", mon);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONNBDServerStop(mon);
}
S
Stefan Berger 已提交
3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870


int qemuMonitorGetTPMModels(qemuMonitorPtr mon,
                            char ***tpmmodels)
{
    VIR_DEBUG("mon=%p tpmmodels=%p",
              mon, tpmmodels);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetTPMModels(mon, tpmmodels);
}


int qemuMonitorGetTPMTypes(qemuMonitorPtr mon,
                           char ***tpmtypes)
{
    VIR_DEBUG("mon=%p tpmtypes=%p",
              mon, tpmtypes);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetTPMTypes(mon, tpmtypes);
}
3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONAttachCharDev(mon, chrID, chr);
}
3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911

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

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONDetachCharDev(mon, chrID);
}
3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932

int
qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
                            char ***aliases)
{
    VIR_DEBUG("mon=%p, aliases=%p", mon, aliases);

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
        return -1;
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
        return -1;
    }

    return qemuMonitorJSONGetDeviceAliases(mon, aliases);
}
3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954


/**
 * 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
 * @logfd: File descriptor of the already open log file
 */
int
qemuMonitorSetDomainLog(qemuMonitorPtr mon, int logfd)
{
    VIR_FORCE_CLOSE(mon->logfd);
    if (logfd >= 0 &&
        (mon->logfd = dup(logfd)) < 0) {
        virReportSystemError(errno, "%s", _("failed to duplicate log fd"));
        return -1;
    }

    return 0;
}
3955 3956 3957 3958 3959 3960


/**
 * qemuMonitorJSONGetGuestCPU:
 * @mon: Pointer to the monitor
 * @arch: arch of the guest
3961
 * @data: returns the cpu data
3962 3963 3964
 *
 * Retrieve the definition of the guest CPU from a running qemu instance.
 *
3965 3966
 * Returns 0 on success, -2 if the operation is not supported by the guest,
 * -1 on other errors.
3967
 */
3968
int
3969
qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
3970 3971
                       virArch arch,
                       virCPUDataPtr *data)
3972
{
3973
    VIR_DEBUG("mon=%p, arch='%s' data='%p'", mon, virArchToString(arch), data);
3974 3975 3976 3977

    if (!mon) {
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("monitor must not be NULL"));
3978
        return -1;
3979 3980 3981 3982 3983
    }

    if (!mon->json) {
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                       _("JSON monitor is required"));
3984
        return -1;
3985 3986
    }

3987 3988 3989
    *data = NULL;

    return qemuMonitorJSONGetGuestCPU(mon, arch, data);
3990
}