mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
qemu: Move and rename qemuBuildObjectCommandlineFromJSON
Move the module from qemu_command.c to a new module virqemu.c and rename the API to virQEMUBuildObjectCommandline. This API will then be shareable with qemu-img and the need to build a security object for luks support. Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
77ad76b615
commit
1b5f1884a2
@ -225,6 +225,7 @@ src/util/virpidfile.c
|
|||||||
src/util/virpolkit.c
|
src/util/virpolkit.c
|
||||||
src/util/virportallocator.c
|
src/util/virportallocator.c
|
||||||
src/util/virprocess.c
|
src/util/virprocess.c
|
||||||
|
src/util/virqemu.c
|
||||||
src/util/virrandom.c
|
src/util/virrandom.c
|
||||||
src/util/virrotatingfile.c
|
src/util/virrotatingfile.c
|
||||||
src/util/virscsi.c
|
src/util/virscsi.c
|
||||||
|
@ -153,6 +153,7 @@ UTIL_SOURCES = \
|
|||||||
util/virportallocator.c util/virportallocator.h \
|
util/virportallocator.c util/virportallocator.h \
|
||||||
util/virprobe.h \
|
util/virprobe.h \
|
||||||
util/virprocess.c util/virprocess.h \
|
util/virprocess.c util/virprocess.h \
|
||||||
|
util/virqemu.c util/virqemu.h \
|
||||||
util/virrandom.h util/virrandom.c \
|
util/virrandom.h util/virrandom.c \
|
||||||
util/virrotatingfile.h util/virrotatingfile.c \
|
util/virrotatingfile.h util/virrotatingfile.c \
|
||||||
util/virscsi.c util/virscsi.h \
|
util/virscsi.c util/virscsi.h \
|
||||||
|
@ -2141,6 +2141,10 @@ virProcessTranslateStatus;
|
|||||||
virProcessWait;
|
virProcessWait;
|
||||||
|
|
||||||
|
|
||||||
|
# util/virqemu.h
|
||||||
|
virQEMUBuildObjectCommandlineFromJSON;
|
||||||
|
|
||||||
|
|
||||||
# util/virrandom.h
|
# util/virrandom.h
|
||||||
virRandom;
|
virRandom;
|
||||||
virRandomBits;
|
virRandomBits;
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "virfile.h"
|
#include "virfile.h"
|
||||||
#include "virnetdev.h"
|
#include "virnetdev.h"
|
||||||
#include "virnetdevbridge.h"
|
#include "virnetdevbridge.h"
|
||||||
|
#include "virqemu.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
#include "virtime.h"
|
#include "virtime.h"
|
||||||
#include "viruuid.h"
|
#include "viruuid.h"
|
||||||
@ -286,116 +287,6 @@ qemuVirCommandGetDevSet(virCommandPtr cmd, int fd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
qemuBuildObjectCommandLinePropsInternal(const char *key,
|
|
||||||
const virJSONValue *value,
|
|
||||||
virBufferPtr buf,
|
|
||||||
bool nested)
|
|
||||||
{
|
|
||||||
virJSONValuePtr elem;
|
|
||||||
virBitmapPtr bitmap = NULL;
|
|
||||||
ssize_t pos = -1;
|
|
||||||
ssize_t end;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
switch ((virJSONType) value->type) {
|
|
||||||
case VIR_JSON_TYPE_STRING:
|
|
||||||
virBufferAsprintf(buf, ",%s=%s", key, value->data.string);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_JSON_TYPE_NUMBER:
|
|
||||||
virBufferAsprintf(buf, ",%s=%s", key, value->data.number);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_JSON_TYPE_BOOLEAN:
|
|
||||||
if (value->data.boolean)
|
|
||||||
virBufferAsprintf(buf, ",%s=yes", key);
|
|
||||||
else
|
|
||||||
virBufferAsprintf(buf, ",%s=no", key);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_JSON_TYPE_ARRAY:
|
|
||||||
if (nested) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("nested -object property arrays are not supported"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virJSONValueGetArrayAsBitmap(value, &bitmap) == 0) {
|
|
||||||
while ((pos = virBitmapNextSetBit(bitmap, pos)) > -1) {
|
|
||||||
if ((end = virBitmapNextClearBit(bitmap, pos)) < 0)
|
|
||||||
end = virBitmapLastSetBit(bitmap) + 1;
|
|
||||||
|
|
||||||
if (end - 1 > pos) {
|
|
||||||
virBufferAsprintf(buf, ",%s=%zd-%zd", key, pos, end - 1);
|
|
||||||
pos = end;
|
|
||||||
} else {
|
|
||||||
virBufferAsprintf(buf, ",%s=%zd", key, pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* fallback, treat the array as a non-bitmap, adding the key
|
|
||||||
* for each member */
|
|
||||||
for (i = 0; i < virJSONValueArraySize(value); i++) {
|
|
||||||
elem = virJSONValueArrayGet((virJSONValuePtr)value, i);
|
|
||||||
|
|
||||||
/* recurse to avoid duplicating code */
|
|
||||||
if (qemuBuildObjectCommandLinePropsInternal(key, elem, buf,
|
|
||||||
true) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_JSON_TYPE_OBJECT:
|
|
||||||
case VIR_JSON_TYPE_NULL:
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("NULL and OBJECT JSON types can't be converted to "
|
|
||||||
"commandline string"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
virBitmapFree(bitmap);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
qemuBuildObjectCommandLineProps(const char *key,
|
|
||||||
const virJSONValue *value,
|
|
||||||
void *opaque)
|
|
||||||
{
|
|
||||||
return qemuBuildObjectCommandLinePropsInternal(key, value, opaque, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *
|
|
||||||
qemuBuildObjectCommandlineFromJSON(const char *type,
|
|
||||||
const char *alias,
|
|
||||||
virJSONValuePtr props)
|
|
||||||
{
|
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
|
||||||
char *ret = NULL;
|
|
||||||
|
|
||||||
virBufferAsprintf(&buf, "%s,id=%s", type, alias);
|
|
||||||
|
|
||||||
if (virJSONValueObjectForeachKeyValue(props,
|
|
||||||
qemuBuildObjectCommandLineProps,
|
|
||||||
&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (virBufferCheckError(&buf) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
ret = virBufferContentAndReset(&buf);
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virBufferFreeAndReset(&buf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk)
|
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk)
|
||||||
{
|
{
|
||||||
char *ret;
|
char *ret;
|
||||||
@ -680,8 +571,9 @@ qemuBuildObjectSecretCommandLine(virCommandPtr cmd,
|
|||||||
if (qemuBuildSecretInfoProps(secinfo, &type, &props) < 0)
|
if (qemuBuildSecretInfoProps(secinfo, &type, &props) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!(tmp = qemuBuildObjectCommandlineFromJSON(type, secinfo->s.aes.alias,
|
if (!(tmp = virQEMUBuildObjectCommandlineFromJSON(type,
|
||||||
props)))
|
secinfo->s.aes.alias,
|
||||||
|
props)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
virCommandAddArgList(cmd, "-object", tmp, NULL);
|
virCommandAddArgList(cmd, "-object", tmp, NULL);
|
||||||
@ -3226,9 +3118,9 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def,
|
|||||||
&props, false)) < 0)
|
&props, false)) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(*backendStr = qemuBuildObjectCommandlineFromJSON(backendType,
|
if (!(*backendStr = virQEMUBuildObjectCommandlineFromJSON(backendType,
|
||||||
alias,
|
alias,
|
||||||
props)))
|
props)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = rc;
|
ret = rc;
|
||||||
@ -3268,7 +3160,7 @@ qemuBuildMemoryDimmBackendStr(virDomainMemoryDefPtr mem,
|
|||||||
&backendType, &props, true) < 0)
|
&backendType, &props, true) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = qemuBuildObjectCommandlineFromJSON(backendType, alias, props);
|
ret = virQEMUBuildObjectCommandlineFromJSON(backendType, alias, props);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(alias);
|
VIR_FREE(alias);
|
||||||
@ -5411,7 +5303,7 @@ qemuBuildRNGBackendStr(virDomainRNGDefPtr rng,
|
|||||||
if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0)
|
if (qemuBuildRNGBackendProps(rng, qemuCaps, &type, &props) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = qemuBuildObjectCommandlineFromJSON(type, alias, props);
|
ret = virQEMUBuildObjectCommandlineFromJSON(type, alias, props);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(alias);
|
VIR_FREE(alias);
|
||||||
|
@ -44,10 +44,6 @@
|
|||||||
|
|
||||||
VIR_ENUM_DECL(qemuVideo)
|
VIR_ENUM_DECL(qemuVideo)
|
||||||
|
|
||||||
char *qemuBuildObjectCommandlineFromJSON(const char *type,
|
|
||||||
const char *alias,
|
|
||||||
virJSONValuePtr props);
|
|
||||||
|
|
||||||
virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,
|
virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,
|
||||||
virLogManagerPtr logManager,
|
virLogManagerPtr logManager,
|
||||||
virDomainDefPtr def,
|
virDomainDefPtr def,
|
||||||
|
142
src/util/virqemu.c
Normal file
142
src/util/virqemu.c
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* virqemu.c: utilities for working with qemu and its tools
|
||||||
|
*
|
||||||
|
* Copyright (C) 2016 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "virbuffer.h"
|
||||||
|
#include "virerror.h"
|
||||||
|
#include "virlog.h"
|
||||||
|
#include "virqemu.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
||||||
|
|
||||||
|
VIR_LOG_INIT("util.qemu");
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virQEMUBuildObjectCommandLinePropsInternal(const char *key,
|
||||||
|
const virJSONValue *value,
|
||||||
|
virBufferPtr buf,
|
||||||
|
bool nested)
|
||||||
|
{
|
||||||
|
virJSONValuePtr elem;
|
||||||
|
virBitmapPtr bitmap = NULL;
|
||||||
|
ssize_t pos = -1;
|
||||||
|
ssize_t end;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
switch ((virJSONType) value->type) {
|
||||||
|
case VIR_JSON_TYPE_STRING:
|
||||||
|
virBufferAsprintf(buf, ",%s=%s", key, value->data.string);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_JSON_TYPE_NUMBER:
|
||||||
|
virBufferAsprintf(buf, ",%s=%s", key, value->data.number);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_JSON_TYPE_BOOLEAN:
|
||||||
|
if (value->data.boolean)
|
||||||
|
virBufferAsprintf(buf, ",%s=yes", key);
|
||||||
|
else
|
||||||
|
virBufferAsprintf(buf, ",%s=no", key);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_JSON_TYPE_ARRAY:
|
||||||
|
if (nested) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("nested -object property arrays are not supported"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virJSONValueGetArrayAsBitmap(value, &bitmap) == 0) {
|
||||||
|
while ((pos = virBitmapNextSetBit(bitmap, pos)) > -1) {
|
||||||
|
if ((end = virBitmapNextClearBit(bitmap, pos)) < 0)
|
||||||
|
end = virBitmapLastSetBit(bitmap) + 1;
|
||||||
|
|
||||||
|
if (end - 1 > pos) {
|
||||||
|
virBufferAsprintf(buf, ",%s=%zd-%zd", key, pos, end - 1);
|
||||||
|
pos = end;
|
||||||
|
} else {
|
||||||
|
virBufferAsprintf(buf, ",%s=%zd", key, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* fallback, treat the array as a non-bitmap, adding the key
|
||||||
|
* for each member */
|
||||||
|
for (i = 0; i < virJSONValueArraySize(value); i++) {
|
||||||
|
elem = virJSONValueArrayGet((virJSONValuePtr)value, i);
|
||||||
|
|
||||||
|
/* recurse to avoid duplicating code */
|
||||||
|
if (virQEMUBuildObjectCommandLinePropsInternal(key, elem, buf,
|
||||||
|
true) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_JSON_TYPE_OBJECT:
|
||||||
|
case VIR_JSON_TYPE_NULL:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("NULL and OBJECT JSON types can't be converted to "
|
||||||
|
"commandline string"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
virBitmapFree(bitmap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virQEMUBuildObjectCommandLineProps(const char *key,
|
||||||
|
const virJSONValue *value,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
return virQEMUBuildObjectCommandLinePropsInternal(key, value, opaque, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
virQEMUBuildObjectCommandlineFromJSON(const char *type,
|
||||||
|
const char *alias,
|
||||||
|
virJSONValuePtr props)
|
||||||
|
{
|
||||||
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
char *ret = NULL;
|
||||||
|
|
||||||
|
virBufferAsprintf(&buf, "%s,id=%s", type, alias);
|
||||||
|
|
||||||
|
if (virJSONValueObjectForeachKeyValue(props,
|
||||||
|
virQEMUBuildObjectCommandLineProps,
|
||||||
|
&buf) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virBufferCheckError(&buf) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = virBufferContentAndReset(&buf);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virBufferFreeAndReset(&buf);
|
||||||
|
return ret;
|
||||||
|
}
|
34
src/util/virqemu.h
Normal file
34
src/util/virqemu.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* virqemu.h: utilities for working with qemu and its tools
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009, 2012-2016 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2009 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
|
||||||
|
* License along with this library. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __VIR_QEMU_H_
|
||||||
|
# define __VIR_QEMU_H_
|
||||||
|
|
||||||
|
# include "internal.h"
|
||||||
|
# include "virjson.h"
|
||||||
|
|
||||||
|
char *virQEMUBuildObjectCommandlineFromJSON(const char *type,
|
||||||
|
const char *alias,
|
||||||
|
virJSONValuePtr props);
|
||||||
|
|
||||||
|
#endif /* __VIR_QEMU_H_ */
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2015 Red Hat, Inc.
|
* Copyright (C) 2015-2016 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "qemu/qemu_command.h"
|
|
||||||
#include "util/virjson.h"
|
#include "util/virjson.h"
|
||||||
|
#include "util/virqemu.h"
|
||||||
#include "testutils.h"
|
#include "testutils.h"
|
||||||
#include "testutilsqemu.h"
|
#include "testutilsqemu.h"
|
||||||
|
|
||||||
@ -51,9 +51,8 @@ testQemuCommandBuildObjectFromJSON(const void *opaque)
|
|||||||
data->expectprops ? data->expectprops : "") < 0)
|
data->expectprops ? data->expectprops : "") < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
result = qemuBuildObjectCommandlineFromJSON("testobject",
|
result = virQEMUBuildObjectCommandlineFromJSON("testobject",
|
||||||
"testalias",
|
"testalias", val);
|
||||||
val);
|
|
||||||
|
|
||||||
if (STRNEQ_NULLABLE(expect, result)) {
|
if (STRNEQ_NULLABLE(expect, result)) {
|
||||||
fprintf(stderr, "\nFailed to create object string. "
|
fprintf(stderr, "\nFailed to create object string. "
|
||||||
|
Loading…
x
Reference in New Issue
Block a user