xref: /openbmc/qemu/include/qemu/option.h (revision 9ca9c893)
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