From e8b505c956837347757bb287ebfc9f4c44842e8e Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 17 Jun 2019 14:18:51 +0200 Subject: [PATCH] qemu: Move qemuParseKeywords(Free) to the monitor code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ján Tomko Reviewed-by: Andrea Bolognani --- po/POTFILES | 1 - src/qemu/Makefile.inc.am | 2 - src/qemu/qemu_monitor_json.c | 124 +++++++++++++++++++++++++++- src/qemu/qemu_parse_command.c | 149 ---------------------------------- src/qemu/qemu_parse_command.h | 34 -------- 5 files changed, 120 insertions(+), 190 deletions(-) delete mode 100644 src/qemu/qemu_parse_command.c delete mode 100644 src/qemu/qemu_parse_command.h diff --git a/po/POTFILES b/po/POTFILES index 9dd4ee7d99..ccfc873a89 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -140,7 +140,6 @@ src/qemu/qemu_migration_params.c src/qemu/qemu_monitor.c src/qemu/qemu_monitor_json.c src/qemu/qemu_monitor_text.c -src/qemu/qemu_parse_command.c src/qemu/qemu_process.c src/qemu/qemu_qapi.c src/remote/remote_client_bodies.h diff --git a/src/qemu/Makefile.inc.am b/src/qemu/Makefile.inc.am index fd32a90d56..254ba07dc0 100644 --- a/src/qemu/Makefile.inc.am +++ b/src/qemu/Makefile.inc.am @@ -13,8 +13,6 @@ QEMU_DRIVER_SOURCES = \ qemu/qemu_capabilities.h \ qemu/qemu_command.c \ qemu/qemu_command.h \ - qemu/qemu_parse_command.c \ - qemu/qemu_parse_command.h \ qemu/qemu_domain.c \ qemu/qemu_domain.h \ qemu/qemu_domain_address.c \ diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 96f44bc760..4eca75ecc9 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -31,7 +31,6 @@ #include "qemu_monitor_text.h" #include "qemu_monitor_json.h" #include "qemu_alias.h" -#include "qemu_parse_command.h" #include "qemu_capabilities.h" #include "viralloc.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 qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword) { @@ -567,7 +683,7 @@ qemuMonitorJSONKeywordStringToJSON(const char *str, const char *firstkeyword) if (!(ret = virJSONValueNewObject())) return NULL; - if (qemuParseKeywords(str, &keywords, &values, &nkeywords, 1) < 0) + if (qemuMonitorJSONParseKeywords(str, &keywords, &values, &nkeywords, 1) < 0) goto error; 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; error: - qemuParseKeywordsFree(nkeywords, keywords, values); + qemuMonitorJSONParseKeywordsFree(nkeywords, keywords, values); virJSONValueFree(ret); return NULL; } diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c deleted file mode 100644 index b49aa92fb3..0000000000 --- a/src/qemu/qemu_parse_command.c +++ /dev/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 - * . - */ - -#include - -#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; -} diff --git a/src/qemu/qemu_parse_command.h b/src/qemu/qemu_parse_command.h deleted file mode 100644 index 269bf88b06..0000000000 --- a/src/qemu/qemu_parse_command.h +++ /dev/null @@ -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 - * . - */ - -#pragma once - -void -qemuParseKeywordsFree(int nkeywords, - char **keywords, - char **values); - -int -qemuParseKeywords(const char *str, - char ***retkeywords, - char ***retvalues, - int *retnkeywords, - int allowEmptyValue);