qemu-option: Introduce default mechanism
PATCH 1/2 qemu-option: Introduce default mechanism
This adds qemu_opts_set_defaults, an interface provide default values for a QemuOpts set. Default options are parsed from a string and then prepended to the list of existing options, or they serve as the sole QemuOpts set.
--- qemu-option.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------- qemu-option.h | 2 + 2 files changed, 52 insertions(+), 8 deletions(-)
qemu-option.c +50 -8
@@ -603,7 +603,8 @@ static void qemu_opt_del(QemuOpt *opt)g_free (opt); } -int qemu_opt_set (QemuOpts *opts,const char *name,const char *value) +static int opt_set (QemuOpts *opts,const char *name,const char *value, +bool prepend) {QemuOpt *opt;const QemuOptDesc *desc = opts->list->desc;
@@ -626,7 +627,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) opt =g_malloc0 (sizeof (*opt)); opt->name =g_strdup (name); opt->opts = opts; -QTAILQ_INSERT_TAIL (&opts->head, opt, next); +if (prepend) { +QTAILQ_INSERT_HEAD (&opts->head, opt, next); + }else { +QTAILQ_INSERT_TAIL (&opts->head, opt, next); + }if (desc[i].name !=NULL ) { opt->desc = desc+i; }
@@ -640,6 +645,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value)return 0 ; } +int qemu_opt_set (QemuOpts *opts,const char *name,const char *value) +{ +return opt_set (opts, name, value, false); +} +int qemu_opt_set_bool (QemuOpts *opts,const char *name,bool val) {QemuOpt *opt;
@@ -691,6 +701,9 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id) QTAILQ_FOREACH(opts, &list->head, next) {if (!opts->id) { +if (!id) { +return opts; + }continue ; }if (strcmp (opts->id, id) !=0 ) {
@@ -806,7 +819,8 @@ int qemu_opts_print(QemuOpts *opts, void *dummy)return 0 ; } -int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname) +static int opts_do_parse (QemuOpts *opts,const char *params, +const char *firstname,bool prepend) {char option[128 ], value[1024 ];const char *p,*pe,*pc;
@@ -841,7 +855,7 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname }if (strcmp (option,"id" ) !=0 ) {/* store and parse */ -if (qemu_opt_set (opts, option, value) ==-1 ) { +if (opt_set (opts, option, value, prepend) ==-1 ) {return -1 ; } }
@@ -852,8 +866,13 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstnamereturn 0 ; } -QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params, -int permit_abbrev) +int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname) +{ +return opts_do_parse (opts, params, firstname, false); +} + +static QemuOpts *opts_parse (QemuOptsList *list,const char *params, +int permit_abbrev,bool defaults) {const char *firstname;char value[1024 ], *id =NULL ;
@@ -870,11 +889,19 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,get_opt_value (value,sizeof (value), p+4 ); id = value; } - opts =qemu_opts_create (list, id,1 ); +if (defaults) { +if (!id && !QTAILQ_EMPTY (&list->head)) { + opts =qemu_opts_find (list,NULL ); + }else { + opts =qemu_opts_create (list, id,0 ); + } + }else { + opts =qemu_opts_create (list, id,1 ); + }if (opts ==NULL )return NULL ; -if (qemu_opts_do_parse (opts, params, firstname) !=0 ) { +if (opts_do_parse (opts, params, firstname, defaults) !=0 ) {qemu_opts_del (opts);return NULL ; }
@@ -882,6 +909,21 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,return opts; } +QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params, +int permit_abbrev) +{ +return opts_parse (list, params, permit_abbrev, false); +} + +void qemu_opts_set_defaults (QemuOptsList *list,const char *params, +int permit_abbrev) +{ +QemuOpts *opts; + + opts =opts_parse (list, params, permit_abbrev, true); +assert (opts); +} +static void qemu_opts_from_qdict_1 (const char *key,QObject *obj,void *opaque) {char buf[32 ];
qemu-option.h +2 -0
@@ -125,6 +125,8 @@ void qemu_opts_del(QemuOpts *opts);int qemu_opts_validate (QemuOpts *opts,const QemuOptDesc *desc);int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname);QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params,int permit_abbrev); +void qemu_opts_set_defaults (QemuOptsList *list,const char *params, +int permit_abbrev);QemuOpts *qemu_opts_from_qdict (QemuOptsList *list,const QDict *qdict);QDict *qemu_opts_to_qdict (QemuOpts *opts,QDict *qdict);
Signature · 1 line
1.7.3.4
PATCH 2/2 Improve default machine options usability
So far we overwrite the machine options completely with defaults if no accel=value is provided. More user friendly is to fill in only unspecified options. The new qemu_opts_set_defaults enables this.
--- vl.c | 17 ++--------------- 1 files changed, 2 insertions(+), 15 deletions(-)
vl.c +2 -15
@@ -3153,21 +3153,8 @@ int main(int argc, char **argv, char **envp)* specified either by the configuration file or by the command line. */ if (machine->default_machine_opts) { -QemuOptsList *list =qemu_find_opts ("machine" ); -const char *p =NULL ; - -if (!QTAILQ_EMPTY (&list->head)) { - p =qemu_opt_get (QTAILQ_FIRST (&list->head),"accel" ); - } -if (p ==NULL ) { -qemu_opts_reset (list); - opts =qemu_opts_parse (list, machine->default_machine_opts,0 ); -if (!opts) { -fprintf (stderr,"parse error for machine %s: %s\n" , - machine->name, machine->default_machine_opts); -exit (1 ); - } - } +qemu_opts_set_defaults (qemu_find_opts ("machine" ), + machine->default_machine_opts,0 ); }qemu_opts_foreach (qemu_find_opts ("device" ), default_driver_check,NULL ,0 );
Signature · 1 line
1.7.3.4
Anthony Liguori
AppliedQuoted 6 lines · Jan Kiszka
This adds
qemu_opts_set_defaults, an interface provide default values for a QemuOpts set. Default options are parsed from a string and then prepended to the list of existing options, or they serve as the sole QemuOpts set.Signed-off-by Jan Kiszka<[email protected]>
Applied. Thanks.
Regards,
Anthony Liguori
Quoted 146 lines
--- qemu-option.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++------- qemu-option.h | 2 + 2 files changed, 52 insertions(+), 8 deletions(-)qemu-option.c +50
-8@@ -603,7 +603,8 @@ static void qemu_opt_del(QemuOpt *opt)g_free (opt); } -int qemu_opt_set (QemuOpts *opts,const char *name,const char *value) +static int opt_set (QemuOpts *opts,const char *name,const char *value, +bool prepend) {QemuOpt *opt;const QemuOptDesc *desc = opts->list->desc;@@ -626,7 +627,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value) opt =g_malloc0 (sizeof (*opt)); opt->name =g_strdup (name); opt->opts = opts; -QTAILQ_INSERT_TAIL (&opts->head, opt, next); +if (prepend) { +QTAILQ_INSERT_HEAD (&opts->head, opt, next); + }else { +QTAILQ_INSERT_TAIL (&opts->head, opt, next); + }if (desc[i].name !=NULL ) { opt->desc = desc+i; }@@ -640,6 +645,11 @@ int qemu_opt_set(QemuOpts *opts, const char *name, const char *value)return 0 ; } +int qemu_opt_set (QemuOpts *opts,const char *name,const char *value) +{ +return opt_set (opts, name, value, false); +} +int qemu_opt_set_bool (QemuOpts *opts,const char *name,bool val) {QemuOpt *opt;@@ -691,6 +701,9 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id) QTAILQ_FOREACH(opts,&list->head, next) {if (!opts->id) { +if (!id) { +return opts; + }continue ; }if (strcmp (opts->id, id) !=0 ) {@@ -806,7 +819,8 @@ int qemu_opts_print(QemuOpts *opts, void *dummy)return 0 ; } -int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname) +static int opts_do_parse (QemuOpts *opts,const char *params, +const char *firstname,bool prepend) {char option[128 ], value[1024 ];const char *p,*pe,*pc;@@ -841,7 +855,7 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstname }if (strcmp (option,"id" ) !=0 ) {/* store and parse */ -if (qemu_opt_set (opts, option, value) ==-1 ) { +if (opt_set (opts, option, value, prepend) ==-1 ) {return -1 ; } }@@ -852,8 +866,13 @@ int qemu_opts_do_parse(QemuOpts *opts, const char *params, const char *firstnamereturn 0 ; } -QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params, -int permit_abbrev) +int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname) +{ +return opts_do_parse (opts, params, firstname, false); +} + +static QemuOpts *opts_parse (QemuOptsList *list,const char *params, +int permit_abbrev,bool defaults) {const char *firstname;char value[1024 ], *id =NULL ;@@ -870,11 +889,19 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,get_opt_value (value,sizeof (value), p+4 ); id = value; } - opts =qemu_opts_create (list, id,1 ); +if (defaults) { +if (!id&& !QTAILQ_EMPTY (&list->head)) { + opts =qemu_opts_find (list,NULL ); + }else { + opts =qemu_opts_create (list, id,0 ); + } + }else { + opts =qemu_opts_create (list, id,1 ); + }if (opts ==NULL )return NULL ; -if (qemu_opts_do_parse (opts, params, firstname) !=0 ) { +if (opts_do_parse (opts, params, firstname, defaults) !=0 ) {qemu_opts_del (opts);return NULL ; }@@ -882,6 +909,21 @@ QemuOpts *qemu_opts_parse(QemuOptsList *list, const char *params,return opts; } +QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params, +int permit_abbrev) +{ +return opts_parse (list, params, permit_abbrev, false); +} + +void qemu_opts_set_defaults (QemuOptsList *list,const char *params, +int permit_abbrev) +{ +QemuOpts *opts; + + opts =opts_parse (list, params, permit_abbrev, true); +assert (opts); +} +static void qemu_opts_from_qdict_1 (const char *key,QObject *obj,void *opaque) {char buf[32 ];qemu-option.h +2
-0@@ -125,6 +125,8 @@ void qemu_opts_del(QemuOpts *opts);int qemu_opts_validate (QemuOpts *opts,const QemuOptDesc *desc);int qemu_opts_do_parse (QemuOpts *opts,const char *params,const char *firstname);QemuOpts *qemu_opts_parse (QemuOptsList *list,const char *params,int permit_abbrev); +void qemu_opts_set_defaults (QemuOptsList *list,const char *params, +int permit_abbrev);QemuOpts *qemu_opts_from_qdict (QemuOptsList *list,const QDict *qdict);QDict *qemu_opts_to_qdict (QemuOpts *opts,QDict *qdict);