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

#include <config.h>

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

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

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

51 52
#define VIR_FROM_THIS VIR_FROM_QEMU

53 54
VIR_LOG_INIT("qemu.qemu_monitor");

55 56
#define DEBUG_IO 0
#define DEBUG_RAW_IO 0
57

58 59 60 61 62 63 64 65 66
/* We read from QEMU until seeing a \r\n pair to indicate a
 * completed reply or event. To avoid memory denial-of-service
 * though, we must have a size limit on amount of data we
 * buffer. 10 MB is large enough that it ought to cope with
 * normal QEMU replies, and small enough that we're not
 * consuming unreasonable mem.
 */
#define QEMU_MONITOR_MAX_RESPONSE (10 * 1024 * 1024)

67
struct _qemuMonitor {
68
    virObjectLockable parent;
69

70 71
    virCond notify;

72
    int fd;
73 74 75 76 77 78

    /* Represents the watch number to be used for updating and
     * unregistering the monitor @fd for events in the event loop:
     * > 0: valid watch number
     * = 0: not registered
     * < 0: an error occurred during the registration of @fd */
79 80 81 82 83
    int watch;
    int hasSendFD;

    virDomainObjPtr vm;

84
    qemuMonitorCallbacksPtr cb;
85
    void *callbackOpaque;
86 87 88 89 90 91 92 93 94 95 96 97 98

    /* 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 */
99 100 101
    virError lastError;

    int nextSerial;
102

E
Eric Blake 已提交
103 104
    bool json;
    bool waitGreeting;
105 106 107

    /* cache of query-command-line-options results */
    virJSONValuePtr options;
108 109 110 111

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

113 114 115 116
    /* Log file context of the qemu process to dig for usable info */
    qemuMonitorReportDomainLogError logFunc;
    void *logOpaque;
    virFreeCallback logDestroy;
117 118
};

119 120 121 122 123 124 125 126 127 128
/**
 * QEMU_CHECK_MONITOR_FULL:
 * @mon: monitor pointer variable to check, evaluated multiple times, no parentheses
 * @force_json: force JSON monitor, true or false
 * @exit: statement that is used to exit the function
 *
 * This macro checks that the monitor is valid for given operation and exits
 * the function if not. The macro also adds a debug statement regarding the
 * monitor.
 */
129 130 131 132 133 134 135 136 137 138 139 140 141 142
#define QEMU_CHECK_MONITOR_FULL(mon, force_json, exit) \
    do { \
        if (!mon) { \
            virReportError(VIR_ERR_INVALID_ARG, "%s", \
                           _("monitor must not be NULL")); \
            exit; \
        } \
        VIR_DEBUG("mon:%p vm:%p json:%d fd:%d", \
                  mon, mon->vm, mon->json, mon->fd); \
        if (force_json && !mon->json) { \
            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", \
                           _("JSON monitor is required")); \
            exit; \
        } \
143
    } while (0)
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

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

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

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

163 164 165 166 167
static virClassPtr qemuMonitorClass;
static void qemuMonitorDispose(void *obj);

static int qemuMonitorOnceInit(void)
{
168
    if (!VIR_CLASS_NEW(qemuMonitor, virClassForObjectLockable()))
169 170 171 172 173 174 175
        return -1;

    return 0;
}

VIR_ONCE_GLOBAL_INIT(qemuMonitor)

176

177 178
VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
              QEMU_MONITOR_MIGRATION_STATUS_LAST,
179
              "inactive", "setup",
180 181
              "active", "pre-switchover",
              "device", "postcopy-active",
182 183
              "completed", "failed",
              "cancelling", "cancelled")
184

185 186 187 188
VIR_ENUM_IMPL(qemuMonitorVMStatus,
              QEMU_MONITOR_VM_STATUS_LAST,
              "debug", "inmigrate", "internal-error", "io-error", "paused",
              "postmigrate", "prelaunch", "finish-migrate", "restore-vm",
189
              "running", "save-vm", "shutdown", "watchdog", "guest-panicked")
190

191 192 193 194 195 196 197 198 199 200 201 202 203 204
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")

205 206 207 208
VIR_ENUM_IMPL(qemuMonitorDumpStatus,
              QEMU_MONITOR_DUMP_STATUS_LAST,
              "none", "active", "completed", "failed")

209 210
char *
qemuMonitorEscapeArg(const char *in)
211 212
{
    int len = 0;
213
    size_t i, j;
214 215 216 217 218 219 220
    char *out;

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

    for (i = 0; in[i] != '\0'; i++) {
221
        switch (in[i]) {
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
        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++) {
238
        switch (in[i]) {
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
        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;
}

262 263 264

char *
qemuMonitorUnescapeArg(const char *in)
265
{
266
    size_t i, j;
267
    char *out;
268
    int len = strlen(in);
269 270
    char next;

271
    if (VIR_ALLOC_N(out, len + 1) < 0)
272 273 274 275 276 277
        return NULL;

    for (i = j = 0; i < len; ++i) {
        next = in[i];
        if (in[i] == '\\') {
            ++i;
278
            switch (in[i]) {
279 280 281 282 283 284 285 286 287 288 289
            case 'r':
                next = '\r';
                break;
            case 'n':
                next = '\n';
                break;
            case '"':
            case '\\':
                next = in[i];
                break;
            default:
290
                /* invalid input (including trailing '\' at end of in) */
291 292 293 294 295 296 297 298 299 300 301
                VIR_FREE(out);
                return NULL;
            }
        }
        out[j++] = next;
    }
    out[j] = '\0';

    return out;
}

302

J
Jiri Denemark 已提交
303
#if DEBUG_RAW_IO
304
# include <c-ctype.h>
305 306
static char *
qemuMonitorEscapeNonPrintable(const char *text)
307
{
308
    size_t i;
309
    virBuffer buf = VIR_BUFFER_INITIALIZER;
310
    for (i = 0; text[i] != '\0'; i++) {
311 312
        if (c_isprint(text[i]) ||
            text[i] == '\n' ||
E
Eric Blake 已提交
313 314
            (text[i] == '\r' && text[i + 1] == '\n'))
            virBufferAddChar(&buf, text[i]);
315
        else
316
            virBufferAsprintf(&buf, "0x%02x", text[i]);
317 318 319 320 321
    }
    return virBufferContentAndReset(&buf);
}
#endif

322 323 324

static void
qemuMonitorDispose(void *obj)
325
{
326 327
    qemuMonitorPtr mon = obj;

328
    VIR_DEBUG("mon=%p", mon);
329
    if (mon->cb && mon->cb->destroy)
330
        (mon->cb->destroy)(mon, mon->vm, mon->callbackOpaque);
331 332
    virObjectUnref(mon->vm);

333
    virResetError(&mon->lastError);
334
    virCondDestroy(&mon->notify);
E
Eric Blake 已提交
335
    VIR_FREE(mon->buffer);
336
    virJSONValueFree(mon->options);
337
    VIR_FREE(mon->balloonpath);
338 339 340 341
}


static int
342 343 344
qemuMonitorOpenUnix(const char *monitor,
                    pid_t cpid,
                    unsigned long long timeout)
345 346 347
{
    struct sockaddr_un addr;
    int monfd;
348
    virTimeBackOffVar timebackoff;
349
    int ret = -1;
350 351

    if ((monfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
352
        virReportSystemError(errno,
353 354 355 356 357 358 359
                             "%s", _("failed to create socket"));
        return -1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    if (virStrcpyStatic(addr.sun_path, monitor) == NULL) {
360 361
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Monitor path %s too big for destination"), monitor);
362 363 364
        goto error;
    }

365
    if (virTimeBackOffStart(&timebackoff, 1, timeout * 1000) < 0)
366
        goto error;
367
    while (virTimeBackOffWait(&timebackoff)) {
368
        ret = connect(monfd, (struct sockaddr *)&addr, sizeof(addr));
369 370 371 372

        if (ret == 0)
            break;

373
        if ((errno == ENOENT || errno == ECONNREFUSED) &&
374
            (!cpid || virProcessKill(cpid, 0) == 0)) {
375 376 377 378 379
            /* ENOENT       : Socket may not have shown up yet
             * ECONNREFUSED : Leftover socket hasn't been removed yet */
            continue;
        }

380
        virReportSystemError(errno, "%s",
381 382 383
                             _("failed to connect to monitor socket"));
        goto error;

384
    }
385 386

    if (ret != 0) {
387
        virReportSystemError(errno, "%s",
388
                             _("monitor socket did not show up"));
389 390 391
        goto error;
    }

392
    return monfd;
393

394
 error:
395
    VIR_FORCE_CLOSE(monfd);
396 397 398
    return -1;
}

399

400
static int
401
qemuMonitorOpenPty(const char *monitor)
402 403 404 405
{
    int monfd;

    if ((monfd = open(monitor, O_RDWR)) < 0) {
406 407
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Unable to open monitor path %s"), monitor);
408 409 410
        return -1;
    }

411
    return monfd;
412
}
413

414

415 416 417 418
/* This method processes data that has been received
 * from the monitor. Looking for async events and
 * replies/errors.
 */
419 420 421 422 423 424 425 426 427 428 429
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;

430
#if DEBUG_IO
431
# if DEBUG_RAW_IO
432 433
    char *str1 = qemuMonitorEscapeNonPrintable(msg ? msg->txBuffer : "");
    char *str2 = qemuMonitorEscapeNonPrintable(mon->buffer);
434
    VIR_ERROR(_("Process %d %p %p [[[[%s]]][[[%s]]]"), (int)mon->bufferOffset, mon->msg, msg, str1, str2);
435 436
    VIR_FREE(str1);
    VIR_FREE(str2);
437
# else
438
    VIR_DEBUG("Process %d", (int)mon->bufferOffset);
439
# endif
440 441
#endif

442 443
    PROBE_QUIET(QEMU_MONITOR_IO_PROCESS, "mon=%p buf=%s len=%zu",
                mon, mon->buffer, mon->bufferOffset);
444

D
Daniel P. Berrange 已提交
445 446 447 448 449 450 451 452
    if (mon->json)
        len = qemuMonitorJSONIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
    else
        len = qemuMonitorTextIOProcess(mon,
                                       mon->buffer, mon->bufferOffset,
                                       msg);
453

454
    if (len < 0)
455 456
        return -1;

E
Eric Blake 已提交
457 458
    if (len && mon->waitGreeting)
        mon->waitGreeting = false;
459

460 461 462 463 464 465 466
    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;
    }
467
#if DEBUG_IO
468
    VIR_DEBUG("Process done %d used %d", (int)mon->bufferOffset, len);
469
#endif
470 471 472 473 474 475
    if (msg && msg->finished)
        virCondBroadcast(&mon->notify);
    return len;
}


S
Stefan Berger 已提交
476
/* Call this function while holding the monitor lock. */
477 478 479 480 481 482 483 484 485 486 487 488 489
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));
490
    memset(control, 0, sizeof(control));
491 492 493 494 495 496 497 498 499 500 501

    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);
502 503 504
    /* 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);
505 506 507 508 509 510 511 512 513 514 515 516
    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;
}

517

S
Stefan Berger 已提交
518 519 520 521
/*
 * Called when the monitor is able to write data
 * Call this function while holding the monitor lock.
 */
522 523 524 525
static int
qemuMonitorIOWrite(qemuMonitorPtr mon)
{
    int done;
J
John Ferlan 已提交
526 527
    char *buf;
    size_t len;
528 529 530 531 532

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

533
    if (mon->msg->txFD != -1 && !mon->hasSendFD) {
534 535
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Monitor does not support sending of file descriptors"));
536 537 538
        return -1;
    }

J
John Ferlan 已提交
539 540
    buf = mon->msg->txBuffer + mon->msg->txOffset;
    len = mon->msg->txLength - mon->msg->txOffset;
541
    if (mon->msg->txFD == -1)
J
John Ferlan 已提交
542
        done = write(mon->fd, buf, len);
543
    else
J
John Ferlan 已提交
544
        done = qemuMonitorIOWriteWithFD(mon, buf, len, mon->msg->txFD);
545

546
    PROBE(QEMU_MONITOR_IO_WRITE,
547
          "mon=%p buf=%s len=%zu ret=%d errno=%d",
548
          mon, buf, len, done, done < 0 ? errno : 0);
549

550
    if (mon->msg->txFD != -1) {
551 552
        PROBE(QEMU_MONITOR_IO_SEND_FD,
              "mon=%p fd=%d ret=%d errno=%d",
553
              mon, mon->msg->txFD, done, done < 0 ? errno : 0);
554
    }
555

556 557 558 559
    if (done < 0) {
        if (errno == EAGAIN)
            return 0;

560 561
        virReportSystemError(errno, "%s",
                             _("Unable to write to monitor"));
562 563 564 565 566 567
        return -1;
    }
    mon->msg->txOffset += done;
    return done;
}

568

569 570
/*
 * Called when the monitor has incoming data to read
S
Stefan Berger 已提交
571
 * Call this function while holding the monitor lock.
572 573 574 575 576 577 578 579 580 581
 *
 * 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) {
582 583 584 585 586 587
        if (mon->bufferLength >= QEMU_MONITOR_MAX_RESPONSE) {
            virReportSystemError(ERANGE,
                                 _("No complete monitor response found in %d bytes"),
                                 QEMU_MONITOR_MAX_RESPONSE);
            return -1;
        }
588
        if (VIR_REALLOC_N(mon->buffer,
589
                          mon->bufferLength + 1024) < 0)
590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
            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;
605 606
            virReportSystemError(errno, "%s",
                                 _("Unable to read from monitor"));
607 608 609 610 611 612 613 614 615 616 617 618
            ret = -1;
            break;
        }
        if (got == 0)
            break;

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

619
#if DEBUG_IO
620
    VIR_DEBUG("Now read %d bytes of data", (int)mon->bufferOffset);
621
#endif
622 623 624 625 626

    return ret;
}


627 628
static void
qemuMonitorUpdateWatch(qemuMonitorPtr mon)
629 630 631 632 633
{
    int events =
        VIR_EVENT_HANDLE_HANGUP |
        VIR_EVENT_HANDLE_ERROR;

634 635 636
    if (!mon->watch)
        return;

637
    if (mon->lastError.code == VIR_ERR_OK) {
638 639
        events |= VIR_EVENT_HANDLE_READABLE;

640
        if ((mon->msg && mon->msg->txOffset < mon->msg->txLength) &&
E
Eric Blake 已提交
641
            !mon->waitGreeting)
642 643 644 645
            events |= VIR_EVENT_HANDLE_WRITABLE;
    }

    virEventUpdateHandle(mon->watch, events);
646 647
}

648 649

static void
650 651
qemuMonitorIO(int watch, int fd, int events, void *opaque)
{
652
    qemuMonitorPtr mon = opaque;
653 654
    bool error = false;
    bool eof = false;
655
    bool hangup = false;
656

657 658
    virObjectRef(mon);

S
Stefan Berger 已提交
659
    /* lock access to the monitor and protect fd */
660
    virObjectLock(mon);
661
#if DEBUG_IO
662
    VIR_DEBUG("Monitor %p I/O on watch %d fd %d events %d", mon, watch, fd, events);
663
#endif
664
    if (mon->fd == -1 || mon->watch == 0) {
665
        virObjectUnlock(mon);
666 667 668
        virObjectUnref(mon);
        return;
    }
669

670
    if (mon->fd != fd || mon->watch != watch) {
671
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
672
            eof = true;
673 674 675
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("event from unexpected fd %d!=%d / watch %d!=%d"),
                       mon->fd, fd, mon->watch, watch);
676 677
        error = true;
    } else if (mon->lastError.code != VIR_ERR_OK) {
678
        if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR))
679
            eof = true;
