mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-01 17:35:17 +00:00
qemu: Move qemuParseKeywords(Free) to the monitor code
The only user is now in qemu_monitor_json.c to re-parse the command line format into keyvalue pairs for use in QMP command construction. Move and rename the functions. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com> Reviewed-by: Andrea Bolognani <abologna@redhat.com>
This commit is contained in:
parent
bd843409a4
commit
e8b505c956
@ -140,7 +140,6 @@ src/qemu/qemu_migration_params.c
|
|||||||
src/qemu/qemu_monitor.c
|
src/qemu/qemu_monitor.c
|
||||||
src/qemu/qemu_monitor_json.c
|
src/qemu/qemu_monitor_json.c
|
||||||
src/qemu/qemu_monitor_text.c
|
src/qemu/qemu_monitor_text.c
|
||||||
src/qemu/qemu_parse_command.c
|
|
||||||
src/qemu/qemu_process.c
|
src/qemu/qemu_process.c
|
||||||
src/qemu/qemu_qapi.c
|
src/qemu/qemu_qapi.c
|
||||||
src/remote/remote_client_bodies.h
|
src/remote/remote_client_bodies.h
|
||||||
|
@ -13,8 +13,6 @@ QEMU_DRIVER_SOURCES = \
|
|||||||
qemu/qemu_capabilities.h \
|
qemu/qemu_capabilities.h \
|
||||||
qemu/qemu_command.c \
|
qemu/qemu_command.c \
|
||||||
qemu/qemu_command.h \
|
qemu/qemu_command.h \
|
||||||
qemu/qemu_parse_command.c \
|
|
||||||
qemu/qemu_parse_command.h \
|
|
||||||
qemu/qemu_domain.c \
|
qemu/qemu_domain.c \
|
||||||
qemu/qemu_domain.h \
|
qemu/qemu_domain.h \
|
||||||
qemu/qemu_domain_address.c \
|
qemu/qemu_domain_address.c \
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include "qemu_monitor_text.h"
|
#include "qemu_monitor_text.h"
|
||||||
#include "qemu_monitor_json.h"
|
#include "qemu_monitor_json.h"
|
||||||
#include "qemu_alias.h"
|
#include "qemu_alias.h"
|
||||||
#include "qemu_parse_command.h"
|
|
||||||
#include "qemu_capabilities.h"
|
#include "qemu_capabilities.h"
|
||||||
#include "viralloc.h"
|
#include "viralloc.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
@ -555,6 +554,123 @@ qemuMonitorJSONMakeCommand(const char *cmdname,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
qemuMonitorJSONParseKeywordsFree(int nkeywords,
|
||||||
|
char **keywords,
|
||||||
|
char **values)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < nkeywords; i++) {
|
||||||
|
VIR_FREE(keywords[i]);
|
||||||
|
VIR_FREE(values[i]);
|
||||||
|
}
|
||||||
|
VIR_FREE(keywords);
|
||||||
|
VIR_FREE(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Takes a string containing a set of key=value,key=value,key...
|
||||||
|
* parameters and splits them up, returning two arrays with
|
||||||
|
* the individual keys and values. If allowEmptyValue is nonzero,
|
||||||
|
* the "=value" part is optional and if a key with no value is found,
|
||||||
|
* NULL is be placed into corresponding place in retvalues.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
qemuMonitorJSONParseKeywords(const char *str,
|
||||||
|
char ***retkeywords,
|
||||||
|
char ***retvalues,
|
||||||
|
int *retnkeywords,
|
||||||
|
int allowEmptyValue)
|
||||||
|
{
|
||||||
|
int keywordCount = 0;
|
||||||
|
int keywordAlloc = 0;
|
||||||
|
char **keywords = NULL;
|
||||||
|
char **values = NULL;
|
||||||
|
const char *start = str;
|
||||||
|
const char *end;
|
||||||
|
|
||||||
|
*retkeywords = NULL;
|
||||||
|
*retvalues = NULL;
|
||||||
|
*retnkeywords = 0;
|
||||||
|
end = start + strlen(str);
|
||||||
|
|
||||||
|
while (start) {
|
||||||
|
const char *separator;
|
||||||
|
const char *endmark;
|
||||||
|
char *keyword;
|
||||||
|
char *value = NULL;
|
||||||
|
|
||||||
|
endmark = start;
|
||||||
|
do {
|
||||||
|
/* QEMU accepts ',,' as an escape for a literal comma;
|
||||||
|
* skip past those here while searching for the end of the
|
||||||
|
* value, then strip them down below */
|
||||||
|
endmark = strchr(endmark, ',');
|
||||||
|
} while (endmark && endmark[1] == ',' && (endmark += 2));
|
||||||
|
if (!endmark)
|
||||||
|
endmark = end;
|
||||||
|
if (!(separator = strchr(start, '=')))
|
||||||
|
separator = end;
|
||||||
|
|
||||||
|
if (separator >= endmark) {
|
||||||
|
if (!allowEmptyValue) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("malformed keyword arguments in '%s'"), str);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
separator = endmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VIR_STRNDUP(keyword, start, separator - start) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (separator < endmark) {
|
||||||
|
separator++;
|
||||||
|
if (VIR_STRNDUP(value, separator, endmark - separator) < 0) {
|
||||||
|
VIR_FREE(keyword);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (strchr(value, ',')) {
|
||||||
|
char *p = strchr(value, ',') + 1;
|
||||||
|
char *q = p + 1;
|
||||||
|
while (*q) {
|
||||||
|
if (*q == ',')
|
||||||
|
q++;
|
||||||
|
*p++ = *q++;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keywordAlloc == keywordCount) {
|
||||||
|
if (VIR_REALLOC_N(keywords, keywordAlloc + 10) < 0 ||
|
||||||
|
VIR_REALLOC_N(values, keywordAlloc + 10) < 0) {
|
||||||
|
VIR_FREE(keyword);
|
||||||
|
VIR_FREE(value);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
keywordAlloc += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
keywords[keywordCount] = keyword;
|
||||||
|
values[keywordCount] = value;
|
||||||
|
keywordCount++;
|
||||||
|
|
||||||
|
start = endmark < end ? endmark + 1 : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*retkeywords = keywords;
|
||||||
|
*retvalues = values;
|
||||||
|
*retnkeywords = keywordCount;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
qemuMonitorJSONParseKeywordsFree(keywordCount, keywords, values);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static virJSONValuePtr
|
static virJSONValuePtr
|
||||||
qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword)
|
qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword)
|
||||||
{
|
{
|
||||||
@ -567,7 +683,7 @@ qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword)
|
|||||||
if (!(ret = virJSONValueNewObject()))
|
if (!(ret = virJSONValueNewObject()))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (qemuParseKeywords(str, &keywords, &values, &nkeywords, 1) < 0)
|
if (qemuMonitorJSONParseKeywords(str, &keywords, &values, &nkeywords, 1) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
for (i = 0; i < nkeywords; i++) {
|
for (i = 0; i < nkeywords; i++) {
|
||||||
@ -588,11 +704,11 @@ qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qemuParseKeywordsFree(nkeywords, keywords, values);
|
qemuMonitorJSONParseKeywordsFree(nkeywords, keywords, values);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
qemuParseKeywordsFree(nkeywords, keywords, values);
|
qemuMonitorJSONParseKeywordsFree(nkeywords, keywords, values);
|
||||||
virJSONValueFree(ret);
|
virJSONValueFree(ret);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
* qemu_parse_command.c: QEMU command parser
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006-2016 Red Hat, Inc.
|
|
||||||
* 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
|
|
||||||
* License along with this library. If not, see
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "qemu_parse_command.h"
|
|
||||||
#include "viralloc.h"
|
|
||||||
#include "virlog.h"
|
|
||||||
#include "virstring.h"
|
|
||||||
#include "virerror.h"
|
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
|
||||||
|
|
||||||
VIR_LOG_INIT("qemu.qemu_parse_command");
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
qemuParseKeywordsFree(int nkeywords,
|
|
||||||
char **keywords,
|
|
||||||
char **values)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
for (i = 0; i < nkeywords; i++) {
|
|
||||||
VIR_FREE(keywords[i]);
|
|
||||||
VIR_FREE(values[i]);
|
|
||||||
}
|
|
||||||
VIR_FREE(keywords);
|
|
||||||
VIR_FREE(values);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Takes a string containing a set of key=value,key=value,key...
|
|
||||||
* parameters and splits them up, returning two arrays with
|
|
||||||
* the individual keys and values. If allowEmptyValue is nonzero,
|
|
||||||
* the "=value" part is optional and if a key with no value is found,
|
|
||||||
* NULL is be placed into corresponding place in retvalues.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
qemuParseKeywords(const char *str,
|
|
||||||
char ***retkeywords,
|
|
||||||
char ***retvalues,
|
|
||||||
int *retnkeywords,
|
|
||||||
int allowEmptyValue)
|
|
||||||
{
|
|
||||||
int keywordCount = 0;
|
|
||||||
int keywordAlloc = 0;
|
|
||||||
char **keywords = NULL;
|
|
||||||
char **values = NULL;
|
|
||||||
const char *start = str;
|
|
||||||
const char *end;
|
|
||||||
|
|
||||||
*retkeywords = NULL;
|
|
||||||
*retvalues = NULL;
|
|
||||||
*retnkeywords = 0;
|
|
||||||
end = start + strlen(str);
|
|
||||||
|
|
||||||
while (start) {
|
|
||||||
const char *separator;
|
|
||||||
const char *endmark;
|
|
||||||
char *keyword;
|
|
||||||
char *value = NULL;
|
|
||||||
|
|
||||||
endmark = start;
|
|
||||||
do {
|
|
||||||
/* QEMU accepts ',,' as an escape for a literal comma;
|
|
||||||
* skip past those here while searching for the end of the
|
|
||||||
* value, then strip them down below */
|
|
||||||
endmark = strchr(endmark, ',');
|
|
||||||
} while (endmark && endmark[1] == ',' && (endmark += 2));
|
|
||||||
if (!endmark)
|
|
||||||
endmark = end;
|
|
||||||
if (!(separator = strchr(start, '=')))
|
|
||||||
separator = end;
|
|
||||||
|
|
||||||
if (separator >= endmark) {
|
|
||||||
if (!allowEmptyValue) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
||||||
_("malformed keyword arguments in '%s'"), str);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
separator = endmark;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VIR_STRNDUP(keyword, start, separator - start) < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (separator < endmark) {
|
|
||||||
separator++;
|
|
||||||
if (VIR_STRNDUP(value, separator, endmark - separator) < 0) {
|
|
||||||
VIR_FREE(keyword);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (strchr(value, ',')) {
|
|
||||||
char *p = strchr(value, ',') + 1;
|
|
||||||
char *q = p + 1;
|
|
||||||
while (*q) {
|
|
||||||
if (*q == ',')
|
|
||||||
q++;
|
|
||||||
*p++ = *q++;
|
|
||||||
}
|
|
||||||
*p = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keywordAlloc == keywordCount) {
|
|
||||||
if (VIR_REALLOC_N(keywords, keywordAlloc + 10) < 0 ||
|
|
||||||
VIR_REALLOC_N(values, keywordAlloc + 10) < 0) {
|
|
||||||
VIR_FREE(keyword);
|
|
||||||
VIR_FREE(value);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
keywordAlloc += 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
keywords[keywordCount] = keyword;
|
|
||||||
values[keywordCount] = value;
|
|
||||||
keywordCount++;
|
|
||||||
|
|
||||||
start = endmark < end ? endmark + 1 : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*retkeywords = keywords;
|
|
||||||
*retvalues = values;
|
|
||||||
*retnkeywords = keywordCount;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
qemuParseKeywordsFree(keywordCount, keywords, values);
|
|
||||||
return -1;
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* qemu_parse_command.h: QEMU command parser
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006-2016 Red Hat, Inc.
|
|
||||||
* 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
|
|
||||||
* License along with this library. If not, see
|
|
||||||
* <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
void
|
|
||||||
qemuParseKeywordsFree(int nkeywords,
|
|
||||||
char **keywords,
|
|
||||||
char **values);
|
|
||||||
|
|
||||||
int
|
|
||||||
qemuParseKeywords(const char *str,
|
|
||||||
char ***retkeywords,
|
|
||||||
char ***retvalues,
|
|
||||||
int *retnkeywords,
|
|
||||||
int allowEmptyValue);
|
|
Loading…
x
Reference in New Issue
Block a user