This part takes care of backends "file", "pipe", "pty" and "stdio".
Unlike many other backends, these leave open error reporting to their
caller.  Because the caller doesn't know what went wrong, this results
in a pretty useless error message.

Change them to report their errors.  Improves comically user-hostile
messages like this one for "-chardev file,id=foo,path=/x"

    chardev: opening backend "file" failed

to

    qemu-system-x86_64: -chardev file,id=foo,path=/x: Can't create file '/x': 
Permission denied
    chardev: opening backend "file" failed

The useless "opening backend failed" message will be cleaned up
shortly.

Signed-off-by: Markus Armbruster <arm...@redhat.com>
---
 qemu-char.c |   19 +++++++++++++++----
 1 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index d591f70..47bab4f 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -636,11 +636,18 @@ static CharDriverState *qemu_chr_open_fd(int fd_in, int 
fd_out)
 
 static CharDriverState *qemu_chr_open_file_out(QemuOpts *opts)
 {
+    const char *filename = qemu_opt_get(opts, "path");
     int fd_out;
 
-    TFR(fd_out = qemu_open(qemu_opt_get(opts, "path"),
-                      O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666));
+    if (!filename) {
+        error_report("file character device requires parameter path");
+        return NULL;
+    }
+
+    TFR(fd_out = qemu_open(filename,
+                           O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666));
     if (fd_out < 0) {
+        error_report("Can't create file '%s': %s", filename, strerror(errno));
         return NULL;
     }
     return qemu_chr_open_fd(-1, fd_out);
@@ -653,7 +660,7 @@ static CharDriverState *qemu_chr_open_pipe(QemuOpts *opts)
     const char *filename = qemu_opt_get(opts, "path");
 
     if (filename == NULL) {
-        fprintf(stderr, "chardev: pipe: no filename given\n");
+        error_report("pipe character device requires parameter path");
         return NULL;
     }
 
@@ -668,6 +675,8 @@ static CharDriverState *qemu_chr_open_pipe(QemuOpts *opts)
            close(fd_out);
         TFR(fd_in = fd_out = qemu_open(filename, O_RDWR | O_BINARY));
         if (fd_in < 0) {
+            error_report("Can't create pipe '%s': %s",
+                         filename, strerror(errno));
             return NULL;
         }
     }
@@ -767,6 +776,7 @@ static CharDriverState *qemu_chr_open_stdio(QemuOpts *opts)
     CharDriverState *chr;
 
     if (stdio_nb_clients >= STDIO_MAX_CLIENTS) {
+        error_report("Too many stdio devices");
         return NULL;
     }
     if (stdio_nb_clients == 0) {
@@ -987,6 +997,7 @@ static CharDriverState *qemu_chr_open_pty(QemuOpts *opts)
 #endif
 
     if (openpty(&master_fd, &slave_fd, pty_name, NULL, NULL) < 0) {
+        error_report("Can't open pty: %s", strerror(errno));
         return NULL;
     }
 
@@ -1002,7 +1013,7 @@ static CharDriverState *qemu_chr_open_pty(QemuOpts *opts)
     chr->filename = g_malloc(len);
     snprintf(chr->filename, len, "pty:%s", q_ptsname(master_fd));
     qemu_opt_set(opts, "path", q_ptsname(master_fd));
-    fprintf(stderr, "char device redirected to %s\n", q_ptsname(master_fd));
+    error_printf("char device redirected to %s\n", q_ptsname(master_fd));
 
     s = g_malloc0(sizeof(PtyCharDriver));
     chr->opaque = s;
-- 
1.7.6.5


Reply via email to