680
        error = true;
681
    } else {
682
        if (events & VIR_EVENT_HANDLE_WRITABLE) {
683
            if (qemuMonitorIOWrite(mon) < 0) {
684
                error = true;
685 686 687
                if (errno == ECONNRESET)
                    hangup = true;
            }
688 689
            events &= ~VIR_EVENT_HANDLE_WRITABLE;
        }
690 691

        if (!error &&
692 693
            events & VIR_EVENT_HANDLE_READABLE) {
            int got = qemuMonitorIORead(mon);
694 695
            events &= ~VIR_EVENT_HANDLE_READABLE;
            if (got < 0) {
696
                error = true;
697 698
                if (errno == ECONNRESET)
                    hangup = true;
699 700 701 702 703
            } 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 */
704 705 706
                events = 0;

                if (qemuMonitorIOProcess(mon) < 0)
707
                    error = true;
708
            }
709 710
        }

711 712 713
        if (events & VIR_EVENT_HANDLE_HANGUP) {
            hangup = true;
            if (!error) {
714 715
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("End of file from qemu monitor"));
716 717 718
                eof = true;
                events &= ~VIR_EVENT_HANDLE_HANGUP;
            }
719 720
        }

721 722
        if (!error && !eof &&
            events & VIR_EVENT_HANDLE_ERROR) {
723 724
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Invalid file descriptor while waiting for monitor"));
725
            eof = true;
726
            events &= ~VIR_EVENT_HANDLE_ERROR;
727 728
        }
        if (!error && events) {
729 730 731
            virReportError(VIR_ERR_INTERNAL_ERROR,
                           _("Unhandled event %d for monitor fd %d"),
                           events, mon->fd);
732
            error = true;
733 734 735
        }
    }

736
    if (error || eof) {
737
        if (hangup && mon->logFunc != NULL) {
738 739
            /* 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
740 741 742
             * startup phases or during incoming migration when the message
             * from qemu is certainly more interesting than a
             * "connection reset by peer" message.
743
             */
744
            mon->logFunc(mon,
745
                         _("qemu unexpectedly closed the monitor"),
746
                         mon->logOpaque);
747 748
            virCopyLastError(&mon->lastError);
            virResetLastError();
749 750
        }

751 752 753
        if (mon->lastError.code != VIR_ERR_OK) {
            /* Already have an error, so clear any new error */
            virResetLastError();
754
        } else {
755 756
            virErrorPtr err = virGetLastError();
            if (!err)
757 758
                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                               _("Error while processing monitor IO"));
759 760 761 762 763 764 765 766 767 768 769 770
            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);
        }
    }
771 772 773

    qemuMonitorUpdateWatch(mon);

774 775 776
    /* 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 */
777
    if (eof) {
J
Jiri Denemark 已提交
778
        qemuMonitorEofNotifyCallback eofNotify = mon->cb->eofNotify;
779
        virDomainObjPtr vm = mon->vm;
780

781 782
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
783
        virObjectUnlock(mon);
784
        VIR_DEBUG("Triggering EOF callback");
785
        (eofNotify)(mon, vm, mon->callbackOpaque);
786
        virObjectUnref(mon);
787
    } else if (error) {
J
Jiri Denemark 已提交
788
        qemuMonitorErrorNotifyCallback errorNotify = mon->cb->errorNotify;
789
        virDomainObjPtr vm = mon->vm;
790

791 792
        /* Make sure anyone waiting wakes up now */
        virCondSignal(&mon->notify);
793
        virObjectUnlock(mon);
794
        VIR_DEBUG("Triggering error callback");
795
        (errorNotify)(mon, vm, mon->callbackOpaque);
796
        virObjectUnref(mon);
797
    } else {
798
        virObjectUnlock(mon);
799
        virObjectUnref(mon);
800
    }
801 802 803
}


804 805 806 807
static qemuMonitorPtr
qemuMonitorOpenInternal(virDomainObjPtr vm,
                        int fd,
                        bool hasSendFD,
E
Eric Blake 已提交
808
                        bool json,
809 810
                        qemuMonitorCallbacksPtr cb,
                        void *opaque)
811
{
812 813
    qemuMonitorPtr mon;

814
    if (!cb->eofNotify) {
815 816
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("EOF notify callback must be supplied"));
817 818
        return NULL;
    }
819 820 821 822 823
    if (!cb->errorNotify) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Error notify callback must be supplied"));
        return NULL;
    }
824

825 826 827
    if (qemuMonitorInitialize() < 0)
        return NULL;

828
    if (!(mon = virObjectLockableNew(qemuMonitorClass)))
829 830
        return NULL;

831
    if (virCondInit(&mon->notify) < 0) {
832 833
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("cannot initialize monitor condition"));
834
        goto cleanup;
835
    }
836 837
    mon->fd = fd;
    mon->hasSendFD = hasSendFD;
838
    mon->vm = virObjectRef(vm);
D
Daniel P. Berrange 已提交
839
    mon->json = json;
840
    if (json)
E
Eric Blake 已提交
841
        mon->waitGreeting = true;
842
    mon->cb = cb;
843
    mon->callbackOpaque = opaque;
844

845
    if (virSetCloseExec(mon->fd) < 0) {
846 847
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to set monitor close-on-exec flag"));
848 849 850
        goto cleanup;
    }
    if (virSetNonBlock(mon->fd) < 0) {
851 852
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       "%s", _("Unable to put monitor into non-blocking mode"));
853 854 855 856
        goto cleanup;
    }


E
Eric Blake 已提交
857
    virObjectLock(mon);
858
    if (!qemuMonitorRegister(mon)) {
E
Eric Blake 已提交
859
        virObjectUnlock(mon);
860 861
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("unable to register monitor events"));
862 863 864
        goto cleanup;
    }

865 866
    PROBE(QEMU_MONITOR_NEW,
          "mon=%p refs=%d fd=%d",
867
          mon, mon->parent.parent.u.s.refs, mon->fd);
868
    virObjectUnlock(mon);
869

870 871
    return mon;

872
 cleanup:
873 874 875 876 877 878
    /* 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;
879 880
    /* The caller owns 'fd' on failure */
    mon->fd = -1;
881 882 883 884
    qemuMonitorClose(mon);
    return NULL;
}

885

886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904
#define QEMU_DEFAULT_MONITOR_WAIT 30

/**
 * qemuMonitorOpen:
 * @vm: domain object
 * @config: monitor configuration
 * @json: enable JSON on the monitor
 * @timeout: number of seconds to add to default timeout
 * @cb: monitor event handles
 * @opaque: opaque data for @cb
 *
 * Opens the monitor for running qemu. It may happen that it
 * takes some time for qemu to create the monitor socket (e.g.
 * because kernel is zeroing configured hugepages), therefore we
 * wait up to default + timeout seconds for the monitor to show
 * up after which a failure is claimed.
 *
 * Returns monitor object, NULL on error.
 */
905 906 907
qemuMonitorPtr
qemuMonitorOpen(virDomainObjPtr vm,
                virDomainChrSourceDefPtr config,
E
Eric Blake 已提交
908
                bool json,
909
                unsigned long long timeout,
910 911
                qemuMonitorCallbacksPtr cb,
                void *opaque)
912 913 914 915 916
{
    int fd;
    bool hasSendFD = false;
    qemuMonitorPtr ret;

917 918
    timeout += QEMU_DEFAULT_MONITOR_WAIT;

919 920 921
    switch (config->type) {
    case VIR_DOMAIN_CHR_TYPE_UNIX:
        hasSendFD = true;
922
        if ((fd = qemuMonitorOpenUnix(config->data.nix.path,
923
                                      vm->pid, timeout)) < 0)
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
            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;
    }

939
    ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb, opaque);
940 941 942 943 944 945
    if (!ret)
        VIR_FORCE_CLOSE(fd);
    return ret;
}


946 947 948 949 950 951
qemuMonitorPtr
qemuMonitorOpenFD(virDomainObjPtr vm,
                  int sockfd,
                  bool json,
                  qemuMonitorCallbacksPtr cb,
                  void *opaque)
952
{
953
    return qemuMonitorOpenInternal(vm, sockfd, true, json, cb, opaque);
954 955
}

956

957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984
/**
 * qemuMonitorRegister:
 * @mon: QEMU monitor
 *
 * Registers the monitor in the event loop. The caller has to hold the
 * lock for @mon.
 *
 * Returns true in case of success, false otherwise
 */
bool
qemuMonitorRegister(qemuMonitorPtr mon)
{
    virObjectRef(mon);
    if ((mon->watch = virEventAddHandle(mon->fd,
                                        VIR_EVENT_HANDLE_HANGUP |
                                        VIR_EVENT_HANDLE_ERROR |
                                        VIR_EVENT_HANDLE_READABLE,
                                        qemuMonitorIO,
                                        mon,
                                        virObjectFreeCallback)) < 0) {
        virObjectUnref(mon);
        return false;
    }

    return true;
}


985 986 987 988 989 990 991 992 993
void
qemuMonitorUnregister(qemuMonitorPtr mon)
{
    if (mon->watch) {
        virEventRemoveHandle(mon->watch);
        mon->watch = 0;
    }
}

994 995
void
qemuMonitorClose(qemuMonitorPtr mon)
996 997
{
    if (!mon)
998
        return;
999

1000
    virObjectLock(mon);
1001
    PROBE(QEMU_MONITOR_CLOSE,
1002
          "mon=%p refs=%d", mon, mon->parent.parent.u.s.refs);
S
Stefan Berger 已提交
1003

1004
    qemuMonitorSetDomainLogLocked(mon, NULL, NULL, NULL);
1005

S
Stefan Berger 已提交
1006
    if (mon->fd >= 0) {
1007
        qemuMonitorUnregister(mon);
S
Stefan Berger 已提交
1008
        VIR_FORCE_CLOSE(mon->fd);
1009
    }
1010

1011 1012 1013 1014 1015 1016 1017
    /* 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();

1018
            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
P
Philipp Hahn 已提交
1019
                           _("QEMU monitor was closed"));
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
            virCopyLastError(&mon->lastError);
            if (err) {
                virSetError(err);
                virFreeError(err);
            } else {
                virResetLastError();
            }
        }
        mon->msg->finished = 1;
        virCondSignal(&mon->notify);
    }

1032 1033 1034 1035 1036 1037
    /* Propagate existing monitor error in case the current thread has no
     * error set.
     */
    if (mon->lastError.code != VIR_ERR_OK && !virGetLastError())
        virSetError(&mon->lastError);

1038
    virObjectUnlock(mon);
1039
    virObjectUnref(mon);
1040 1041 1042
}


1043 1044
char *
qemuMonitorNextCommandID(qemuMonitorPtr mon)
1045 1046 1047
{
    char *id;

1048
    ignore_value(virAsprintf(&id, "libvirt-%d", ++mon->nextSerial));
1049 1050 1051 1052
    return id;
}


1053 1054 1055
int
qemuMonitorSend(qemuMonitorPtr mon,
                qemuMonitorMessagePtr msg)
1056
{
1057
    int ret = -1;
1058

E
Eric Blake 已提交
1059
    /* Check whether qemu quit unexpectedly */
1060 1061 1062 1063
    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);
1064 1065 1066
        return -1;
    }

1067 1068
    mon->msg = msg;
    qemuMonitorUpdateWatch(mon);
1069

1070 1071 1072 1073
    PROBE(QEMU_MONITOR_SEND_MSG,
          "mon=%p msg=%s fd=%d",
          mon, mon->msg->txBuffer, mon->msg->txFD);

1074
    while (!mon->msg->finished) {
1075
        if (virCondWait(&mon->notify, &mon->parent.lock) < 0) {
1076 1077
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to wait on monitor condition"));
1078
            goto cleanup;
1079 1080 1081 1082 1083 1084 1085 1086
        }
    }

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

1089
    ret = 0;
1090

1091
 cleanup:
1092 1093
    mon->msg = NULL;
    qemuMonitorUpdateWatch(mon);
1094

1095
    return ret;
1096
}
1097 1098


1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
/**
 * This function returns a new virError object; the caller is responsible
 * for freeing it.
 */
virErrorPtr
qemuMonitorLastError(qemuMonitorPtr mon)
{
    if (mon->lastError.code == VIR_ERR_OK)
        return NULL;

    return virErrorCopyNew(&mon->lastError);
}


1113 1114 1115 1116 1117 1118
virJSONValuePtr
qemuMonitorGetOptions(qemuMonitorPtr mon)
{
    return mon->options;
}

1119

1120 1121 1122 1123 1124 1125
void
qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options)
{
    mon->options = options;
}

1126 1127

/**
1128 1129 1130
 * Search the qom objects for the balloon driver object by its known names
 * of "virtio-balloon-pci" or "virtio-balloon-ccw". The entry for the driver
 * will be found by using function "qemuMonitorJSONFindLinkPath".
1131 1132 1133 1134 1135
 *
 * 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.
 */
1136
static void
1137 1138
qemuMonitorInitBalloonObjectPath(qemuMonitorPtr mon,
                                 virDomainMemballoonDefPtr balloon)
1139 1140 1141
{
    ssize_t i, nprops = 0;
    char *path = NULL;
1142
    const char *name;
1143 1144 1145
    qemuMonitorJSONListPathPtr *bprops = NULL;

    if (mon->balloonpath) {
1146
        return;
1147 1148 1149
    } else if (mon->ballooninit) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("Cannot determine balloon device path"));
1150
        return;
1151
    }
1152
    mon->ballooninit = true;
1153

1154 1155 1156 1157 1158 1159 1160 1161
    switch (balloon->info.type) {
    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
        name = "virtio-balloon-pci";
        break;
    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
        name = "virtio-balloon-ccw";
        break;
    default:
1162
        return;
1163
    }
1164

1165 1166 1167
    if (qemuMonitorJSONFindLinkPath(mon, name, balloon->info.alias, &path) < 0)
        return;

1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
    nprops = qemuMonitorJSONGetObjectListPaths(mon, path, &bprops);
    if (nprops < 0)
        goto cleanup;

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


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

 cleanup:
    for (i = 0; i < nprops; i++)
        qemuMonitorJSONListPathFree(bprops[i]);
    VIR_FREE(bprops);
    VIR_FREE(path);
1192
    return;
1193 1194
}

1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209

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

1210 1211
    QEMU_CHECK_MONITOR(mon);

1212
    if (mon->json) {
1213 1214
        ret = qemuMonitorJSONFindLinkPath(mon, videoName,
                                          video->info.alias, &path);
1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231
        if (ret < 0) {
            if (ret == -2)
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("Failed to find QOM Object path for "
                                 "device '%s'"), videoName);
            return -1;
        }

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

    return 0;
}


1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
/**
 * To update video vram64 size in status XML we need to load correct value from
 * QEMU.  This is supported only with JSON monitor.
 *
 * Returns 0 on success, -1 on failure and sets proper error message.
 */
int
qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon,
                                 virDomainVideoDefPtr video,
                                 const char *videoName)
{
    int ret = -1;
    char *path = NULL;

    QEMU_CHECK_MONITOR(mon);

    if (mon->json) {
1249 1250
        ret = qemuMonitorJSONFindLinkPath(mon, videoName,
                                          video->info.alias, &path);
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
        if (ret < 0) {
            if (ret == -2)
                virReportError(VIR_ERR_INTERNAL_ERROR,
                               _("Failed to find QOM Object path for "
                                 "device '%s'"), videoName);
            return -1;
        }

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

    return 0;
}


1268 1269 1270 1271 1272
int
qemuMonitorHMPCommandWithFd(qemuMonitorPtr mon,
                            const char *cmd,
                            int scm_fd,
                            char **reply)
1273
{
1274 1275 1276
    char *json_cmd = NULL;
    int ret = -1;

1277 1278
    QEMU_CHECK_MONITOR(mon);

1279 1280 1281 1282 1283
    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);
1284 1285
            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                           _("Unable to unescape command"));
