All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com
Subject: [Qemu-devel] [PATCH 16/21] qemu-char: convert stdio backend to data-driven creation
Date: Mon, 12 Oct 2015 10:03:19 +0200	[thread overview]
Message-ID: <1444637004-20195-17-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1444637004-20195-1-git-send-email-pbonzini@redhat.com>

The backend now always returns errors via the Error* argument.
This avoids a double error message.  Before:

    qemu-system-x86_64: -chardev stdio,id=base: cannot use stdio with -daemonize
    qemu-system-x86_64: -chardev stdio,id=base: Failed to create chardev

After:

    qemu-system-x86_64: -chardev stdio,id=base: cannot use stdio with -daemonize

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qemu-char.c | 57 +++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 18 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index 72658d2..74ca66d 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -1168,19 +1168,23 @@ static void qemu_chr_close_stdio(struct CharDriverState *chr)
     fd_chr_close(chr);
 }
 
-static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
+static CharDriverState *qemu_chr_open_stdio(const char *id,
+                                            ChardevBackend *backend,
+                                            ChardevReturn *ret,
+                                            Error **errp)
 {
+    ChardevStdio *opts = backend->stdio;
     CharDriverState *chr;
     struct sigaction act;
 
     if (is_daemonized()) {
-        error_report("cannot use stdio with -daemonize");
+        error_setg(errp, "cannot use stdio with -daemonize");
         return NULL;
     }
 
     if (stdio_in_use) {
-        error_report("cannot use stdio by multiple character devices");
-        exit(1);
+        error_setg(errp, "cannot use stdio by multiple character devices");
+        return NULL;
     }
 
     stdio_in_use = true;
@@ -2341,7 +2345,10 @@ static void win_stdio_close(CharDriverState *chr)
     g_free(chr);
 }
 
-static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
+static CharDriverState *qemu_chr_open_stdio(const char *id,
+                                            ChardevBackend *backend,
+                                            ChardevReturn *ret,
+                                            Error **errp)
 {
     CharDriverState   *chr;
     WinStdioCharState *stdio;
@@ -2353,8 +2360,8 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
 
     stdio->hStdIn = GetStdHandle(STD_INPUT_HANDLE);
     if (stdio->hStdIn == INVALID_HANDLE_VALUE) {
-        fprintf(stderr, "cannot open stdio: invalid handle\n");
-        exit(1);
+        error_setg(errp, "cannot open stdio: invalid handle");
+        return NULL;
     }
 
     is_console = GetConsoleMode(stdio->hStdIn, &dwMode) != 0;
@@ -2366,25 +2373,30 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
     if (is_console) {
         if (qemu_add_wait_object(stdio->hStdIn,
                                  win_stdio_wait_func, chr)) {
-            fprintf(stderr, "qemu_add_wait_object: failed\n");
+            error_setg(errp, "qemu_add_wait_object: failed");
+            goto err1;
         }
     } else {
         DWORD   dwId;
             
         stdio->hInputReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
         stdio->hInputDoneEvent  = CreateEvent(NULL, FALSE, FALSE, NULL);
-        stdio->hInputThread     = CreateThread(NULL, 0, win_stdio_thread,
-                                               chr, 0, &dwId);
-
-        if (stdio->hInputThread == INVALID_HANDLE_VALUE
-            || stdio->hInputReadyEvent == INVALID_HANDLE_VALUE
+        if (stdio->hInputReadyEvent == INVALID_HANDLE_VALUE
             || stdio->hInputDoneEvent == INVALID_HANDLE_VALUE) {
-            fprintf(stderr, "cannot create stdio thread or event\n");
-            exit(1);
+            error_setg(errp, "cannot create event");
+            goto err2;
         }
         if (qemu_add_wait_object(stdio->hInputReadyEvent,
                                  win_stdio_thread_wait_func, chr)) {
-            fprintf(stderr, "qemu_add_wait_object: failed\n");
+            error_setg(errp, "qemu_add_wait_object: failed");
+            goto err2;
+        }
+        stdio->hInputThread     = CreateThread(NULL, 0, win_stdio_thread,
+                                               chr, 0, &dwId);
+
+        if (stdio->hInputThread == INVALID_HANDLE_VALUE) {
+            error_setg(errp, "cannot create stdio thread");
+            goto err3;
         }
     }
 
@@ -2402,6 +2414,15 @@ static CharDriverState *qemu_chr_open_stdio(ChardevStdio *opts)
     qemu_chr_fe_set_echo(chr, false);
 
     return chr;
+
+err3:
+    qemu_del_wait_object(stdio->hInputReadyEvent, NULL, NULL);
+err2:
+    CloseHandle(stdio->hInputReadyEvent);
+    CloseHandle(stdio->hInputDoneEvent);
+err1:
+    qemu_del_wait_object(stdio->hStdIn, NULL, NULL);
+    return NULL;
 }
 #endif /* !_WIN32 */
 
@@ -4330,7 +4351,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
             abort();
             break;
         case CHARDEV_BACKEND_KIND_STDIO:
-            chr = qemu_chr_open_stdio(backend->stdio);
+            abort();
             break;
 #ifdef _WIN32
         case CHARDEV_BACKEND_KIND_CONSOLE:
@@ -4420,7 +4441,7 @@ static void register_types(void)
     register_char_driver("file", CHARDEV_BACKEND_KIND_FILE,
                          qemu_chr_parse_file_out, qmp_chardev_open_file);
     register_char_driver("stdio", CHARDEV_BACKEND_KIND_STDIO,
-                         qemu_chr_parse_stdio, NULL);
+                         qemu_chr_parse_stdio, qemu_chr_open_stdio);
 #if defined HAVE_CHARDEV_SERIAL
     register_char_driver("serial", CHARDEV_BACKEND_KIND_SERIAL,
                          qemu_chr_parse_serial, qmp_chardev_open_serial);
