Loading qapi-schema.json +15 −1 Original line number Diff line number Diff line Loading @@ -3018,6 +3018,19 @@ ## { 'command': 'nbd-server-stop' } ## # @ChardevFile: # # Configuration info for file chardevs. # # @in: #optional The name of the input file # @out: The name of the output file # # Since: 1.4 ## { 'type': 'ChardevFile', 'data': { '*in' : 'str', 'out' : 'str' } } ## # @ChardevBackend: # Loading @@ -3027,7 +3040,8 @@ ## { 'type': 'ChardevDummy', 'data': { } } { 'union': 'ChardevBackend', 'data': { 'null' : 'ChardevDummy' } } { 'union': 'ChardevBackend', 'data': { 'file' : 'ChardevFile', 'null' : 'ChardevDummy' } } ## # @ChardevReturn: Loading qemu-char.c +61 −0 Original line number Diff line number Diff line Loading @@ -3011,6 +3011,64 @@ QemuOptsList qemu_chardev_opts = { }, }; #ifdef _WIN32 static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp) { HANDLE out; if (file->in) { error_setg(errp, "input file not supported"); return NULL; } out = CreateFile(file->out, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (out == INVALID_HANDLE_VALUE) { error_setg(errp, "open %s failed", file->out); return NULL; } return qemu_chr_open_win_file(out); } #else /* WIN32 */ static int qmp_chardev_open_file_source(char *src, int flags, Error **errp) { int fd = -1; TFR(fd = qemu_open(src, flags, 0666)); if (fd == -1) { error_setg(errp, "open %s: %s", src, strerror(errno)); } return fd; } static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp) { int flags, in = -1, out = -1; flags = O_WRONLY | O_TRUNC | O_CREAT | O_BINARY; out = qmp_chardev_open_file_source(file->out, flags, errp); if (error_is_set(errp)) { return NULL; } if (file->in) { flags = O_RDONLY; in = qmp_chardev_open_file_source(file->in, flags, errp); if (error_is_set(errp)) { qemu_close(out); return NULL; } } return qemu_chr_open_fd(in, out); } #endif /* WIN32 */ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, Error **errp) { Loading @@ -3025,6 +3083,9 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, } switch (backend->kind) { case CHARDEV_BACKEND_KIND_FILE: chr = qmp_chardev_open_file(backend->file, errp); break; case CHARDEV_BACKEND_KIND_NULL: chr = qemu_chr_open_null(NULL); break; Loading qmp-commands.hx +7 −1 Original line number Diff line number Diff line Loading @@ -2672,13 +2672,19 @@ Arguments: - "id": the chardev's ID, must be unique (json-string) - "backend": chardev backend type + parameters Example: Examples: -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", "backend" : { "type" : "null", "data" : {} } } } <- { "return": {} } -> { "execute" : "chardev-add", "arguments" : { "id" : "bar", "backend" : { "type" : "file", "data" : { "out" : "/tmp/bar.log" } } } } <- { "return": {} } EQMP { Loading Loading
qapi-schema.json +15 −1 Original line number Diff line number Diff line Loading @@ -3018,6 +3018,19 @@ ## { 'command': 'nbd-server-stop' } ## # @ChardevFile: # # Configuration info for file chardevs. # # @in: #optional The name of the input file # @out: The name of the output file # # Since: 1.4 ## { 'type': 'ChardevFile', 'data': { '*in' : 'str', 'out' : 'str' } } ## # @ChardevBackend: # Loading @@ -3027,7 +3040,8 @@ ## { 'type': 'ChardevDummy', 'data': { } } { 'union': 'ChardevBackend', 'data': { 'null' : 'ChardevDummy' } } { 'union': 'ChardevBackend', 'data': { 'file' : 'ChardevFile', 'null' : 'ChardevDummy' } } ## # @ChardevReturn: Loading
qemu-char.c +61 −0 Original line number Diff line number Diff line Loading @@ -3011,6 +3011,64 @@ QemuOptsList qemu_chardev_opts = { }, }; #ifdef _WIN32 static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp) { HANDLE out; if (file->in) { error_setg(errp, "input file not supported"); return NULL; } out = CreateFile(file->out, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (out == INVALID_HANDLE_VALUE) { error_setg(errp, "open %s failed", file->out); return NULL; } return qemu_chr_open_win_file(out); } #else /* WIN32 */ static int qmp_chardev_open_file_source(char *src, int flags, Error **errp) { int fd = -1; TFR(fd = qemu_open(src, flags, 0666)); if (fd == -1) { error_setg(errp, "open %s: %s", src, strerror(errno)); } return fd; } static CharDriverState *qmp_chardev_open_file(ChardevFile *file, Error **errp) { int flags, in = -1, out = -1; flags = O_WRONLY | O_TRUNC | O_CREAT | O_BINARY; out = qmp_chardev_open_file_source(file->out, flags, errp); if (error_is_set(errp)) { return NULL; } if (file->in) { flags = O_RDONLY; in = qmp_chardev_open_file_source(file->in, flags, errp); if (error_is_set(errp)) { qemu_close(out); return NULL; } } return qemu_chr_open_fd(in, out); } #endif /* WIN32 */ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, Error **errp) { Loading @@ -3025,6 +3083,9 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend, } switch (backend->kind) { case CHARDEV_BACKEND_KIND_FILE: chr = qmp_chardev_open_file(backend->file, errp); break; case CHARDEV_BACKEND_KIND_NULL: chr = qemu_chr_open_null(NULL); break; Loading
qmp-commands.hx +7 −1 Original line number Diff line number Diff line Loading @@ -2672,13 +2672,19 @@ Arguments: - "id": the chardev's ID, must be unique (json-string) - "backend": chardev backend type + parameters Example: Examples: -> { "execute" : "chardev-add", "arguments" : { "id" : "foo", "backend" : { "type" : "null", "data" : {} } } } <- { "return": {} } -> { "execute" : "chardev-add", "arguments" : { "id" : "bar", "backend" : { "type" : "file", "data" : { "out" : "/tmp/bar.log" } } } } <- { "return": {} } EQMP { Loading