1286 1287 1288 1289 1290 1291 1292
            goto cleanup;
        }
        ret = qemuMonitorJSONHumanCommandWithFd(mon, json_cmd, scm_fd, reply);
    } else {
        ret = qemuMonitorTextCommandWithFd(mon, cmd, scm_fd, reply);
    }

1293
 cleanup:
1294 1295
    VIR_FREE(json_cmd);
    return ret;
1296 1297
}

1298

E
Eric Blake 已提交
1299
/* Ensure proper locking around callbacks.  */
1300 1301 1302 1303 1304 1305
#define QEMU_MONITOR_CALLBACK(mon, ret, callback, ...) \
    do { \
        virObjectRef(mon); \
        virObjectUnlock(mon); \
        if ((mon)->cb && (mon)->cb->callback) \
            (ret) = (mon)->cb->callback(mon, __VA_ARGS__, \
1306
                                        (mon)->callbackOpaque); \
1307 1308
        virObjectLock(mon); \
        virObjectUnref(mon); \
E
Eric Blake 已提交
1309
    } while (0)
1310

1311 1312 1313 1314 1315 1316

int
qemuMonitorGetDiskSecret(qemuMonitorPtr mon,
                         const char *path,
                         char **secret,
                         size_t *secretLen)
1317
{
1318
    int ret = -1;
1319 1320 1321
    *secret = NULL;
    *secretLen = 0;

1322
    QEMU_MONITOR_CALLBACK(mon, ret, diskSecretLookup, mon->vm,
E
Eric Blake 已提交
1323
                          path, secret, secretLen);
1324
    return ret;
1325
}
1326 1327


1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341
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;
}


1342
int
1343
qemuMonitorEmitShutdown(qemuMonitorPtr mon, virTristateBool guest)
1344 1345
{
    int ret = -1;
1346
    VIR_DEBUG("mon=%p guest=%u", mon, guest);
1347

1348
    QEMU_MONITOR_CALLBACK(mon, ret, domainShutdown, mon->vm, guest);
1349 1350 1351 1352
    return ret;
}


1353 1354
int
qemuMonitorEmitReset(qemuMonitorPtr mon)
1355 1356 1357 1358
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1359
    QEMU_MONITOR_CALLBACK(mon, ret, domainReset, mon->vm);
1360 1361 1362 1363
    return ret;
}


1364 1365
int
qemuMonitorEmitPowerdown(qemuMonitorPtr mon)
1366 1367 1368 1369
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1370
    QEMU_MONITOR_CALLBACK(mon, ret, domainPowerdown, mon->vm);
1371 1372 1373 1374
    return ret;
}


1375 1376
int
qemuMonitorEmitStop(qemuMonitorPtr mon)
1377 1378 1379 1380
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1381
    QEMU_MONITOR_CALLBACK(mon, ret, domainStop, mon->vm);
1382 1383 1384 1385
    return ret;
}


1386 1387
int
qemuMonitorEmitResume(qemuMonitorPtr mon)
1388 1389 1390 1391 1392 1393 1394 1395 1396
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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


1397
int
1398 1399
qemuMonitorEmitGuestPanic(qemuMonitorPtr mon,
                          qemuMonitorEventPanicInfoPtr info)
1400 1401 1402
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);
1403
    QEMU_MONITOR_CALLBACK(mon, ret, domainGuestPanic, mon->vm, info);
1404 1405 1406 1407
    return ret;
}


1408 1409
int
qemuMonitorEmitRTCChange(qemuMonitorPtr mon, long long offset)
1410 1411 1412 1413
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1414
    QEMU_MONITOR_CALLBACK(mon, ret, domainRTCChange, mon->vm, offset);
1415 1416 1417 1418
    return ret;
}


1419 1420
int
qemuMonitorEmitWatchdog(qemuMonitorPtr mon, int action)
1421 1422 1423 1424
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1425
    QEMU_MONITOR_CALLBACK(mon, ret, domainWatchdog, mon->vm, action);
1426 1427 1428 1429
    return ret;
}


1430 1431 1432 1433 1434
int
qemuMonitorEmitIOError(qemuMonitorPtr mon,
                       const char *diskAlias,
                       int action,
                       const char *reason)
1435 1436 1437 1438
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1439 1440
    QEMU_MONITOR_CALLBACK(mon, ret, domainIOError, mon->vm,
                          diskAlias, action, reason);
1441 1442 1443 1444
    return ret;
}


1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456
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)
1457 1458 1459 1460
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

E
Eric Blake 已提交
1461 1462 1463 1464
    QEMU_MONITOR_CALLBACK(mon, ret, domainGraphics, mon->vm, phase,
                          localFamily, localNode, localService,
                          remoteFamily, remoteNode, remoteService,
                          authScheme, x509dname, saslUsername);
1465 1466 1467
    return ret;
}

1468 1469 1470 1471 1472

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

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

    return ret;
}

1483 1484 1485

int
qemuMonitorEmitPMWakeup(qemuMonitorPtr mon)
O
Osier Yang 已提交
1486 1487 1488 1489 1490 1491 1492 1493 1494
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

1495 1496 1497

int
qemuMonitorEmitPMSuspend(qemuMonitorPtr mon)
O
Osier Yang 已提交
1498 1499 1500 1501 1502 1503 1504 1505 1506
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

1507 1508 1509

int
qemuMonitorEmitPMSuspendDisk(qemuMonitorPtr mon)
1510 1511 1512 1513 1514 1515 1516 1517 1518
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}

1519 1520 1521 1522 1523

int
qemuMonitorEmitBlockJob(qemuMonitorPtr mon,
                        const char *diskAlias,
                        int type,
1524 1525
                        int status,
                        const char *error)
1526 1527 1528 1529 1530
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

    QEMU_MONITOR_CALLBACK(mon, ret, domainBlockJob, mon->vm,
1531
                          diskAlias, type, status, error);
1532 1533 1534
    return ret;
}

1535

1536 1537 1538
int
qemuMonitorEmitBalloonChange(qemuMonitorPtr mon,
                             unsigned long long actual)
1539 1540 1541 1542 1543 1544 1545 1546
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

1547

1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560
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;
}


1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573
int
qemuMonitorEmitNicRxFilterChanged(qemuMonitorPtr mon,
                                  const char *devAlias)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}


1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
int
qemuMonitorEmitSerialChange(qemuMonitorPtr mon,
                            const char *devAlias,
                            bool connected)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, devAlias='%s', connected=%d", mon, devAlias, connected);

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

    return ret;
}


1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599
int
qemuMonitorEmitSpiceMigrated(qemuMonitorPtr mon)
{
    int ret = -1;
    VIR_DEBUG("mon=%p", mon);

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

    return ret;
}


1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613
int
qemuMonitorEmitMigrationStatus(qemuMonitorPtr mon,
                               int status)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, status=%s",
              mon, NULLSTR(qemuMonitorMigrationStatusTypeToString(status)));

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

    return ret;
}


1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626
int
qemuMonitorEmitMigrationPass(qemuMonitorPtr mon,
                             int pass)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, pass=%d", mon, pass);

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

    return ret;
}


1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
int
qemuMonitorEmitAcpiOstInfo(qemuMonitorPtr mon,
                           const char *alias,
                           const char *slotType,
                           const char *slot,
                           unsigned int source,
                           unsigned int status)
{
    int ret = -1;
    VIR_DEBUG("mon=%p, alias='%s', slotType='%s', slot='%s', source='%u' status=%u",
              mon, NULLSTR(alias), slotType, slot, source, status);

    QEMU_MONITOR_CALLBACK(mon, ret, domainAcpiOstInfo, mon->vm,
                          alias, slotType, slot, source, status);

    return ret;
}


1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
int
qemuMonitorEmitBlockThreshold(qemuMonitorPtr mon,
                              const char *nodename,
                              unsigned long long threshold,
                              unsigned long long excess)
{
    int ret = -1;

    VIR_DEBUG("mon=%p, node-name='%s', threshold='%llu', excess='%llu'",
              mon, nodename, threshold, excess);

    QEMU_MONITOR_CALLBACK(mon, ret, domainBlockThreshold, mon->vm,
                          nodename, threshold, excess);

    return ret;
}


1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
int
qemuMonitorEmitDumpCompleted(qemuMonitorPtr mon,
                             int status,
                             qemuMonitorDumpStatsPtr stats,
                             const char *error)
{
    int ret = -1;

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

    QEMU_MONITOR_CALLBACK(mon, ret, domainDumpCompleted, mon->vm,
                          status, stats, error);

    return ret;
}


1681 1682
int
qemuMonitorSetCapabilities(qemuMonitorPtr mon)
1683
{
1684
    QEMU_CHECK_MONITOR(mon);
1685

1686 1687
    if (!mon->json)
        return 0;
1688

1689
    return qemuMonitorJSONSetCapabilities(mon);
1690 1691 1692
}


1693
int
1694
qemuMonitorStartCPUs(qemuMonitorPtr mon)
1695
{
1696
    QEMU_CHECK_MONITOR(mon);
1697

D
Daniel P. Berrange 已提交
1698
    if (mon->json)
1699
        return qemuMonitorJSONStartCPUs(mon);
D
Daniel P. Berrange 已提交
1700
    else
1701
        return qemuMonitorTextStartCPUs(mon);
1702 1703 1704 1705 1706 1707
}


int
qemuMonitorStopCPUs(qemuMonitorPtr mon)
{
1708
    QEMU_CHECK_MONITOR(mon);
1709

D
Daniel P. Berrange 已提交
1710
    if (mon->json)
1711
        return qemuMonitorJSONStopCPUs(mon);
D
Daniel P. Berrange 已提交
1712
    else
1713
        return qemuMonitorTextStopCPUs(mon);
1714 1715 1716
}


1717 1718 1719 1720 1721 1722 1723 1724
int
qemuMonitorCheck(qemuMonitorPtr mon)
{
    bool running;
    return qemuMonitorGetStatus(mon, &running, NULL);
}


1725
int
1726 1727 1728
qemuMonitorGetStatus(qemuMonitorPtr mon,
                     bool *running,
                     virDomainPausedReason *reason)
1729
{
1730
    VIR_DEBUG("running=%p, reason=%p", running, reason);
1731

1732
    QEMU_CHECK_MONITOR(mon);
1733 1734

    if (mon->json)
1735
        return qemuMonitorJSONGetStatus(mon, running, reason);
1736
    else
1737
        return qemuMonitorTextGetStatus(mon, running, reason);
1738 1739 1740
}


1741 1742
int
qemuMonitorSystemPowerdown(qemuMonitorPtr mon)
1743
{
1744
    QEMU_CHECK_MONITOR(mon);
1745

D
Daniel P. Berrange 已提交
1746
    if (mon->json)
1747
        return qemuMonitorJSONSystemPowerdown(mon);
D
Daniel P. Berrange 已提交
1748
    else
1749
        return qemuMonitorTextSystemPowerdown(mon);
1750 1751 1752
}


1753 1754
int
qemuMonitorSystemReset(qemuMonitorPtr mon)
1755
{
1756
    QEMU_CHECK_MONITOR(mon);
1757 1758

    if (mon->json)
1759
        return qemuMonitorJSONSystemReset(mon);
1760
    else
1761
        return qemuMonitorTextSystemReset(mon);
1762 1763 1764
}


1765 1766 1767 1768 1769 1770 1771 1772
static void
qemuMonitorCPUInfoClear(qemuMonitorCPUInfoPtr cpus,
                        size_t ncpus)
{
    size_t i;

    for (i = 0; i < ncpus; i++) {
        cpus[i].id = 0;
1773
        cpus[i].qemu_id = -1;
1774 1775 1776
        cpus[i].socket_id = -1;
        cpus[i].core_id = -1;
        cpus[i].thread_id = -1;
1777
        cpus[i].node_id = -1;
1778 1779
        cpus[i].vcpus = 0;
        cpus[i].tid = 0;
1780
        cpus[i].halted = false;
1781 1782 1783 1784 1785 1786 1787 1788

        VIR_FREE(cpus[i].qom_path);
        VIR_FREE(cpus[i].alias);
        VIR_FREE(cpus[i].type);
    }
}


1789 1790
void
qemuMonitorCPUInfoFree(qemuMonitorCPUInfoPtr cpus,
1791
                       size_t ncpus)
1792 1793 1794 1795
{
    if (!cpus)
        return;

1796 1797
    qemuMonitorCPUInfoClear(cpus, ncpus);

1798 1799 1800
    VIR_FREE(cpus);
}

1801 1802
void
qemuMonitorQueryCpusFree(struct qemuMonitorQueryCpusEntry *entries,
1803
                         size_t nentries)
1804
{
1805 1806
    size_t i;

1807 1808 1809
    if (!entries)
        return;

1810 1811 1812
    for (i = 0; i < nentries; i++)
        VIR_FREE(entries[i].qom_path);

1813 1814 1815
    VIR_FREE(entries);
}

1816

1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828
/**
 * Legacy approach doesn't allow out of order cpus, thus no complex matching
 * algorithm is necessary */
static void
qemuMonitorGetCPUInfoLegacy(struct qemuMonitorQueryCpusEntry *cpuentries,
                            size_t ncpuentries,
                            qemuMonitorCPUInfoPtr vcpus,
                            size_t maxvcpus)
{
    size_t i;

    for (i = 0; i < maxvcpus; i++) {
1829
        if (i < ncpuentries) {
1830
            vcpus[i].tid = cpuentries[i].tid;
1831
            vcpus[i].halted = cpuentries[i].halted;
1832
            vcpus[i].qemu_id = cpuentries[i].qemu_id;
1833
        }
1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846

        /* for legacy hotplug to work we need to fake the vcpu count added by
         * enabling a given vcpu */
        vcpus[i].vcpus = 1;
    }
}


/**
 * qemuMonitorGetCPUInfoHotplug:
 *
 * This function stitches together data retrieved via query-hotpluggable-cpus
 * which returns entities on the hotpluggable level (which may describe more
1847 1848
 * than one guest logical vcpu) with the output of query-cpus (or
 * query-cpus-fast), having an entry per enabled guest logical vcpu.
1849 1850 1851 1852
 *
 * query-hotpluggable-cpus conveys following information:
 * - topology information and number of logical vcpus this entry creates
 * - device type name of the entry that needs to be used when hotplugging
1853 1854
 * - qom path in qemu which can be used to map the entry against
 *   query-cpus[-fast]
1855
 *
1856
 * query-cpus[-fast] conveys following information:
1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879
 * - thread id of a given guest logical vcpu
 * - order in which the vcpus were inserted
 * - qom path to allow mapping the two together
 *
 * The libvirt's internal structure has an entry for each possible (even
 * disabled) guest vcpu. The purpose is to map the data together so that we are
 * certain of the thread id mapping and the information required for vcpu
 * hotplug.
 *
 * This function returns 0 on success and -1 on error, but does not report
 * libvirt errors so that fallback approach can be used.
 */