-- 
2.5.0

  parent reply	other threads:[~2015-10-12  8:03 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-12  8:03 [Qemu-devel] [PATCH 00/22] qemu-char: refactoring of chardev creation Paolo Bonzini
2015-10-12  8:03 ` [Qemu-devel] [PATCH 01/21] qemu-char: cleanup qmp_chardev_add Paolo Bonzini
2015-10-12 14:55   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 02/21] qemu-char: cleanup HAVE_CHARDEV_* Paolo Bonzini
2015-10-12 14:57   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 03/21] qemu-char: add create to register_char_driver Paolo Bonzini
2015-10-12 15:04   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 04/21] qemu-char: convert file backend to data-driven creation Paolo Bonzini
2015-10-12 15:06   ` Eric Blake
2015-10-12 15:17     ` Paolo Bonzini
2015-10-12  8:03 ` [Qemu-devel] [PATCH 05/21] qemu-char: convert serial " Paolo Bonzini
2015-10-12 15:09   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 06/21] qemu-char: convert parallel " Paolo Bonzini
2015-10-12 15:13   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 07/21] qemu-char: convert pipe " Paolo Bonzini
2015-10-12 15:16   ` Eric Blake
2015-10-12 15:18     ` Paolo Bonzini
2015-10-12 15:21       ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 08/21] qemu-char: convert socket " Paolo Bonzini
2015-10-12 15:20   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 09/21] qemu-char: convert UDP " Paolo Bonzini
2015-10-12 15:22   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 10/21] qemu-char: convert pty " Paolo Bonzini
2015-10-12 15:22   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 11/21] qemu-char: convert null " Paolo Bonzini
2015-10-12 15:23   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 12/21] qemu-char: convert mux " Paolo Bonzini
2015-10-12 15:24   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 13/21] qemu-char: convert msmouse " Paolo Bonzini
2015-10-12 15:25   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 14/21] qemu-char: convert braille " Paolo Bonzini
2015-10-12 15:30   ` Eric Blake
2015-10-12 15:41     ` Samuel Thibault
2015-10-14 15:51       ` Paolo Bonzini
2015-10-14 15:55         ` Eric Blake
2015-10-14 16:34         ` Samuel Thibault
2015-10-14 16:51           ` Paolo Bonzini
2015-10-12  8:03 ` [Qemu-devel] [PATCH 15/21] qemu-char: convert testdev " Paolo Bonzini
2015-10-12 15:49   ` Eric Blake
2015-10-12  8:03 ` Paolo Bonzini [this message]
2015-10-12 15:50   ` [Qemu-devel] [PATCH 16/21] qemu-char: convert stdio " Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 17/21] qemu-char: convert console " Paolo Bonzini
2015-10-12 15:50   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 18/21] qemu-char: convert spice " Paolo Bonzini
2015-10-12 15:51   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 19/21] qemu-char: convert vc " Paolo Bonzini
2015-10-12 15:53   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 20/21] qemu-char: convert ringbuf " Paolo Bonzini
2015-10-12 15:53   ` Eric Blake
2015-10-12  8:03 ` [Qemu-devel] [PATCH 21/21] qemu-char: cleanup after completed conversion to cd->create Paolo Bonzini
2015-10-12 15:55   ` Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1444637004-20195-17-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=armbru@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.