11de7afc9SPaolo Bonzini /* 21de7afc9SPaolo Bonzini * Commandline option parsing functions 31de7afc9SPaolo Bonzini * 41de7afc9SPaolo Bonzini * Copyright (c) 2003-2008 Fabrice Bellard 51de7afc9SPaolo Bonzini * Copyright (c) 2009 Kevin Wolf <kwolf@redhat.com> 61de7afc9SPaolo Bonzini * 71de7afc9SPaolo Bonzini * Permission is hereby granted, free of charge, to any person obtaining a copy 81de7afc9SPaolo Bonzini * of this software and associated documentation files (the "Software"), to deal 91de7afc9SPaolo Bonzini * in the Software without restriction, including without limitation the rights 101de7afc9SPaolo Bonzini * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 111de7afc9SPaolo Bonzini * copies of the Software, and to permit persons to whom the Software is 121de7afc9SPaolo Bonzini * furnished to do so, subject to the following conditions: 131de7afc9SPaolo Bonzini * 141de7afc9SPaolo Bonzini * The above copyright notice and this permission notice shall be included in 151de7afc9SPaolo Bonzini * all copies or substantial portions of the Software. 161de7afc9SPaolo Bonzini * 171de7afc9SPaolo Bonzini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 181de7afc9SPaolo Bonzini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 191de7afc9SPaolo Bonzini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 201de7afc9SPaolo Bonzini * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 211de7afc9SPaolo Bonzini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 221de7afc9SPaolo Bonzini * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 231de7afc9SPaolo Bonzini * THE SOFTWARE. 241de7afc9SPaolo Bonzini */ 251de7afc9SPaolo Bonzini 26121d0712SMarkus Armbruster #ifndef QEMU_OPTION_H 27121d0712SMarkus Armbruster #define QEMU_OPTION_H 281de7afc9SPaolo Bonzini 291de7afc9SPaolo Bonzini #include "qemu/queue.h" 301de7afc9SPaolo Bonzini 318f4d9555SPhilippe Mathieu-Daudé /** 328f4d9555SPhilippe Mathieu-Daudé * get_opt_value 338f4d9555SPhilippe Mathieu-Daudé * @p: a pointer to the option name, delimited by commas 348f4d9555SPhilippe Mathieu-Daudé * @value: a non-NULL pointer that will received the delimited options 358f4d9555SPhilippe Mathieu-Daudé * 368f4d9555SPhilippe Mathieu-Daudé * The @value char pointer will be allocated and filled with 378f4d9555SPhilippe Mathieu-Daudé * the delimited options. 388f4d9555SPhilippe Mathieu-Daudé * 398f4d9555SPhilippe Mathieu-Daudé * Returns the position of the comma delimiter/zero byte after the 408f4d9555SPhilippe Mathieu-Daudé * option name in @p. 418f4d9555SPhilippe Mathieu-Daudé * The memory pointer in @value must be released with a call to g_free() 428f4d9555SPhilippe Mathieu-Daudé * when no longer required. 438f4d9555SPhilippe Mathieu-Daudé */ 44950c4e6cSDaniel P. Berrangé const char *get_opt_value(const char *p, char **value); 451de7afc9SPaolo Bonzini 46c75d7f71SMarkus Armbruster bool parse_option_size(const char *name, const char *value, 47e8cd45c7SVasilis Liaskovitis uint64_t *ret, Error **errp); 487cc07ab8SKevin Wolf bool has_help_option(const char *param); 491de7afc9SPaolo Bonzini 501de7afc9SPaolo Bonzini enum QemuOptType { 511de7afc9SPaolo Bonzini QEMU_OPT_STRING = 0, /* no parsing (use string as-is) */ 521de7afc9SPaolo Bonzini QEMU_OPT_BOOL, /* on/off */ 531de7afc9SPaolo Bonzini QEMU_OPT_NUMBER, /* simple number */ 541de7afc9SPaolo Bonzini QEMU_OPT_SIZE, /* size, accepts (K)ilo, (M)ega, (G)iga, (T)era postfix */ 551de7afc9SPaolo Bonzini }; 561de7afc9SPaolo Bonzini 571de7afc9SPaolo Bonzini typedef struct QemuOptDesc { 581de7afc9SPaolo Bonzini const char *name; 591de7afc9SPaolo Bonzini enum QemuOptType type; 601de7afc9SPaolo Bonzini const char *help; 6109722032SChunyan Liu const char *def_value_str; 621de7afc9SPaolo Bonzini } QemuOptDesc; 631de7afc9SPaolo Bonzini 641de7afc9SPaolo Bonzini struct QemuOptsList { 651de7afc9SPaolo Bonzini const char *name; 661de7afc9SPaolo Bonzini const char *implied_opt_name; 671de7afc9SPaolo Bonzini bool merge_lists; /* Merge multiple uses of option into a single list? */ 681de7afc9SPaolo Bonzini QTAILQ_HEAD(, QemuOpts) head; 691de7afc9SPaolo Bonzini QemuOptDesc desc[]; 701de7afc9SPaolo Bonzini }; 711de7afc9SPaolo Bonzini 721de7afc9SPaolo Bonzini const char *qemu_opt_get(QemuOpts *opts, const char *name); 73782730b0SChunyan Liu char *qemu_opt_get_del(QemuOpts *opts, const char *name); 741de7afc9SPaolo Bonzini /** 751de7afc9SPaolo Bonzini * qemu_opt_has_help_opt: 761de7afc9SPaolo Bonzini * @opts: options to search for a help request 771de7afc9SPaolo Bonzini * 781de7afc9SPaolo Bonzini * Check whether the options specified by @opts include one of the 791de7afc9SPaolo Bonzini * standard strings which indicate that the user is asking for a 801de7afc9SPaolo Bonzini * list of the valid values for a command line option (as defined 811de7afc9SPaolo Bonzini * by is_help_option()). 821de7afc9SPaolo Bonzini * 831de7afc9SPaolo Bonzini * Returns: true if @opts includes 'help' or equivalent. 841de7afc9SPaolo Bonzini */ 851de7afc9SPaolo Bonzini bool qemu_opt_has_help_opt(QemuOpts *opts); 8674c3c197SChunyan Liu QemuOpt *qemu_opt_find(QemuOpts *opts, const char *name); 871de7afc9SPaolo Bonzini bool qemu_opt_get_bool(QemuOpts *opts, const char *name, bool defval); 881de7afc9SPaolo Bonzini uint64_t qemu_opt_get_number(QemuOpts *opts, const char *name, uint64_t defval); 891de7afc9SPaolo Bonzini uint64_t qemu_opt_get_size(QemuOpts *opts, const char *name, uint64_t defval); 90782730b0SChunyan Liu bool qemu_opt_get_bool_del(QemuOpts *opts, const char *name, bool defval); 91782730b0SChunyan Liu uint64_t qemu_opt_get_number_del(QemuOpts *opts, const char *name, 92782730b0SChunyan Liu uint64_t defval); 93782730b0SChunyan Liu uint64_t qemu_opt_get_size_del(QemuOpts *opts, const char *name, 94782730b0SChunyan Liu uint64_t defval); 950dd6c526SKevin Wolf int qemu_opt_unset(QemuOpts *opts, const char *name); 96c75d7f71SMarkus Armbruster bool qemu_opt_set(QemuOpts *opts, const char *name, const char *value, 971de7afc9SPaolo Bonzini Error **errp); 98c75d7f71SMarkus Armbruster bool qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val, 99cccb7967SMarkus Armbruster Error **errp); 100c75d7f71SMarkus Armbruster bool qemu_opt_set_number(QemuOpts *opts, const char *name, int64_t val, 10139101f25SMarkus Armbruster Error **errp); 10271df1d83SMarkus Armbruster typedef int (*qemu_opt_loopfunc)(void *opaque, 10371df1d83SMarkus Armbruster const char *name, const char *value, 10471df1d83SMarkus Armbruster Error **errp); 10571df1d83SMarkus Armbruster int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque, 10671df1d83SMarkus Armbruster Error **errp); 1071de7afc9SPaolo Bonzini 108e998e209SDaniel P. Berrange typedef struct { 109e998e209SDaniel P. Berrange QemuOpts *opts; 110e998e209SDaniel P. Berrange QemuOpt *opt; 111e998e209SDaniel P. Berrange const char *name; 112e998e209SDaniel P. Berrange } QemuOptsIter; 113e998e209SDaniel P. Berrange 114e998e209SDaniel P. Berrange void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts, const char *name); 115e998e209SDaniel P. Berrange const char *qemu_opt_iter_next(QemuOptsIter *iter); 116e998e209SDaniel P. Berrange 1171de7afc9SPaolo Bonzini QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id); 1181de7afc9SPaolo Bonzini QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id, 1191de7afc9SPaolo Bonzini int fail_if_exists, Error **errp); 1201de7afc9SPaolo Bonzini void qemu_opts_reset(QemuOptsList *list); 1211de7afc9SPaolo Bonzini void qemu_opts_loc_restore(QemuOpts *opts); 1221de7afc9SPaolo Bonzini const char *qemu_opts_id(QemuOpts *opts); 123326642bcSKevin Wolf void qemu_opts_set_id(QemuOpts *opts, char *id); 1241de7afc9SPaolo Bonzini void qemu_opts_del(QemuOpts *opts); 125c75d7f71SMarkus Armbruster bool qemu_opts_validate(QemuOpts *opts, const QemuOptDesc *desc, Error **errp); 126c75d7f71SMarkus Armbruster bool qemu_opts_do_parse(QemuOpts *opts, const char *params, 127dc523cd3SMarkus Armbruster const char *firstname, Error **errp); 12870b94331SMarkus Armbruster QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params, 12970b94331SMarkus Armbruster bool permit_abbrev); 13070b94331SMarkus Armbruster QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params, 13170b94331SMarkus Armbruster bool permit_abbrev, Error **errp); 1321de7afc9SPaolo Bonzini QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict, 1331de7afc9SPaolo Bonzini Error **errp); 13472215395SKevin Wolf QDict *qemu_opts_to_qdict_filtered(QemuOpts *opts, QDict *qdict, 13572215395SKevin Wolf QemuOptsList *list, bool del); 1361de7afc9SPaolo Bonzini QDict *qemu_opts_to_qdict(QemuOpts *opts, QDict *qdict); 137c75d7f71SMarkus Armbruster bool qemu_opts_absorb_qdict(QemuOpts *opts, QDict *qdict, Error **errp); 1381de7afc9SPaolo Bonzini 13928d0de7aSMarkus Armbruster typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp); 140a4c7367fSMarkus Armbruster int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func, 14128d0de7aSMarkus Armbruster void *opaque, Error **errp); 14243c5d8f8SFam Zheng void qemu_opts_print(QemuOpts *opts, const char *sep); 14363898712SMax Reitz void qemu_opts_print_help(QemuOptsList *list, bool print_caption); 1448559e45eSChunyan Liu void qemu_opts_free(QemuOptsList *list); 145c282e1fdSChunyan Liu QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list); 1461de7afc9SPaolo Bonzini 147*4085b87fSMarc-André Lureau G_DEFINE_AUTOPTR_CLEANUP_FUNC(QemuOpts, qemu_opts_del) 148*4085b87fSMarc-André Lureau 1491de7afc9SPaolo Bonzini #endif 150