static int
qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotplugvcpus,
                             size_t nhotplugvcpus,
                             struct qemuMonitorQueryCpusEntry *cpuentries,
                             size_t ncpuentries,
                             qemuMonitorCPUInfoPtr vcpus,
                             size_t maxvcpus)
{
    char *tmp;
    int order = 1;
    size_t totalvcpus = 0;
1880
    size_t mastervcpu; /* this iterator is used for iterating hotpluggable entities */
1881
    size_t slavevcpu; /* this corresponds to subentries of a hotpluggable entry */
1882
    size_t anyvcpu; /* this iterator is used for any vcpu entry in the result */
1883 1884 1885 1886 1887 1888 1889 1890
    size_t i;
    size_t j;

    /* ensure that the total vcpu count reported by query-hotpluggable-cpus equals
     * to the libvirt maximum cpu count */
    for (i = 0; i < nhotplugvcpus; i++)
        totalvcpus += hotplugvcpus[i].vcpus;

1891
    /* trim '/thread...' suffix from the data returned by query-cpus[-fast] */
1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903
    for (i = 0; i < ncpuentries; i++) {
        if (cpuentries[i].qom_path &&
            (tmp = strstr(cpuentries[i].qom_path, "/thread")))
            *tmp = '\0';
    }

    if (totalvcpus != maxvcpus) {
        VIR_DEBUG("expected '%zu' total vcpus got '%zu'", maxvcpus, totalvcpus);
        return -1;
    }

    /* Note the order in which the hotpluggable entities are inserted by
1904
     * matching them to the query-cpus[-fast] entries */
1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
    for (i = 0; i < ncpuentries; i++) {
        for (j = 0; j < nhotplugvcpus; j++) {
            if (!cpuentries[i].qom_path ||
                !hotplugvcpus[j].qom_path ||
                STRNEQ(cpuentries[i].qom_path, hotplugvcpus[j].qom_path))
                continue;

            /* add ordering info for hotpluggable entries */
            if (hotplugvcpus[j].enable_id == 0)
                hotplugvcpus[j].enable_id = order++;

            break;
        }
    }

    /* transfer appropriate data from the hotpluggable list to corresponding
     * entries. the entries returned by qemu may in fact describe multiple
     * logical vcpus in the guest */
1923
    mastervcpu = 0;
1924
    for (i = 0; i < nhotplugvcpus; i++) {
1925 1926 1927
        vcpus[mastervcpu].online = !!hotplugvcpus[i].qom_path;
        vcpus[mastervcpu].hotpluggable = !!hotplugvcpus[i].alias ||
                                         !vcpus[mastervcpu].online;
1928 1929 1930
        vcpus[mastervcpu].socket_id = hotplugvcpus[i].socket_id;
        vcpus[mastervcpu].core_id = hotplugvcpus[i].core_id;
        vcpus[mastervcpu].thread_id = hotplugvcpus[i].thread_id;
1931
        vcpus[mastervcpu].node_id = hotplugvcpus[i].node_id;
1932 1933 1934 1935 1936 1937
        vcpus[mastervcpu].vcpus = hotplugvcpus[i].vcpus;
        VIR_STEAL_PTR(vcpus[mastervcpu].qom_path, hotplugvcpus[i].qom_path);
        VIR_STEAL_PTR(vcpus[mastervcpu].alias, hotplugvcpus[i].alias);
        VIR_STEAL_PTR(vcpus[mastervcpu].type, hotplugvcpus[i].type);
        vcpus[mastervcpu].id = hotplugvcpus[i].enable_id;

1938 1939 1940 1941 1942 1943
        /* copy state information to slave vcpus */
        for (slavevcpu = mastervcpu + 1; slavevcpu < mastervcpu + hotplugvcpus[i].vcpus; slavevcpu++) {
            vcpus[slavevcpu].online = vcpus[mastervcpu].online;
            vcpus[slavevcpu].hotpluggable = vcpus[mastervcpu].hotpluggable;
        }

1944 1945
        /* calculate next master vcpu (hotpluggable unit) entry */
        mastervcpu += hotplugvcpus[i].vcpus;
1946 1947 1948 1949 1950 1951
    }

    /* match entries from query cpus to the output array taking into account
     * multi-vcpu objects */
    for (j = 0; j < ncpuentries; j++) {
        /* find the correct entry or beginning of group of entries */
1952 1953 1954
        for (anyvcpu = 0; anyvcpu < maxvcpus; anyvcpu++) {
            if (cpuentries[j].qom_path && vcpus[anyvcpu].qom_path &&
                STREQ(cpuentries[j].qom_path, vcpus[anyvcpu].qom_path))
1955 1956 1957
                break;
        }

1958
        if (anyvcpu == maxvcpus) {
1959
            VIR_DEBUG("too many query-cpus[-fast] entries for a given "
1960 1961 1962 1963
                      "query-hotpluggable-cpus entry");
            return -1;
        }

1964
        if (vcpus[anyvcpu].vcpus != 1) {
1965
            /* find a possibly empty vcpu thread for core granularity systems */
1966 1967
            for (; anyvcpu < maxvcpus; anyvcpu++) {
                if (vcpus[anyvcpu].tid == 0)
1968 1969 1970 1971
                    break;
            }
        }

1972
        vcpus[anyvcpu].qemu_id = cpuentries[j].qemu_id;
1973
        vcpus[anyvcpu].tid = cpuentries[j].tid;
1974
        vcpus[anyvcpu].halted = cpuentries[j].halted;
1975 1976 1977 1978 1979 1980
    }

    return 0;
}


1981 1982 1983
/**
 * qemuMonitorGetCPUInfo:
 * @mon: monitor
1984 1985
 * @vcpus: pointer filled by array of qemuMonitorCPUInfo structures
 * @maxvcpus: total possible number of vcpus
1986
 * @hotplug: query data relevant for hotplug support
1987
 * @fast: use QMP query-cpus-fast if supported
1988 1989 1990 1991
 *
 * Detects VCPU information. If qemu doesn't support or fails reporting
 * information this function will return success as other parts of libvirt
 * are able to cope with that.
1992
 *
1993 1994
 * Returns 0 on success (including if qemu didn't report any data) and
 *  -1 on error (reports libvirt error).
1995
 */
1996 1997
int
qemuMonitorGetCPUInfo(qemuMonitorPtr mon,
1998
                      qemuMonitorCPUInfoPtr *vcpus,
1999
                      size_t maxvcpus,
2000 2001
                      bool hotplug,
                      bool fast)
2002
{
2003 2004
    struct qemuMonitorQueryHotpluggableCpusEntry *hotplugcpus = NULL;
    size_t nhotplugcpus = 0;
2005 2006
    struct qemuMonitorQueryCpusEntry *cpuentries = NULL;
    size_t ncpuentries = 0;
2007 2008
    int ret = -1;
    int rc;
2009
    qemuMonitorCPUInfoPtr info = NULL;
2010

2011
    QEMU_CHECK_MONITOR(mon);
2012

2013 2014 2015
    if (VIR_ALLOC_N(info, maxvcpus) < 0)
        return -1;

2016 2017 2018
    if (!mon->json)
        hotplug = false;

2019 2020 2021 2022 2023 2024 2025
    /* initialize a few non-zero defaults */
    qemuMonitorCPUInfoClear(info, maxvcpus);

    if (hotplug &&
        (qemuMonitorJSONGetHotpluggableCPUs(mon, &hotplugcpus, &nhotplugcpus)) < 0)
        goto cleanup;

D
Daniel P. Berrange 已提交
2026
    if (mon->json)
2027 2028
        rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, hotplug,
                                      fast);
D
Daniel P. Berrange 已提交
2029
    else
2030
        rc = qemuMonitorTextQueryCPUs(mon, &cpuentries, &ncpuentries);
2031 2032

    if (rc < 0) {
2033
        if (!hotplug && rc == -2) {
2034 2035 2036 2037
            VIR_STEAL_PTR(*vcpus, info);
            ret = 0;
        }

2038 2039 2040
        goto cleanup;
    }

2041 2042 2043 2044 2045 2046 2047 2048 2049
    if (!hotplugcpus ||
        qemuMonitorGetCPUInfoHotplug(hotplugcpus, nhotplugcpus,
                                     cpuentries, ncpuentries,
                                     info, maxvcpus) < 0) {
        /* Fallback to the legacy algorithm. Hotplug paths will make sure that
         * the apropriate data is present */
        qemuMonitorCPUInfoClear(info, maxvcpus);
        qemuMonitorGetCPUInfoLegacy(cpuentries, ncpuentries, info, maxvcpus);
    }
2050 2051 2052 2053 2054

    VIR_STEAL_PTR(*vcpus, info);
    ret = 0;

 cleanup:
2055
    qemuMonitorQueryHotpluggableCpusFree(hotplugcpus, nhotplugcpus);
2056
    qemuMonitorQueryCpusFree(cpuentries, ncpuentries);
2057
    qemuMonitorCPUInfoFree(info, maxvcpus);
2058
    return ret;
2059 2060
}

2061

2062 2063 2064 2065
/**
 * qemuMonitorGetCpuHalted:
 *
 * Returns a bitmap of vcpu id's that are halted. The id's correspond to the
2066
 * 'CPU' field as reported by query-cpus[-fast]'.
2067 2068 2069
 */
virBitmapPtr
qemuMonitorGetCpuHalted(qemuMonitorPtr mon,
2070
                        size_t maxvcpus,
2071
                        bool fast)
2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
{
    struct qemuMonitorQueryCpusEntry *cpuentries = NULL;
    size_t ncpuentries = 0;
    size_t i;
    int rc;
    virBitmapPtr ret = NULL;

    QEMU_CHECK_MONITOR_NULL(mon);

    if (mon->json)
2082
        rc = qemuMonitorJSONQueryCPUs(mon, &cpuentries, &ncpuentries, false,
2083
                                      fast);
2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103
    else
        rc = qemuMonitorTextQueryCPUs(mon, &cpuentries, &ncpuentries);

    if (rc < 0)
        goto cleanup;

    if (!(ret = virBitmapNew(maxvcpus)))
        goto cleanup;

    for (i = 0; i < ncpuentries; i++) {
        if (cpuentries[i].halted)
            ignore_value(virBitmapSetBit(ret, cpuentries[i].qemu_id));
    }

 cleanup:
    qemuMonitorQueryCpusFree(cpuentries, ncpuentries);
    return ret;
}


2104 2105 2106 2107
int
qemuMonitorSetLink(qemuMonitorPtr mon,
                   const char *name,
                   virDomainNetInterfaceLinkState state)
2108
{
2109
    VIR_DEBUG("name=%s, state=%u", name, state);
2110

2111
    QEMU_CHECK_MONITOR(mon);
2112 2113

    if (mon->json)
2114
        return qemuMonitorJSONSetLink(mon, name, state);
2115
    else
2116
        return qemuMonitorTextSetLink(mon, name, state);
2117
}
2118

2119 2120 2121

int
qemuMonitorGetVirtType(qemuMonitorPtr mon,
2122
                       virDomainVirtType *virtType)
2123
{
2124
    QEMU_CHECK_MONITOR(mon);
2125 2126

    if (mon->json)
2127
        return qemuMonitorJSONGetVirtType(mon, virtType);
2128
    else
2129
        return qemuMonitorTextGetVirtType(mon, virtType);
2130 2131 2132
}


2133 2134 2135 2136
/**
 * Returns: 0 if balloon not supported, +1 if balloon query worked
 * or -1 on failure
 */
2137 2138 2139
int
qemuMonitorGetBalloonInfo(qemuMonitorPtr mon,
                          unsigned long long *currmem)
2140
{
2141
    QEMU_CHECK_MONITOR(mon);
2142

D
Daniel P. Berrange 已提交
2143
    if (mon->json)
2144
        return qemuMonitorJSONGetBalloonInfo(mon, currmem);
D
Daniel P. Berrange 已提交
2145
    else
2146
        return qemuMonitorTextGetBalloonInfo(mon, currmem);
2147 2148 2149
}


2150 2151
int
qemuMonitorGetMemoryStats(qemuMonitorPtr mon,
2152
                          virDomainMemballoonDefPtr balloon,
2153 2154
                          virDomainMemoryStatPtr stats,
                          unsigned int nr_stats)
2155
{
2156
    VIR_DEBUG("stats=%p nstats=%u", stats, nr_stats);
2157

2158
    QEMU_CHECK_MONITOR(mon);
2159

2160
    if (mon->json) {
2161
        qemuMonitorInitBalloonObjectPath(mon, balloon);
2162 2163
        return qemuMonitorJSONGetMemoryStats(mon, mon->balloonpath,
                                             stats, nr_stats);
2164
    } else {
2165
        return qemuMonitorTextGetMemoryStats(mon, stats, nr_stats);
2166
    }
2167 2168
}

2169

2170 2171 2172 2173 2174 2175 2176
/**
 * qemuMonitorSetMemoryStatsPeriod:
 *
 * This function sets balloon stats update period.
 *
 * Returns 0 on success and -1 on error, but does *not* set an error.
 */
2177 2178
int
qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,
2179
                                virDomainMemballoonDefPtr balloon,
2180
                                int period)
