Hi On Mon, Oct 23, 2017 at 5:13 PM, Vadim Galitsyn < vadim.galit...@profitbricks.com> wrote:
> Add support for `writeconfig' command for QMP monitor. > This is a simple way to keep track of current state of VM > after series of hotplugs and/or hotunplugs of different devices. > > Signed-off-by: Vadim Galitsyn <vadim.galit...@profitbricks.com> > Signed-off-by: Eduardo Otubo <eduardo.ot...@profitbricks.com> > Cc: Markus Armbruster <arm...@redhat.com> > Cc: Eric Blake <ebl...@redhat.com> > Cc: qemu-devel@nongnu.org > --- > qapi-schema.json | 18 ++++++++++++++++++ > qmp.c | 21 +++++++++++++++++++++ > 2 files changed, 39 insertions(+) > > diff --git a/qapi-schema.json b/qapi-schema.json > index a9dd043f65..083f8f3258 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -3200,3 +3200,21 @@ > # Since: 2.11 > ## > { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} > } > + > +## > +# @writeconfig: > +# > +# Dump current configuration into specified file > +# > +# @file: pathname of a file to store current configuration > +# > +# Since: 2.11 > +# > +# Example: > +# > +# -> { "execute": "writeconfig", > +# "arguments": { "file": "/tmp/qemu.conf" } } > +# <- { "return": {} } > +# > +## > +{ 'command': 'writeconfig', 'data': {'file': 'str'} } > diff --git a/qmp.c b/qmp.c > index e8c303116a..fcb911cabb 100644 > --- a/qmp.c > +++ b/qmp.c > @@ -722,3 +722,24 @@ MemoryInfo *qmp_query_memory_size_summary(Error > **errp) > > return mem_info; > } > + > +void qmp_writeconfig(const char *file, Error **errp) > +{ > + int fd; > + FILE *fp; > + > + fd = qemu_open(file, O_WRONLY | O_CREAT | O_TRUNC, 0600); > + if (fd != -1) { > + > + fp = fdopen(fd, "wb"); > + if (fp) { > + qemu_config_write(fp); > + fclose(fp); > If you use /dev/fdset, this will close the underlying file, but not remove the file from the fdset. Dup it or remove it with monitor_fdset_dup_fd_remove() etc? + return; > + } > + > + qemu_close(fd); > But this will close & remove it from fdset (when the operation failed) Whatever we do, I think it make sense to document the behaviour. > + } > + > + error_setg(errp, "cannot write configuration file: '%s'", file); > +} > -- > 2.13.1.394.g41dd433 > > > -- Marc-André Lureau