Failure by qemu to open a default config file isn't cause to error exit -- it just quietly continues on. After puzzling issues with otherwise opaque config file locations and startup handling numerous times, some help from qemu seemed justified.
In the case of a "?" pseudo filename arg to -readconfig, verbose open of all config files will be enabled. Normal handling of config files is otherwise unaffected by this option. Note: other CLI flag schemes have been discussed at length to accommodate this option. However given the constraints of the existing user interface, a solution which minimally impacts the user is ultimately required. Signed-off-by: john cooper <john.coo...@redhat.com> --- diff --git a/qemu-config.c b/qemu-config.c index 5d7ffa2..b39b8fe 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -666,21 +666,29 @@ out: return res; } -int qemu_read_config_file(const char *filename) +/* attempt to open and parse config file, report problems if vflag + */ +int qemu_read_config_file(const char *filename, int vflag) { FILE *f = fopen(filename, "r"); - int ret; + int rv = 0; + const char *err; if (f == NULL) { - return -errno; + rv = -errno; + err = "open"; + } else if (qemu_config_parse(f, vm_config_groups, filename) != 0) { + rv = -EINVAL; + err = "parse"; + } else if (vflag) { + fprintf(stderr, "parsed config file %s\n", filename); } - - ret = qemu_config_parse(f, vm_config_groups, filename); - fclose(f); - - if (ret == 0) { - return 0; - } else { - return -EINVAL; + if (f) { + fclose(f); + } + if (rv && vflag) { + fprintf(stderr, "can't %s config file %s: %s\n", + err, filename, strerror(-rv)); } + return rv; } diff --git a/qemu-config.h b/qemu-config.h index 20d707f..b90a7cc 100644 --- a/qemu-config.h +++ b/qemu-config.h @@ -14,6 +14,6 @@ void qemu_add_globals(void); void qemu_config_write(FILE *fp); int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname); -int qemu_read_config_file(const char *filename); +int qemu_read_config_file(const char *filename, int vflag); #endif /* QEMU_CONFIG_H */ diff --git a/vl.c b/vl.c index b362871..65b0791 100644 --- a/vl.c +++ b/vl.c @@ -2059,6 +2059,7 @@ int main(int argc, char **argv, char **envp) int show_vnc_port = 0; #endif int defconfig = 1; + int defconfig_verbose = 0; const char *trace_file = NULL; atexit(qemu_run_exit_notifiers); @@ -2108,6 +2109,12 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_nodefconfig: defconfig=0; break; + case QEMU_OPTION_readconfig: + /* pseudo filename "?" enables verbose config file handling */ + if (!strcmp(optarg, "?")) { + defconfig_verbose = 1; + } + break; } } } @@ -2115,12 +2122,13 @@ int main(int argc, char **argv, char **envp) if (defconfig) { int ret; - ret = qemu_read_config_file(CONFIG_QEMU_CONFDIR "/qemu.conf"); + ret = qemu_read_config_file(CONFIG_QEMU_CONFDIR "/qemu.conf", + defconfig_verbose); if (ret < 0 && ret != -ENOENT) { exit(1); } - ret = qemu_read_config_file(arch_config_name); + ret = qemu_read_config_file(arch_config_name, defconfig_verbose); if (ret < 0 && ret != -ENOENT) { exit(1); } @@ -2857,11 +2865,9 @@ int main(int argc, char **argv, char **envp) #endif case QEMU_OPTION_readconfig: { - int ret = qemu_read_config_file(optarg); - if (ret < 0) { - fprintf(stderr, "read config %s: %s\n", optarg, - strerror(-ret)); - exit(1); + if (strcmp(optarg, "?") && + qemu_read_config_file(optarg, defconfig_verbose) < 0) { + exit(1); } break; } -- john.coo...@redhat.com