2181 2182 2183 2184
{
    int ret = -1;
    VIR_DEBUG("mon=%p period=%d", mon, period);

2185
    if (!mon)
2186 2187
        return -1;

2188 2189 2190 2191
    if (!mon->json)
        return -1;

    if (period < 0)
2192 2193
        return -1;

2194
    qemuMonitorInitBalloonObjectPath(mon, balloon);
2195
    if (mon->balloonpath) {
2196 2197
        ret = qemuMonitorJSONSetMemoryStatsPeriod(mon, mon->balloonpath,
                                                  period);
2198 2199 2200 2201 2202 2203 2204 2205 2206

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

2211

2212 2213 2214 2215 2216 2217
int
qemuMonitorBlockIOStatusToError(const char *status)
{
    int st = qemuMonitorBlockIOStatusTypeFromString(status);

    if (st < 0) {
2218 2219
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("unknown block IO status: %s"), status);
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237
        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;
}

2238

2239 2240 2241 2242 2243 2244 2245 2246 2247 2248
static void
qemuDomainDiskInfoFree(void *value, const void *name ATTRIBUTE_UNUSED)
{
    struct qemuDomainDiskInfo *info = value;

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


2249 2250
virHashTablePtr
qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
2251 2252
{
    int ret;
2253 2254
    virHashTablePtr table;

2255
    QEMU_CHECK_MONITOR_NULL(mon);
2256

2257
    if (!(table = virHashCreate(32, qemuDomainDiskInfoFree)))
2258 2259
        return NULL;

2260
    if (mon->json)
2261
        ret = qemuMonitorJSONGetBlockInfo(mon, table);
2262
    else
2263 2264 2265 2266 2267 2268 2269 2270 2271 2272
        ret = qemuMonitorTextGetBlockInfo(mon, table);

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

    return table;
}

2273

2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288
/**
 * qemuMonitorQueryBlockstats:
 * @mon: monitor object
 *
 * Returns data from a call to 'query-blockstats'.
 */
virJSONValuePtr
qemuMonitorQueryBlockstats(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON_NULL(mon);

    return qemuMonitorJSONQueryBlockstats(mon);
}


2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299
/**
 * qemuMonitorGetAllBlockStatsInfo:
 * @mon: monitor object
 * @ret_stats: pointer that is filled with a hash table containing the stats
 * @backingChain: recurse into the backing chain of devices
 *
 * Creates a hash table in @ret_stats with block stats of all devices. In case
 * @backingChain is true @ret_stats will additionally contain stats for
 * backing chain members of block devices.
 *
 * Returns < 0 on error, count of supported block stats fields on success.
2300 2301 2302
 */
int
qemuMonitorGetAllBlockStatsInfo(qemuMonitorPtr mon,
2303 2304
                                virHashTablePtr *ret_stats,
                                bool backingChain)
2305
{
2306
    int ret = -1;
2307 2308 2309
    VIR_DEBUG("ret_stats=%p, backing=%d", ret_stats, backingChain);

    QEMU_CHECK_MONITOR(mon);
2310

2311 2312 2313
    if (!(*ret_stats = virHashCreate(10, virHashValueFree)))
        goto error;

2314
    if (mon->json) {
2315 2316
        ret = qemuMonitorJSONGetAllBlockStatsInfo(mon, *ret_stats,
                                                  backingChain);
2317 2318 2319 2320 2321 2322 2323 2324
    } else {
         if (backingChain) {
             virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                            _("text monitor doesn't support block stats for "
                              "backing chain members"));
             goto error;
         }

2325
         ret = qemuMonitorTextGetAllBlockStatsInfo(mon, *ret_stats);
2326
    }
2327

2328 2329 2330 2331
    if (ret < 0)
        goto error;

    return ret;
2332 2333 2334 2335 2336

 error:
    virHashFree(*ret_stats);
    *ret_stats = NULL;
    return -1;
2337 2338
}

2339 2340

/* Updates "stats" to fill virtual and physical size of the image */
2341 2342 2343 2344
int
qemuMonitorBlockStatsUpdateCapacity(qemuMonitorPtr mon,
                                    virHashTablePtr stats,
                                    bool backingChain)
2345
{
2346
    VIR_DEBUG("stats=%p, backing=%d", stats, backingChain);
2347

2348
    QEMU_CHECK_MONITOR_JSON(mon);
2349

2350
    return qemuMonitorJSONBlockStatsUpdateCapacity(mon, stats, backingChain);
2351 2352 2353
}


2354 2355 2356 2357
int
qemuMonitorBlockResize(qemuMonitorPtr mon,
                       const char *device,
                       unsigned long long size)
2358
{
2359 2360 2361
    VIR_DEBUG("device=%s size=%llu", device, size);

    QEMU_CHECK_MONITOR(mon);
2362 2363

    if (mon->json)
2364
        return qemuMonitorJSONBlockResize(mon, device, size);
2365
    else
2366
        return qemuMonitorTextBlockResize(mon, device, size);
2367
}
2368

2369 2370 2371 2372

int
qemuMonitorSetVNCPassword(qemuMonitorPtr mon,
                          const char *password)
2373
{
2374
    VIR_DEBUG("password=%p", password);
2375

2376
    QEMU_CHECK_MONITOR(mon);
2377

2378 2379 2380
    if (!password)
        password = "";

D
Daniel P. Berrange 已提交
2381
    if (mon->json)
2382
        return qemuMonitorJSONSetVNCPassword(mon, password);
D
Daniel P. Berrange 已提交
2383
    else
2384
        return qemuMonitorTextSetVNCPassword(mon, password);
2385 2386
}

2387 2388 2389

static const char *
qemuMonitorTypeToProtocol(int type)
2390 2391 2392 2393 2394 2395 2396
{
    switch (type) {
    case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
        return "vnc";
    case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
        return "spice";
    default:
2397 2398 2399
        virReportError(VIR_ERR_INVALID_ARG,
                       _("unsupported protocol type %s"),
                       virDomainGraphicsTypeToString(type));
2400 2401 2402 2403
        return NULL;
    }
}

2404

2405
/* Returns -2 if not supported with this monitor connection */
2406 2407 2408 2409 2410
int
qemuMonitorSetPassword(qemuMonitorPtr mon,
                       int type,
                       const char *password,
                       const char *action_if_connected)
2411 2412 2413 2414 2415 2416
{
    const char *protocol = qemuMonitorTypeToProtocol(type);

    if (!protocol)
        return -1;

2417 2418
    VIR_DEBUG("protocol=%s, password=%p, action_if_connected=%s",
              protocol, password, action_if_connected);
2419

2420
    QEMU_CHECK_MONITOR(mon);
2421 2422 2423 2424 2425 2426 2427 2428

    if (!password)
        password = "";

    if (!action_if_connected)
        action_if_connected = "keep";

    if (mon->json)
2429
        return qemuMonitorJSONSetPassword(mon, protocol, password, action_if_connected);
2430
    else
2431
        return qemuMonitorTextSetPassword(mon, protocol, password, action_if_connected);
2432 2433
}

2434 2435 2436 2437 2438

int
qemuMonitorExpirePassword(qemuMonitorPtr mon,
                          int type,
                          const char *expire_time)
2439 2440 2441 2442 2443 2444
{
    const char *protocol = qemuMonitorTypeToProtocol(type);

    if (!protocol)
        return -1;

2445
    VIR_DEBUG("protocol=%s, expire_time=%s", protocol, expire_time);
2446

2447
    QEMU_CHECK_MONITOR(mon);
2448 2449 2450 2451 2452

    if (!expire_time)
        expire_time = "now";

    if (mon->json)
2453
        return qemuMonitorJSONExpirePassword(mon, protocol, expire_time);
2454
    else
2455
        return qemuMonitorTextExpirePassword(mon, protocol, expire_time);
2456
}
2457

2458

2459 2460 2461 2462
/*
 * Returns: 0 if balloon not supported, +1 if balloon adjust worked
 * or -1 on failure
 */
2463 2464
int
qemuMonitorSetBalloon(qemuMonitorPtr mon,
2465
                      unsigned long long newmem)
2466
{
2467
    VIR_DEBUG("newmem=%llu", newmem);
2468

2469
    QEMU_CHECK_MONITOR(mon);
2470

D
Daniel P. Berrange 已提交
2471
    if (mon->json)
2472
        return qemuMonitorJSONSetBalloon(mon, newmem);
D
Daniel P. Berrange 已提交
2473
    else
2474
        return qemuMonitorTextSetBalloon(mon, newmem);
2475 2476
}

2477

2478 2479 2480
/*
 * Returns: 0 if CPU modification was successful or -1 on failure
 */
2481 2482
int
qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, bool online)
2483
{
2484
    VIR_DEBUG("cpu=%d online=%d", cpu, online);
2485

2486
    QEMU_CHECK_MONITOR(mon);
2487 2488

    if (mon->json)
2489
        return qemuMonitorJSONSetCPU(mon, cpu, online);
2490
    else
2491
        return qemuMonitorTextSetCPU(mon, cpu, online);
2492 2493 2494
}


2495 2496 2497 2498
int
qemuMonitorEjectMedia(qemuMonitorPtr mon,
                      const char *dev_name,
                      bool force)
2499
{
2500
    VIR_DEBUG("dev_name=%s force=%d", dev_name, force);
2501

2502
    QEMU_CHECK_MONITOR(mon);
2503

D
Daniel P. Berrange 已提交
2504
    if (mon->json)
2505
        return qemuMonitorJSONEjectMedia(mon, dev_name, force);
D
Daniel P. Berrange 已提交
2506
    else
2507
        return qemuMonitorTextEjectMedia(mon, dev_name, force);
2508 2509 2510
}


2511 2512 2513 2514 2515
int
qemuMonitorChangeMedia(qemuMonitorPtr mon,
                       const char *dev_name,
                       const char *newmedia,
                       const char *format)
2516
{
2517
    VIR_DEBUG("dev_name=%s newmedia=%s format=%s", dev_name, newmedia, format);
2518

2519
    QEMU_CHECK_MONITOR(mon);
2520

D
Daniel P. Berrange 已提交
2521
    if (mon->json)
2522
        return qemuMonitorJSONChangeMedia(mon, dev_name, newmedia, format);
D
Daniel P. Berrange 已提交
2523
    else
2524
        return qemuMonitorTextChangeMedia(mon, dev_name, newmedia, format);
2525 2526 2527
}


2528 2529 2530 2531 2532
int
qemuMonitorSaveVirtualMemory(qemuMonitorPtr mon,
                             unsigned long long offset,
                             size_t length,
                             const char *path)
2533
{
2534
    VIR_DEBUG("offset=%llu length=%zu path=%s", offset, length, path);
2535

2536
    QEMU_CHECK_MONITOR(mon);
2537

D
Daniel P. Berrange 已提交
2538
    if (mon->json)
2539
        return qemuMonitorJSONSaveVirtualMemory(mon, offset, length, path);
D
Daniel P. Berrange 已提交
2540
    else
2541
        return qemuMonitorTextSaveVirtualMemory(mon, offset, length, path);
2542 2543
}

2544 2545 2546 2547 2548 2549

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

2553
    QEMU_CHECK_MONITOR(mon);
2554

D
Daniel P. Berrange 已提交
2555
    if (mon->json)
2556
        return qemuMonitorJSONSavePhysicalMemory(mon, offset, length, path);
D
Daniel P. Berrange 已提交
2557
    else
2558
        return qemuMonitorTextSavePhysicalMemory(mon, offset, length, path);
2559 2560 2561
}


2562 2563 2564
int
qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
                             unsigned long bandwidth)
2565
{
2566
    VIR_DEBUG("bandwidth=%lu", bandwidth);
2567

2568
    QEMU_CHECK_MONITOR(mon);
2569

2570 2571 2572 2573 2574 2575 2576
    if (bandwidth > QEMU_DOMAIN_MIG_BANDWIDTH_MAX) {
        virReportError(VIR_ERR_OVERFLOW,
                       _("bandwidth must be less than %llu"),
                       QEMU_DOMAIN_MIG_BANDWIDTH_MAX + 1ULL);
        return -1;
    }

D
Daniel P. Berrange 已提交
2577
    if (mon->json)
2578
        return qemuMonitorJSONSetMigrationSpeed(mon, bandwidth);
D
Daniel P. Berrange 已提交
2579
    else
2580
        return qemuMonitorTextSetMigrationSpeed(mon, bandwidth);
2581 2582
}

2583

2584 2585 2586
int
qemuMonitorSetMigrationDowntime(qemuMonitorPtr mon,
                                unsigned long long downtime)
2587
{
2588
    VIR_DEBUG("downtime=%llu", downtime);
2589

2590
    QEMU_CHECK_MONITOR(mon);
2591 2592

    if (mon->json)
2593
        return qemuMonitorJSONSetMigrationDowntime(mon, downtime);
2594
    else
2595
        return qemuMonitorTextSetMigrationDowntime(mon, downtime);
2596 2597 2598
}


2599 2600 2601 2602
int
qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long *cacheSize)
{
2603
    VIR_DEBUG("cacheSize=%p", cacheSize);
2604

2605
    QEMU_CHECK_MONITOR_JSON(mon);
2606 2607 2608 2609

    return qemuMonitorJSONGetMigrationCacheSize(mon, cacheSize);
}

2610

2611 2612 2613 2614
int
qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
                                 unsigned long long cacheSize)
{
2615
    VIR_DEBUG("cacheSize=%llu", cacheSize);
2616

2617
    QEMU_CHECK_MONITOR_JSON(mon);
2618 2619 2620 2621 2622

    return qemuMonitorJSONSetMigrationCacheSize(mon, cacheSize);
}


2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633
/**
 * qemuMonitorGetMigrationParams:
 * @mon: Pointer to the monitor object.
 * @params: Where to store migration parameters.
 *
 * If QEMU does not support querying migration parameters, the function will
 * set @params to NULL and return 0 (success). The caller is responsible for
 * freeing @params.
 *
 * Returns 0 on success, -1 on error.
 */
2634
int
2635
qemuMonitorGetMigrationParams(qemuMonitorPtr mon,
2636
                              virJSONValuePtr *params)
2637 2638 2639
{
    QEMU_CHECK_MONITOR_JSON(mon);

2640
    return qemuMonitorJSONGetMigrationParams(mon, params);
2641 2642
}

2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653

/**
 * qemuMonitorSetMigrationParams:
 * @mon: Pointer to the monitor object.
 * @params: Migration parameters.
 *
 * The @params object is consumed and should not be referenced by the caller
 * after this function returns.
 *
 * Returns 0 on success, -1 on error.
 */
2654
int
2655
qemuMonitorSetMigrationParams(qemuMonitorPtr mon,
2656 2657 2658
                              virJSONValuePtr params)
{
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, error);
2659

2660
    return qemuMonitorJSONSetMigrationParams(mon, params);
2661 2662 2663 2664

 error:
    virJSONValueFree(params);
    return -1;
2665 2666 2667
}


2668
int
2669
qemuMonitorGetMigrationStats(qemuMonitorPtr mon,
2670 2671
                             qemuMonitorMigrationStatsPtr stats,
                             char **error)
2672
{
2673
    QEMU_CHECK_MONITOR(mon);
2674

2675 2676 2677
    if (error)
        *error = NULL;

D
Daniel P. Berrange 已提交
2678
    if (mon->json)
2679
        return qemuMonitorJSONGetMigrationStats(mon, stats, error);
D
Daniel P. Berrange 已提交
2680
    else
2681
        return qemuMonitorTextGetMigrationStats(mon, stats);
2682 2683 2684
}


2685 2686 2687 2688
int
qemuMonitorMigrateToFd(qemuMonitorPtr mon,
                       unsigned int flags,
                       int fd)
E
Eric Blake 已提交
2689 2690
{
    int ret;
2691
    VIR_DEBUG("fd=%d flags=0x%x", fd, flags);
E
Eric Blake 已提交
2692

2693
    QEMU_CHECK_MONITOR(mon);
E
Eric Blake 已提交
2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704

    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)
2705
            VIR_WARN("failed to close migration handle");
E
Eric Blake 已提交
2706 2707 2708 2709 2710 2711
    }

    return ret;
}


2712 2713 2714 2715 2716 2717
int
qemuMonitorMigrateToHost(qemuMonitorPtr mon,
                         unsigned int flags,
                         const char *protocol,
                         const char *hostname,
                         int port)
2718
{
D
Daniel P. Berrange 已提交
2719
    int ret;
2720
    char *uri = NULL;
2721
    VIR_DEBUG("hostname=%s port=%d flags=0x%x", hostname, port, flags);
2722

2723
    QEMU_CHECK_MONITOR(mon);
2724

2725 2726 2727 2728
    if (strchr(hostname, ':')) {
        if (virAsprintf(&uri, "%s:[%s]:%d", protocol, hostname, port) < 0)
            return -1;
    } else if (virAsprintf(&uri, "%s:%s:%d", protocol, hostname, port) < 0) {
2729
        return -1;
2730
    }
2731

D
Daniel P. Berrange 已提交
2732
    if (mon->json)
2733
        ret = qemuMonitorJSONMigrate(mon, flags, uri);
D
Daniel P. Berrange 已提交
2734
    else
2735 2736 2737
        ret = qemuMonitorTextMigrate(mon, flags, uri);

    VIR_FREE(uri);
D
Daniel P. Berrange 已提交
2738
    return ret;
2739 2740 2741
}


2742 2743
int
qemuMonitorMigrateCancel(qemuMonitorPtr mon)
2744
{
2745
    QEMU_CHECK_MONITOR(mon);
2746

D
Daniel P. Berrange 已提交
2747
    if (mon->json)
2748
        return qemuMonitorJSONMigrateCancel(mon);
D
Daniel P. Berrange 已提交
2749
    else
2750
        return qemuMonitorTextMigrateCancel(mon);
2751 2752
}

2753

2754 2755 2756 2757 2758 2759 2760 2761 2762 2763
int
qemuMonitorQueryDump(qemuMonitorPtr mon,
                     qemuMonitorDumpStatsPtr stats)
{
    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONQueryDump(mon, stats);
}


2764 2765 2766
/**
 * Returns 1 if @capability is supported, 0 if it's not, or -1 on error.
 */
2767 2768 2769
int
qemuMonitorGetDumpGuestMemoryCapability(qemuMonitorPtr mon,
                                        const char *capability)
2770
{
2771
    VIR_DEBUG("capability=%s", capability);
2772

2773
    QEMU_CHECK_MONITOR(mon);
2774 2775 2776 2777 2778 2779 2780 2781

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

    return qemuMonitorJSONGetDumpGuestMemoryCapability(mon, capability);
}

2782

2783
int
2784 2785 2786 2787
qemuMonitorDumpToFd(qemuMonitorPtr mon,
                    int fd,
                    const char *dumpformat,
                    bool detach)
2788 2789
{
    int ret;
2790
    VIR_DEBUG("fd=%d dumpformat=%s", fd, dumpformat);
2791

2792
    QEMU_CHECK_MONITOR_JSON(mon);
2793 2794 2795 2796

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

2797
    ret = qemuMonitorJSONDump(mon, "fd:dump", dumpformat, detach);
2798 2799 2800 2801 2802 2803 2804 2805

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

    return ret;
}
2806

2807 2808 2809 2810 2811 2812 2813 2814

int
qemuMonitorGraphicsRelocate(qemuMonitorPtr mon,
                            int type,
                            const char *hostname,
                            int port,
                            int tlsPort,
                            const char *tlsSubject)
2815
{
2816 2817 2818 2819
    VIR_DEBUG("type=%d hostname=%s port=%d tlsPort=%d tlsSubject=%s",
              type, hostname, port, tlsPort, NULLSTR(tlsSubject));

    QEMU_CHECK_MONITOR(mon);
2820 2821

    if (mon->json)
2822 2823 2824 2825 2826 2827
        return qemuMonitorJSONGraphicsRelocate(mon,
                                               type,
                                               hostname,
                                               port,
                                               tlsPort,
                                               tlsSubject);
2828
    else
2829 2830 2831 2832 2833 2834
        return qemuMonitorTextGraphicsRelocate(mon,
                                               type,
                                               hostname,
                                               port,
                                               tlsPort,
                                               tlsSubject);
2835 2836 2837
}


2838 2839 2840 2841
int
qemuMonitorSendFileHandle(qemuMonitorPtr mon,
                          const char *fdname,
                          int fd)
2842
{
2843
    VIR_DEBUG("fdname=%s fd=%d", fdname, fd);
2844

2845
    QEMU_CHECK_MONITOR(mon);
2846

2847
    if (fd < 0) {
2848 2849
        virReportError(VIR_ERR_INVALID_ARG, "%s",
                       _("fd must be valid"));
2850 2851 2852 2853
        return -1;
    }

    if (!mon->hasSendFD) {
2854
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
2855 2856
                       _("qemu is not using a unix socket monitor, "
                         "cannot send fd %s"), fdname);
2857 2858 2859
        return -1;
    }

D
Daniel P. Berrange 已提交
2860
    if (mon->json)
2861
        return qemuMonitorJSONSendFileHandle(mon, fdname, fd);
D
Daniel P. Berrange 已提交
2862
    else
2863
        return qemuMonitorTextSendFileHandle(mon, fdname, fd);
2864 2865 2866
}


2867 2868 2869
int
qemuMonitorCloseFileHandle(qemuMonitorPtr mon,
                           const char *fdname)
2870
{
2871 2872 2873
    int ret = -1;
    virErrorPtr error;

2874
    VIR_DEBUG("fdname=%s", fdname);
2875

2876 2877
    error = virSaveLastError();

2878
    QEMU_CHECK_MONITOR_GOTO(mon, cleanup);
2879

D
Daniel P. Berrange 已提交
2880 2881 2882 2883
    if (mon->json)
        ret = qemuMonitorJSONCloseFileHandle(mon, fdname);
    else
        ret = qemuMonitorTextCloseFileHandle(mon, fdname);
2884

2885
 cleanup:
2886 2887 2888 2889
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
D
Daniel P. Berrange 已提交
2890
    return ret;
2891 2892 2893
}


2894 2895 2896 2897 2898 2899
/* 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)
{
2900
    VIR_DEBUG("fdset=%d, fd=%d, name=%s", fdset, fd, NULLSTR(name));
2901

2902
    QEMU_CHECK_MONITOR_JSON(mon);
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916

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

2917
    return qemuMonitorJSONAddFd(mon, fdset, fd, name);
2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929
}


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

2930
    VIR_DEBUG("fdset=%d, fd=%d", fdset, fd);
2931 2932 2933

    error = virSaveLastError();

2934
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, cleanup);
2935

2936
    ret = qemuMonitorJSONRemoveFd(mon, fdset, fd);
2937

2938
 cleanup:
2939 2940 2941 2942 2943 2944 2945 2946
    if (error) {
        virSetError(error);
        virFreeError(error);
    }
    return ret;
}


2947 2948 2949 2950 2951
int
qemuMonitorAddHostNetwork(qemuMonitorPtr mon,
                          const char *netstr,
                          int *tapfd, char **tapfdName, int tapfdSize,
                          int *vhostfd, char **vhostfdName, int vhostfdSize)
2952
{
2953
    int ret = -1;
2954
    size_t i = 0, j = 0;
2955

2956
    VIR_DEBUG("netstr=%s tapfd=%p tapfdName=%p tapfdSize=%d "
2957
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
2958
              netstr, tapfd, tapfdName, tapfdSize,
2959
              vhostfd, vhostfdName, vhostfdSize);
2960

2961
    QEMU_CHECK_MONITOR(mon);
2962

2963 2964 2965 2966 2967 2968 2969
    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;
2970 2971
    }

D
Daniel P. Berrange 已提交
2972
    if (mon->json)
2973
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
2974
                       _("JSON monitor should be using AddNetdev"));
D
Daniel P. Berrange 已提交
2975 2976
    else
        ret = qemuMonitorTextAddHostNetwork(mon, netstr);
2977

2978
 cleanup:
2979
    if (ret < 0) {
2980 2981 2982 2983 2984 2985 2986 2987
        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]);
        }
2988 2989
    }

D
Daniel P. Berrange 已提交
2990
    return ret;
2991 2992 2993
}


2994 2995 2996 2997
int
qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
                             int vlan,
                             const char *netname)
2998
{
2999
    VIR_DEBUG("netname=%s", netname);
3000

3001
    QEMU_CHECK_MONITOR(mon);
3002

3003
    if (mon->json) {
3004
        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
3005
                       _("JSON monitor should be using RemoveNetdev"));
3006 3007 3008 3009
        return -1;
    }

    return qemuMonitorTextRemoveHostNetwork(mon, vlan, netname);
3010
}
3011

3012

3013 3014 3015 3016 3017
int
qemuMonitorAddNetdev(qemuMonitorPtr mon,
                     const char *netdevstr,
                     int *tapfd, char **tapfdName, int tapfdSize,
                     int *vhostfd, char **vhostfdName, int vhostfdSize)
3018
{
3019
    int ret = -1;
3020
    size_t i = 0, j = 0;
3021

3022
    VIR_DEBUG("netdevstr=%s tapfd=%p tapfdName=%p tapfdSize=%d"
3023
              "vhostfd=%p vhostfdName=%p vhostfdSize=%d",
3024
              netdevstr, tapfd, tapfdName, tapfdSize,
3025
              vhostfd, vhostfdName, vhostfdSize);
3026

3027
    QEMU_CHECK_MONITOR(mon);
3028

3029 3030 3031 3032 3033 3034 3035
    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;
3036 3037
    }

3038 3039 3040 3041
    if (mon->json)
        ret = qemuMonitorJSONAddNetdev(mon, netdevstr);
    else
        ret = qemuMonitorTextAddNetdev(mon, netdevstr);
3042

3043
 cleanup:
3044
    if (ret < 0) {
3045 3046 3047 3048 3049 3050 3051 3052
        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]);
        }
3053 3054
    }

3055 3056 3057
    return ret;
}

3058 3059 3060 3061

int
qemuMonitorRemoveNetdev(qemuMonitorPtr mon,
                        const char *alias)
3062
{
3063
    VIR_DEBUG("alias=%s", alias);
3064

3065
    QEMU_CHECK_MONITOR(mon);
3066 3067

    if (mon->json)
3068
        return qemuMonitorJSONRemoveNetdev(mon, alias);
3069
    else
3070
        return qemuMonitorTextRemoveNetdev(mon, alias);
3071 3072 3073
}


3074 3075 3076 3077
int
qemuMonitorQueryRxFilter(qemuMonitorPtr mon, const char *alias,
                         virNetDevRxFilterPtr *filter)
{
3078
    VIR_DEBUG("alias=%s filter=%p", alias, filter);
3079

3080
    QEMU_CHECK_MONITOR_JSON(mon);
3081 3082

    return qemuMonitorJSONQueryRxFilter(mon, alias, filter);
3083 3084 3085
}


3086
void
3087 3088 3089 3090 3091 3092 3093 3094 3095 3096
qemuMonitorChardevInfoFree(void *data,
                           const void *name ATTRIBUTE_UNUSED)
{
    qemuMonitorChardevInfoPtr info = data;

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


3097 3098 3099
int
qemuMonitorGetChardevInfo(qemuMonitorPtr mon,
                          virHashTablePtr *retinfo)
3100
{
3101
    int ret;
3102 3103
    virHashTablePtr info = NULL;

3104
    VIR_DEBUG("retinfo=%p", retinfo);
3105

3106
    QEMU_CHECK_MONITOR_GOTO(mon, error);
3107

3108
    if (!(info = virHashCreate(10, qemuMonitorChardevInfoFree)))
3109 3110
        goto error;

3111
    if (mon->json)
3112
        ret = qemuMonitorJSONGetChardevInfo(mon, info);
3113
    else
3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125
        ret = qemuMonitorTextGetChardevInfo(mon, info);

    if (ret < 0)
        goto error;

    *retinfo = info;
    return 0;

 error:
    virHashFree(info);
    *retinfo = NULL;
    return -1;
3126
}
3127 3128


3129 3130 3131 3132 3133 3134 3135
/**
 * qemuMonitorDriveDel:
 * @mon: monitor object
 * @drivestr: identifier of drive to delete.
 *
 * Attempts to remove a host drive.
 * Returns 1 if unsupported, 0 if ok, and -1 on other failure */
3136 3137 3138
int
qemuMonitorDriveDel(qemuMonitorPtr mon,
                    const char *drivestr)
3139
{
3140
    VIR_DEBUG("drivestr=%s", drivestr);
3141

3142
    QEMU_CHECK_MONITOR(mon);
3143

3144 3145
    /* there won't be a direct replacement for drive_del in QMP */
    return qemuMonitorTextDriveDel(mon, drivestr);
3146 3147
}

3148 3149 3150 3151

int
qemuMonitorDelDevice(qemuMonitorPtr mon,
                     const char *devalias)
3152
{
3153
    VIR_DEBUG("devalias=%s", devalias);
3154

3155
    QEMU_CHECK_MONITOR(mon);
3156

3157
    if (mon->json)
3158
        return qemuMonitorJSONDelDevice(mon, devalias);
3159
    else
3160
        return qemuMonitorTextDelDevice(mon, devalias);
3161 3162
}

3163

3164 3165 3166 3167 3168
int
qemuMonitorAddDeviceWithFd(qemuMonitorPtr mon,
                           const char *devicestr,
                           int fd,
                           const char *fdname)
3169
{
3170
    VIR_DEBUG("device=%s fd=%d fdname=%s", devicestr, fd, NULLSTR(fdname));
3171 3172
    int ret;

3173
    QEMU_CHECK_MONITOR(mon);
3174

3175 3176 3177
    if (fd >= 0 && qemuMonitorSendFileHandle(mon, fdname, fd) < 0)
        return -1;

3178 3179 3180 3181
    if (mon->json)
        ret = qemuMonitorJSONAddDevice(mon, devicestr);
    else
        ret = qemuMonitorTextAddDevice(mon, devicestr);
3182 3183 3184 3185 3186 3187

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

3188 3189 3190
    return ret;
}

3191 3192 3193 3194

int
qemuMonitorAddDevice(qemuMonitorPtr mon,
                     const char *devicestr)
3195 3196 3197 3198
{
    return qemuMonitorAddDeviceWithFd(mon, devicestr, -1, NULL);
}

3199

3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217
/**
 * qemuMonitorAddDeviceArgs:
 * @mon: monitor object
 * @args: arguments for device add, consumed on success or failure
 *
 * Adds a device described by @args. Requires JSON monitor.
 * Returns 0 on success -1 on error.
 */
int
qemuMonitorAddDeviceArgs(qemuMonitorPtr mon,
                         virJSONValuePtr args)
{
    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONAddDeviceArgs(mon, args);
}


3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233
/**
 * qemuMonitorAddObject:
 * @mon: Pointer to monitor object
 * @type: Type name of object to add
 * @objalias: Alias of the new object
 * @props: Optional arguments for the given type. The object is consumed and
 *         should not be referenced by the caller after this function returns.
 *
 * Returns 0 on success -1 on error.
 */
int
qemuMonitorAddObject(qemuMonitorPtr mon,
                     const char *type,
                     const char *objalias,
                     virJSONValuePtr props)
{
3234
    VIR_DEBUG("type=%s objalias=%s props=%p", type, objalias, props);
3235

3236
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, error);
3237

3238
    return qemuMonitorJSONAddObject(mon, type, objalias, props);
3239 3240 3241 3242 3243

 error:
    virJSONValueFree(props);
    return -1;
}
3244 3245 3246 3247 3248 3249


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

3252
    QEMU_CHECK_MONITOR_JSON(mon);
3253

3254
    return qemuMonitorJSONDelObject(mon, objalias);
3255 3256 3257
}


3258 3259 3260
int
qemuMonitorAddDrive(qemuMonitorPtr mon,
                    const char *drivestr)
3261
{
3262
    VIR_DEBUG("drive=%s", drivestr);
3263

3264
    QEMU_CHECK_MONITOR(mon);
3265

3266 3267
    /* there won't ever be a direct QMP replacement for this function */
    return qemuMonitorTextAddDrive(mon, drivestr);
3268
}
3269 3270


3271 3272 3273 3274
int
qemuMonitorSetDrivePassphrase(qemuMonitorPtr mon,
                              const char *alias,
                              const char *passphrase)
3275
{
3276
    VIR_DEBUG("alias=%s passphrase=%p(value hidden)", alias, passphrase);
3277

3278
    QEMU_CHECK_MONITOR(mon);
3279

3280
    if (mon->json)
3281
        return qemuMonitorJSONSetDrivePassphrase(mon, alias, passphrase);
3282
    else
3283
        return qemuMonitorTextSetDrivePassphrase(mon, alias, passphrase);
3284
}
C
Chris Lalancette 已提交
3285

3286 3287 3288

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

3292
    QEMU_CHECK_MONITOR(mon);
3293

C
Chris Lalancette 已提交
3294
    if (mon->json)
3295
        return qemuMonitorJSONCreateSnapshot(mon, name);
C
Chris Lalancette 已提交
3296
    else
3297
        return qemuMonitorTextCreateSnapshot(mon, name);
C
Chris Lalancette 已提交
3298 3299
}

3300 3301
int
qemuMonitorLoadSnapshot(qemuMonitorPtr mon, const char *name)
C
Chris Lalancette 已提交
3302
{
3303
    VIR_DEBUG("name=%s", name);
C
Chris Lalancette 已提交
3304

3305
    QEMU_CHECK_MONITOR(mon);
3306

C
Chris Lalancette 已提交
3307
    if (mon->json)
3308
        return qemuMonitorJSONLoadSnapshot(mon, name);
C
Chris Lalancette 已提交
3309
    else
3310
        return qemuMonitorTextLoadSnapshot(mon, name);
C
Chris Lalancette 已提交
3311 3312
}

3313 3314 3315

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

3319
    QEMU_CHECK_MONITOR(mon);
3320

C
Chris Lalancette 已提交
3321
    if (mon->json)
3322
        return qemuMonitorJSONDeleteSnapshot(mon, name);
C
Chris Lalancette 已提交
3323
    else
3324
        return qemuMonitorTextDeleteSnapshot(mon, name);
C
Chris Lalancette 已提交
3325
}
3326

3327

3328 3329 3330 3331
/* 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
3332
qemuMonitorDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
3333 3334
                        const char *device, const char *file,
                        const char *format, bool reuse)
3335
{
3336 3337
    VIR_DEBUG("actions=%p, device=%s, file=%s, format=%s, reuse=%d",
              actions, device, file, format, reuse);
3338

3339
    QEMU_CHECK_MONITOR_JSON(mon);
3340 3341

    return qemuMonitorJSONDiskSnapshot(mon, actions, device, file, format, reuse);
3342 3343
}

3344

3345
/* Start a drive-mirror block job.  bandwidth is in bytes/sec.  */
3346 3347 3348
int
qemuMonitorDriveMirror(qemuMonitorPtr mon,
                       const char *device, const char *file,
3349
                       const char *format, unsigned long long bandwidth,
3350
                       unsigned int granularity, unsigned long long buf_size,
3351 3352
                       unsigned int flags)
{
3353
    VIR_DEBUG("device=%s, file=%s, format=%s, bandwidth=%lld, "
3354
              "granularity=%#x, buf_size=%lld, flags=0x%x",
3355
              device, file, NULLSTR(format), bandwidth, granularity,
3356
              buf_size, flags);
3357

3358
    QEMU_CHECK_MONITOR_JSON(mon);
3359 3360 3361

    return qemuMonitorJSONDriveMirror(mon, device, file, format, bandwidth,
                                      granularity, buf_size, flags);
3362 3363
}

3364

3365 3366
/* Use the transaction QMP command to run atomic snapshot commands.  */
int
3367
qemuMonitorTransaction(qemuMonitorPtr mon, virJSONValuePtr *actions)
3368
{
3369
    VIR_DEBUG("actions=%p", *actions);
3370

3371
    QEMU_CHECK_MONITOR_JSON(mon);
3372 3373

    return qemuMonitorJSONTransaction(mon, actions);
3374 3375
}

3376

3377
/* Start a block-commit block job.  bandwidth is in bytes/sec.  */
3378 3379 3380
int
qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device,
                       const char *top, const char *base,
3381
                       const char *backingName,
3382
                       unsigned long long bandwidth)
3383
{
3384 3385
    VIR_DEBUG("device=%s, top=%s, base=%s, backingName=%s, bandwidth=%llu",
              device, top, base, NULLSTR(backingName), bandwidth);
3386

3387
    QEMU_CHECK_MONITOR_JSON(mon);
3388 3389 3390

    return qemuMonitorJSONBlockCommit(mon, device, top, base,
                                         backingName, bandwidth);
3391 3392
}

3393 3394 3395 3396 3397

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

3401
    return qemuMonitorJSONBlockCommit(mon, "bogus", NULL, NULL, NULL, 0) == -2;
3402 3403 3404
}


3405 3406 3407 3408 3409 3410 3411 3412
/* Determine the name that qemu is using for tracking the backing
 * element TARGET within the chain starting at TOP.  */
char *
qemuMonitorDiskNameLookup(qemuMonitorPtr mon,
                          const char *device,
                          virStorageSourcePtr top,
                          virStorageSourcePtr target)
{
3413
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
3414 3415 3416 3417 3418

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


3419
/* Use the block-job-complete monitor command to pivot a block copy job.  */
3420
int
3421 3422
qemuMonitorDrivePivot(qemuMonitorPtr mon,
                      const char *device)
3423
{
3424
    VIR_DEBUG("device=%s", device);
3425

3426
    QEMU_CHECK_MONITOR_JSON(mon);
3427 3428

    return qemuMonitorJSONDrivePivot(mon, device);
3429 3430
}

3431 3432 3433 3434 3435 3436

int
qemuMonitorArbitraryCommand(qemuMonitorPtr mon,
                            const char *cmd,
                            char **reply,
                            bool hmp)
3437
{
3438 3439 3440
    VIR_DEBUG("cmd=%s, reply=%p, hmp=%d", cmd, reply, hmp);

    QEMU_CHECK_MONITOR(mon);
3441 3442

    if (mon->json)
3443
        return qemuMonitorJSONArbitraryCommand(mon, cmd, reply, hmp);
3444
    else
3445
        return qemuMonitorTextArbitraryCommand(mon, cmd, reply);
3446
}
3447 3448


3449 3450
int
qemuMonitorInjectNMI(qemuMonitorPtr mon)
3451
{
3452
    QEMU_CHECK_MONITOR(mon);
3453 3454

    if (mon->json)
3455
        return qemuMonitorJSONInjectNMI(mon);
3456
    else
3457
        return qemuMonitorTextInjectNMI(mon);
3458
}
3459

3460 3461 3462 3463 3464 3465

int
qemuMonitorSendKey(qemuMonitorPtr mon,
                   unsigned int holdtime,
                   unsigned int *keycodes,
                   unsigned int nkeycodes)
3466
{
3467 3468 3469
    VIR_DEBUG("holdtime=%u, nkeycodes=%u", holdtime, nkeycodes);

    QEMU_CHECK_MONITOR(mon);
3470 3471

    if (mon->json)
3472
        return qemuMonitorJSONSendKey(mon, holdtime, keycodes, nkeycodes);
3473
    else
3474
        return qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes);
3475 3476
}

3477 3478 3479

int
qemuMonitorScreendump(qemuMonitorPtr mon,
3480 3481
                      const char *device,
                      unsigned int head,
3482
                      const char *file)
3483
{
3484
    VIR_DEBUG("file=%s", file);
3485

3486
    QEMU_CHECK_MONITOR(mon);
3487 3488

    if (mon->json)
3489
        return qemuMonitorJSONScreendump(mon, device, head, file);
3490
    else
3491
        return qemuMonitorTextScreendump(mon, file);
3492
}
3493

3494

3495
/* bandwidth is in bytes/sec */
3496
int
3497 3498 3499 3500
qemuMonitorBlockStream(qemuMonitorPtr mon,
                       const char *device,
                       const char *base,
                       const char *backingName,
3501
                       unsigned long long bandwidth)
3502
{
3503 3504
    VIR_DEBUG("device=%s, base=%s, backingName=%s, bandwidth=%lluB",
              device, NULLSTR(base), NULLSTR(backingName), bandwidth);
3505

3506
    QEMU_CHECK_MONITOR_JSON(mon);
3507

3508
    return qemuMonitorJSONBlockStream(mon, device, base, backingName, bandwidth);
3509
}
3510

3511

3512 3513
int
qemuMonitorBlockJobCancel(qemuMonitorPtr mon,
3514
                          const char *device)
3515
{
3516
    VIR_DEBUG("device=%s", device);
3517

3518
    QEMU_CHECK_MONITOR_JSON(mon);
3519

3520
    return qemuMonitorJSONBlockJobCancel(mon, device);
3521 3522 3523
}


3524 3525 3526
int
qemuMonitorBlockJobSetSpeed(qemuMonitorPtr mon,
                            const char *device,
3527
                            unsigned long long bandwidth)
3528
{
3529
    VIR_DEBUG("device=%s, bandwidth=%lluB", device, bandwidth);
3530

3531
    QEMU_CHECK_MONITOR_JSON(mon);
3532

3533
    return qemuMonitorJSONBlockJobSetSpeed(mon, device, bandwidth);
3534 3535 3536
}


3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549
virHashTablePtr
qemuMonitorGetAllBlockJobInfo(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
    return qemuMonitorJSONGetAllBlockJobInfo(mon);
}


/**
 * qemuMonitorGetBlockJobInfo:
 * Parse Block Job information, and populate info for the named device.
 * Return 1 if info available, 0 if device has no block job, and -1 on error.
 */
3550
int
3551 3552 3553
qemuMonitorGetBlockJobInfo(qemuMonitorPtr mon,
                           const char *alias,
                           qemuMonitorBlockJobInfoPtr info)
3554
{
3555 3556 3557
    virHashTablePtr all;
    qemuMonitorBlockJobInfoPtr data;
    int ret = 0;
3558

3559 3560 3561 3562
    VIR_DEBUG("alias=%s, info=%p", alias, info);

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

3564 3565 3566 3567 3568 3569 3570
    if ((data = virHashLookup(all, alias))) {
        *info = *data;
        ret = 1;
    }

    virHashFree(all);
    return ret;
3571 3572 3573
}


3574 3575 3576 3577
int
qemuMonitorSetBlockIoThrottle(qemuMonitorPtr mon,
                              const char *device,
                              virDomainBlockIoTuneInfoPtr info,
3578
                              bool supportMaxOptions,
3579
                              bool supportGroupNameOption,
3580
                              bool supportMaxLengthOptions)
3581
{
3582 3583 3584
    VIR_DEBUG("device=%p, info=%p", device, info);

    QEMU_CHECK_MONITOR(mon);
3585

3586
    if (mon->json)
3587 3588
        return qemuMonitorJSONSetBlockIoThrottle(mon, device, info,
                                                 supportMaxOptions,
3589
                                                 supportGroupNameOption,
3590
                                                 supportMaxLengthOptions);
3591 3592
    else
        return qemuMonitorTextSetBlockIoThrottle(mon, device, info);
3593 3594
}

3595 3596 3597 3598

int
qemuMonitorGetBlockIoThrottle(qemuMonitorPtr mon,
                              const char *device,
3599
                              virDomainBlockIoTuneInfoPtr reply)
3600
{
3601 3602 3603
    VIR_DEBUG("device=%p, reply=%p", device, reply);

    QEMU_CHECK_MONITOR(mon);
3604

3605
    if (mon->json)
3606
        return qemuMonitorJSONGetBlockIoThrottle(mon, device, reply);
3607 3608
    else
        return qemuMonitorTextGetBlockIoThrottle(mon, device, reply);
3609 3610 3611
}


3612 3613
int
qemuMonitorVMStatusToPausedReason(const char *status)
3614 3615 3616 3617 3618 3619 3620
{
    int st;

    if (!status)
        return VIR_DOMAIN_PAUSED_UNKNOWN;

    if ((st = qemuMonitorVMStatusTypeFromString(status)) < 0) {
P
Philipp Hahn 已提交
3621
        VIR_WARN("QEMU reported unknown VM status: '%s'", status);
3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
        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:
P
Philipp Hahn 已提交
3644
        VIR_WARN("QEMU reports the guest is paused but status is 'running'");
3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655
        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;

3656
    case QEMU_MONITOR_VM_STATUS_GUEST_PANICKED:
3657
        return VIR_DOMAIN_PAUSED_CRASHED;
3658

3659 3660 3661 3662 3663 3664
    /* unreachable from this point on */
    case QEMU_MONITOR_VM_STATUS_LAST:
        ;
    }
    return VIR_DOMAIN_PAUSED_UNKNOWN;
}
3665 3666


3667 3668 3669 3670 3671 3672
int
qemuMonitorOpenGraphics(qemuMonitorPtr mon,
                        const char *protocol,
                        int fd,
                        const char *fdname,
                        bool skipauth)
3673
{
3674 3675
    VIR_DEBUG("protocol=%s fd=%d fdname=%s skipauth=%d",
              protocol, fd, NULLSTR(fdname), skipauth);
3676 3677
    int ret;

3678
    QEMU_CHECK_MONITOR(mon);
3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694

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

3696 3697 3698

int
qemuMonitorSystemWakeup(qemuMonitorPtr mon)
3699
{
3700
    QEMU_CHECK_MONITOR_JSON(mon);
3701 3702 3703

    return qemuMonitorJSONSystemWakeup(mon);
}
3704

3705 3706 3707 3708 3709 3710 3711

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

3716
    QEMU_CHECK_MONITOR_JSON(mon);
3717 3718 3719

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

3721 3722 3723 3724

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

3728
    QEMU_CHECK_MONITOR_JSON(mon);
3729 3730 3731 3732

    return qemuMonitorJSONGetMachines(mon, machines);
}

3733 3734 3735

void
qemuMonitorMachineInfoFree(qemuMonitorMachineInfoPtr machine)
3736 3737 3738 3739 3740 3741 3742
{
    if (!machine)
        return;
    VIR_FREE(machine->name);
    VIR_FREE(machine->alias);
    VIR_FREE(machine);
}
3743

3744 3745 3746

int
qemuMonitorGetCPUDefinitions(qemuMonitorPtr mon,
3747
                             qemuMonitorCPUDefInfoPtr **cpus)
3748
{
3749
    VIR_DEBUG("cpus=%p", cpus);
3750

3751
    QEMU_CHECK_MONITOR_JSON(mon);
3752 3753 3754

    return qemuMonitorJSONGetCPUDefinitions(mon, cpus);
}
3755 3756


3757 3758 3759 3760 3761
void
qemuMonitorCPUDefInfoFree(qemuMonitorCPUDefInfoPtr cpu)
{
    if (!cpu)
        return;
3762 3763

    virStringListFree(cpu->blockers);
3764 3765 3766 3767 3768
    VIR_FREE(cpu->name);
    VIR_FREE(cpu);
}


3769 3770
int
qemuMonitorGetCPUModelExpansion(qemuMonitorPtr mon,
3771
                                qemuMonitorCPUModelExpansionType type,
3772
                                const char *model_name,
3773
                                bool migratable,
3774 3775
                                qemuMonitorCPUModelInfoPtr *model_info)
{
3776 3777
    VIR_DEBUG("type=%d model_name=%s migratable=%d",
              type, model_name, migratable);
3778 3779 3780

    QEMU_CHECK_MONITOR_JSON(mon);

3781 3782
    return qemuMonitorJSONGetCPUModelExpansion(mon, type, model_name,
                                               migratable, model_info);
3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793
}


void
qemuMonitorCPUModelInfoFree(qemuMonitorCPUModelInfoPtr model_info)
{
    size_t i;

    if (!model_info)
        return;

3794
    for (i = 0; i < model_info->nprops; i++) {
3795
        VIR_FREE(model_info->props[i].name);
3796 3797 3798
        if (model_info->props[i].type == QEMU_MONITOR_CPU_PROPERTY_STRING)
            VIR_FREE(model_info->props[i].value.string);
    }
3799

3800
    VIR_FREE(model_info->props);
3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820
    VIR_FREE(model_info->name);
    VIR_FREE(model_info);
}


qemuMonitorCPUModelInfoPtr
qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig)
{
    qemuMonitorCPUModelInfoPtr copy;
    size_t i;

    if (VIR_ALLOC(copy) < 0)
        goto error;

    if (VIR_ALLOC_N(copy->props, orig->nprops) < 0)
        goto error;

    if (VIR_STRDUP(copy->name, orig->name) < 0)
        goto error;

3821
    copy->migratability = orig->migratability;
3822 3823 3824 3825 3826 3827
    copy->nprops = orig->nprops;

    for (i = 0; i < orig->nprops; i++) {
        if (VIR_STRDUP(copy->props[i].name, orig->props[i].name) < 0)
            goto error;

3828
        copy->props[i].migratable = orig->props[i].migratable;
3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847
        copy->props[i].type = orig->props[i].type;
        switch (orig->props[i].type) {
        case QEMU_MONITOR_CPU_PROPERTY_BOOLEAN:
            copy->props[i].value.boolean = orig->props[i].value.boolean;
            break;

        case QEMU_MONITOR_CPU_PROPERTY_STRING:
            if (VIR_STRDUP(copy->props[i].value.string,
                           orig->props[i].value.string) < 0)
                goto error;
            break;

        case QEMU_MONITOR_CPU_PROPERTY_NUMBER:
            copy->props[i].value.number = orig->props[i].value.number;
            break;

        case QEMU_MONITOR_CPU_PROPERTY_LAST:
            break;
        }
3848 3849 3850 3851 3852 3853 3854 3855 3856 3857
    }

    return copy;

 error:
    qemuMonitorCPUModelInfoFree(copy);
    return NULL;
}


3858 3859 3860
int
qemuMonitorGetCommands(qemuMonitorPtr mon,
                       char ***commands)
3861
{
3862
    VIR_DEBUG("commands=%p", commands);
3863

3864
    QEMU_CHECK_MONITOR_JSON(mon);
3865 3866 3867

    return qemuMonitorJSONGetCommands(mon, commands);
}
3868 3869


3870 3871 3872
int
qemuMonitorGetEvents(qemuMonitorPtr mon,
                     char ***events)
3873
{
3874
    VIR_DEBUG("events=%p", events);
3875

3876
    QEMU_CHECK_MONITOR_JSON(mon);
3877 3878 3879

    return qemuMonitorJSONGetEvents(mon, events);
}
3880 3881


3882 3883 3884 3885 3886
/* 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,
3887 3888
                                          char ***params,
                                          bool *found)
3889
{
3890
    VIR_DEBUG("option=%s params=%p", option, params);
3891

3892
    QEMU_CHECK_MONITOR_JSON(mon);
3893

3894 3895
    return qemuMonitorJSONGetCommandLineOptionParameters(mon, option,
                                                         params, found);
3896 3897 3898
}


3899 3900 3901 3902
int
qemuMonitorGetKVMState(qemuMonitorPtr mon,
                       bool *enabled,
                       bool *present)
3903
{
3904
    VIR_DEBUG("enabled=%p present=%p", enabled, present);
3905

3906
    QEMU_CHECK_MONITOR_JSON(mon);
3907 3908 3909 3910 3911

    return qemuMonitorJSONGetKVMState(mon, enabled, present);
}


3912 3913 3914
int
qemuMonitorGetObjectTypes(qemuMonitorPtr mon,
                          char ***types)
3915
{
3916
    VIR_DEBUG("types=%p", types);
3917

3918
    QEMU_CHECK_MONITOR_JSON(mon);
3919 3920 3921

    return qemuMonitorJSONGetObjectTypes(mon, types);
}
3922 3923


3924
int
3925 3926
qemuMonitorGetDeviceProps(qemuMonitorPtr mon,
                          const char *device,
3927
                          char ***props)
3928
{
3929
    VIR_DEBUG("device=%s props=%p", device, props);
3930

3931
    QEMU_CHECK_MONITOR_JSON(mon);
3932

3933
    return qemuMonitorJSONGetDeviceProps(mon, device, props);
3934
}
3935 3936


3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949
int
qemuMonitorGetObjectProps(qemuMonitorPtr mon,
                          const char *object,
                          char ***props)
{
    VIR_DEBUG("object=%s props=%p", object, props);

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONGetObjectProps(mon, object, props);
}


3950 3951
char *
qemuMonitorGetTargetArch(qemuMonitorPtr mon)
3952
{
3953
    QEMU_CHECK_MONITOR_JSON_NULL(mon);
3954 3955 3956

    return qemuMonitorJSONGetTargetArch(mon);
}
3957 3958


3959 3960 3961 3962
int
qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon,
                                    char ***capabilities)
{
3963
    QEMU_CHECK_MONITOR(mon);
3964 3965 3966 3967 3968 3969 3970 3971 3972

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

    return qemuMonitorJSONGetMigrationCapabilities(mon, capabilities);
}


3973 3974 3975 3976 3977 3978 3979 3980 3981 3982
/**
 * qemuMonitorSetMigrationCapabilities:
 * @mon: Pointer to the monitor object.
 * @caps: Migration capabilities.
 *
 * The @caps object is consumed and should not be referenced by the caller
 * after this function returns.
 *
 * Returns 0 on success, -1 on error.
 */
3983 3984
int
qemuMonitorSetMigrationCapabilities(qemuMonitorPtr mon,
3985
                                    virJSONValuePtr caps)
3986
{
3987
    QEMU_CHECK_MONITOR_JSON_GOTO(mon, error);
3988

3989
    return qemuMonitorJSONSetMigrationCapabilities(mon, caps);
3990

3991 3992 3993
 error:
    virJSONValueFree(caps);
    return -1;
3994 3995 3996
}


A
Andrea Bolognani 已提交
3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013
/**
 * qemuMonitorGetGICCapabilities:
 * @mon: QEMU monitor
 * @capabilities: where to store the GIC capabilities
 *
 * See qemuMonitorJSONGetGICCapabilities().
 */
int
qemuMonitorGetGICCapabilities(qemuMonitorPtr mon,
                              virGICCapability **capabilities)
{
    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONGetGICCapabilities(mon, capabilities);
}


4014 4015 4016
int
qemuMonitorNBDServerStart(qemuMonitorPtr mon,
                          const char *host,
4017 4018
                          unsigned int port,
                          const char *tls_alias)
4019
{
4020
    VIR_DEBUG("host=%s port=%u tls_alias=%s", host, port, NULLSTR(tls_alias));
4021

4022
    QEMU_CHECK_MONITOR_JSON(mon);
4023

4024
    return qemuMonitorJSONNBDServerStart(mon, host, port, tls_alias);
4025
}
4026

4027 4028 4029 4030 4031

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

4035
    QEMU_CHECK_MONITOR_JSON(mon);
4036 4037 4038

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

4040 4041 4042

int
qemuMonitorNBDServerStop(qemuMonitorPtr mon)
4043
{
4044
    QEMU_CHECK_MONITOR_JSON(mon);
4045 4046 4047

    return qemuMonitorJSONNBDServerStop(mon);
}
S
Stefan Berger 已提交
4048 4049


4050 4051
int
qemuMonitorGetTPMModels(qemuMonitorPtr mon,
S
Stefan Berger 已提交
4052 4053
                            char ***tpmmodels)
{
4054
    VIR_DEBUG("tpmmodels=%p", tpmmodels);
S
Stefan Berger 已提交
4055

4056
    QEMU_CHECK_MONITOR_JSON(mon);
S
Stefan Berger 已提交
4057 4058 4059 4060 4061

    return qemuMonitorJSONGetTPMModels(mon, tpmmodels);
}


4062 4063 4064
int
qemuMonitorGetTPMTypes(qemuMonitorPtr mon,
                       char ***tpmtypes)
S
Stefan Berger 已提交
4065
{
4066
    VIR_DEBUG("tpmtypes=%p", tpmtypes);
S
Stefan Berger 已提交
4067

4068
    QEMU_CHECK_MONITOR_JSON(mon);
S
Stefan Berger 已提交
4069 4070 4071

    return qemuMonitorJSONGetTPMTypes(mon, tpmtypes);
}
4072

4073 4074 4075 4076 4077

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

4081
    QEMU_CHECK_MONITOR_JSON(mon);
4082 4083 4084

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

4086 4087 4088 4089

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

4093
    QEMU_CHECK_MONITOR_JSON(mon);
4094 4095 4096

    return qemuMonitorJSONDetachCharDev(mon, chrID);
}
4097

4098

4099 4100 4101 4102
int
qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
                            char ***aliases)
{
4103
    VIR_DEBUG("aliases=%p", aliases);
4104

4105
    QEMU_CHECK_MONITOR_JSON(mon);
4106 4107 4108

    return qemuMonitorJSONGetDeviceAliases(mon, aliases);
}
4109 4110 4111


/**
4112 4113
 * qemuMonitorSetDomainLogLocked:
 * @mon: Locked monitor object to set the log file reading on
4114 4115 4116
 * @func: the callback to report errors
 * @opaque: data to pass to @func
 * @destroy: optional callback to free @opaque
4117 4118 4119 4120
 *
 * Set the file descriptor of the open VM log file to report potential
 * early startup errors of qemu. This function requires @mon to be
 * locked already!
4121
 */
4122
void
4123 4124 4125 4126
qemuMonitorSetDomainLogLocked(qemuMonitorPtr mon,
                              qemuMonitorReportDomainLogError func,
                              void *opaque,
                              virFreeCallback destroy)
4127
{
4128 4129
    if (mon->logDestroy && mon->logOpaque)
        mon->logDestroy(mon->logOpaque);
4130

4131 4132 4133
    mon->logFunc = func;
    mon->logOpaque = opaque;
    mon->logDestroy = destroy;
4134
}
4135 4136


4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159
/**
 * qemuMonitorSetDomainLog:
 * @mon: Unlocked monitor object to set the log file reading on
 * @func: the callback to report errors
 * @opaque: data to pass to @func
 * @destroy: optional callback to free @opaque
 *
 * Set the file descriptor of the open VM log file to report potential
 * early startup errors of qemu. This functions requires @mon to be
 * unlocked.
 */
void
qemuMonitorSetDomainLog(qemuMonitorPtr mon,
                        qemuMonitorReportDomainLogError func,
                        void *opaque,
                        virFreeCallback destroy)
{
    virObjectLock(mon);
    qemuMonitorSetDomainLogLocked(mon, func, opaque, destroy);
    virObjectUnlock(mon);
}


4160 4161 4162 4163
/**
 * qemuMonitorJSONGetGuestCPU:
 * @mon: Pointer to the monitor
 * @arch: arch of the guest
4164
 * @data: returns the cpu data
4165
 * @disabled: returns the CPU data for features which were disabled by QEMU
4166 4167 4168
 *
 * Retrieve the definition of the guest CPU from a running qemu instance.
 *
4169 4170
 * Returns 0 on success, -2 if the operation is not supported by the guest,
 * -1 on other errors.
4171
 */
4172
int
4173
qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
4174
                       virArch arch,
4175 4176
                       virCPUDataPtr *data,
                       virCPUDataPtr *disabled)
4177
{
4178 4179
    VIR_DEBUG("arch=%s data=%p disabled=%p",
              virArchToString(arch), data, disabled);
4180

4181
    QEMU_CHECK_MONITOR_JSON(mon);
4182

4183
    *data = NULL;
4184 4185
    if (disabled)
        *disabled = NULL;
4186

4187
    return qemuMonitorJSONGetGuestCPU(mon, arch, data, disabled);
4188
}
4189

4190

4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205
/**
 * qemuMonitorRTCResetReinjection:
 * @mon: Pointer to the monitor
 *
 * Issue rtc-reset-reinjection command.
 * This should be used in cases where guest time is restored via
 * guest agent, so RTC injection is not needed (in fact it would
 * confuse guest's RTC).
 *
 * Returns 0 on success
 *        -1 on error.
 */
int
qemuMonitorRTCResetReinjection(qemuMonitorPtr mon)
{
4206
    QEMU_CHECK_MONITOR_JSON(mon);
4207 4208 4209

    return qemuMonitorJSONRTCResetReinjection(mon);
}
4210

4211

4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224
/**
 * qemuMonitorGetIOThreads:
 * @mon: Pointer to the monitor
 * @iothreads: Location to return array of IOThreadInfo data
 *
 * Issue query-iothreads command.
 * Retrieve the list of iothreads defined/running for the machine
 *
 * Returns count of IOThreadInfo structures on success
 *        -1 on error.
 */
int
qemuMonitorGetIOThreads(qemuMonitorPtr mon,
4225
                        qemuMonitorIOThreadInfoPtr **iothreads)
4226 4227
{

4228
    VIR_DEBUG("iothreads=%p", iothreads);
4229

4230
    QEMU_CHECK_MONITOR(mon);
4231

4232
    /* Requires JSON to make the query */
4233
    if (!mon->json) {
4234 4235
        *iothreads = NULL;
        return 0;
4236 4237 4238 4239 4240
    }

    return qemuMonitorJSONGetIOThreads(mon, iothreads);
}

4241

4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257
/**
 * qemuMonitorGetMemoryDeviceInfo:
 * @mon: pointer to the monitor
 * @info: Location to return the hash of qemuMonitorMemoryDeviceInfo
 *
 * Retrieve state and addresses of frontend memory devices present in
 * the guest.
 *
 * Returns 0 on success and fills @info with a newly allocated struct; if the
 * data can't be retrieved due to lack of support in qemu, returns -2. On
 * other errors returns -1.
 */
int
qemuMonitorGetMemoryDeviceInfo(qemuMonitorPtr mon,
                               virHashTablePtr *info)
{
4258
    VIR_DEBUG("info=%p", info);
4259 4260 4261 4262
    int ret;

    *info = NULL;

4263
    QEMU_CHECK_MONITOR(mon);
4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277

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

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

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

    return ret;
}
4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289


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

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONMigrateIncoming(mon, uri);
}
4290 4291 4292 4293 4294 4295 4296 4297 4298


int
qemuMonitorMigrateStartPostCopy(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONMigrateStartPostCopy(mon);
}
4299

4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312

int
qemuMonitorMigrateContinue(qemuMonitorPtr mon,
                           qemuMonitorMigrationStatus status)
{
    VIR_DEBUG("status=%s", qemuMonitorMigrationStatusTypeToString(status));

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONMigrateContinue(mon, status);
}


4313 4314 4315 4316 4317 4318 4319 4320
int
qemuMonitorGetRTCTime(qemuMonitorPtr mon,
                      struct tm *tm)
{
    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONGetRTCTime(mon, tm);
}
4321 4322


4323
virJSONValuePtr
4324 4325 4326 4327 4328 4329
qemuMonitorQueryQMPSchema(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON_NULL(mon);

    return qemuMonitorJSONQueryQMPSchema(mon);
}
4330 4331 4332 4333 4334 4335 4336


int
qemuMonitorSetBlockThreshold(qemuMonitorPtr mon,
                             const char *nodename,
                             unsigned long long threshold)
{
4337
    VIR_DEBUG("node='%s', threshold=%llu", nodename, threshold);
4338 4339 4340 4341 4342

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONSetBlockThreshold(mon, nodename, threshold);
}
4343 4344 4345 4346 4347 4348 4349 4350 4351


virJSONValuePtr
qemuMonitorQueryNamedBlockNodes(qemuMonitorPtr mon)
{
    QEMU_CHECK_MONITOR_JSON_NULL(mon);

    return qemuMonitorJSONQueryNamedBlockNodes(mon);
}
4352 4353


4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367
char *
qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfoPtr info)
{
    char *ret = NULL;

    switch (info->type) {
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV:
        ignore_value(virAsprintf(&ret,
                                 "hyper-v: arg1='0x%llx', arg2='0x%llx', "
                                 "arg3='0x%llx', arg4='0x%llx', arg5='0x%llx'",
                                 info->data.hyperv.arg1, info->data.hyperv.arg2,
                                 info->data.hyperv.arg3, info->data.hyperv.arg4,
                                 info->data.hyperv.arg5));
        break;
4368 4369 4370 4371 4372 4373 4374 4375
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390:
        ignore_value(virAsprintf(&ret, "s390: core='%d' psw-mask='0x%016llx' "
                                 "psw-addr='0x%016llx' reason='%s'",
                                 info->data.s390.core,
                                 info->data.s390.psw_mask,
                                 info->data.s390.psw_addr,
                                 info->data.s390.reason));
        break;
4376 4377 4378 4379 4380 4381 4382 4383 4384
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE:
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST:
        break;
    }

    return ret;
}


4385 4386 4387 4388 4389 4390
void
qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicInfoPtr info)
{
    if (!info)
        return;

4391 4392 4393 4394 4395 4396 4397 4398 4399 4400
    switch (info->type) {
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390:
        VIR_FREE(info->data.s390.reason);
        break;
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE:
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV:
    case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST:
        break;
    }

4401 4402
    VIR_FREE(info);
}
M
Michal Privoznik 已提交
4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414


int
qemuMonitorSetWatchdogAction(qemuMonitorPtr mon,
                             const char *action)
{
    VIR_DEBUG("watchdogAction=%s", action);

    QEMU_CHECK_MONITOR_JSON(mon);

    return qemuMonitorJSONSetWatchdogAction(mon, action);
}