All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@cs.utexas.edu>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 1/2] Escape filenames in monitor
Date: Sat, 16 Dec 2006 15:11:05 -0600	[thread overview]
Message-ID: <458460E9.7040307@cs.utexas.edu> (raw)
In-Reply-To: <45845F3B.30909@cs.utexas.edu>

[-- Attachment #1: Type: text/plain, Size: 519 bytes --]

info block is impossible to parse reliably because there is no escaping 
done on the filename.  A really unfortunately name like "Ugly 
backing_file=foo" would result in:

hda: type=hd removable=0 file=Ugly backing_file=foo ro=0 drv=qcow

Which is ambiguous when compared to a file named "Ugly" with a backing 
file of "foo".  This patch will escape filenames so that this case will 
be printed as:

hda: type=hd removable=0 file=Ugly\ backing_file=foo ro=0 drv=qcow


Which is now parsable.

Regards,

Anthony Liguori

[-- Attachment #2: qemu-monitor-escape.diff --]
[-- Type: text/x-patch, Size: 2441 bytes --]

diff -r 7d5869c61e0d block.c
--- a/block.c	Sat Dec 16 11:50:51 2006 -0600
+++ b/block.c	Sat Dec 16 14:34:22 2006 -0600
@@ -868,9 +868,12 @@ void bdrv_info(void)
             term_printf(" locked=%d", bs->locked);
         }
         if (bs->drv) {
-            term_printf(" file=%s", bs->filename);
-            if (bs->backing_file[0] != '\0')
-                term_printf(" backing_file=%s", bs->backing_file);
+            term_printf(" file=");
+	    term_print_filename(bs->filename);
+            if (bs->backing_file[0] != '\0') {
+                term_printf(" backing_file=");
+		term_print_filename(bs->backing_file);
+	    }
             term_printf(" ro=%d", bs->read_only);
             term_printf(" drv=%s", bs->drv->format_name);
             if (bs->encrypted)
diff -r 7d5869c61e0d monitor.c
--- a/monitor.c	Sat Dec 16 11:50:51 2006 -0600
+++ b/monitor.c	Sat Dec 16 14:34:22 2006 -0600
@@ -104,6 +104,32 @@ void term_printf(const char *fmt, ...)
     va_start(ap, fmt);
     term_vprintf(fmt, ap);
     va_end(ap);
+}
+
+void term_print_filename(const char *filename)
+{
+    int i;
+
+    for (i = 0; filename[i]; i++) {
+	switch (filename[i]) {
+	case ' ':
+	case '"':
+	    term_printf("\\%c", filename[i]);
+	    break;
+	case '\t':
+	    term_printf("\\t");
+	    break;
+	case '\r':
+	    term_printf("\\r");
+	    break;
+	case '\n':
+	    term_printf("\\n");
+	    break;
+	default:
+	    term_printf("%c", filename[i]);
+	    break;
+	}
+    }
 }
 
 static int monitor_fprintf(FILE *stream, const char *fmt, ...)
diff -r 7d5869c61e0d qemu-img.c
--- a/qemu-img.c	Sat Dec 16 11:50:51 2006 -0600
+++ b/qemu-img.c	Sat Dec 16 14:34:22 2006 -0600
@@ -111,6 +111,11 @@ void term_printf(const char *fmt, ...)
     va_start(ap, fmt);
     vprintf(fmt, ap);
     va_end(ap);
+}
+
+void term_print_filename(const char *filename)
+{
+    term_printf(filename);
 }
 
 void __attribute__((noreturn)) error(const char *fmt, ...) 
diff -r 7d5869c61e0d vl.h
--- a/vl.h	Sat Dec 16 11:50:51 2006 -0600
+++ b/vl.h	Sat Dec 16 14:34:22 2006 -0600
@@ -1318,6 +1318,7 @@ void term_puts(const char *str);
 void term_puts(const char *str);
 void term_vprintf(const char *fmt, va_list ap);
 void term_printf(const char *fmt, ...) __attribute__ ((__format__ (__printf__, 1, 2)));
+void term_print_filename(const char *filename);
 void term_flush(void);
 void term_print_help(void);
 void monitor_readline(const char *prompt, int is_password,

  reply	other threads:[~2006-12-16 21:11 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-16 21:03 [Qemu-devel] [PATCH 0/2] Make the monitor a bit more program-friendly Anthony Liguori
2006-12-16 21:11 ` Anthony Liguori [this message]
2006-12-17 15:41   ` [Qemu-devel] [PATCH 1/2] Escape filenames in monitor Julian Seward
2006-12-17 16:36     ` Anthony Liguori
2006-12-16 21:15 ` [Qemu-devel] [PATCH 2/2] Reinitialize monitor upon reconnect Anthony Liguori

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=458460E9.7040307@cs.utexas.edu \
    --to=aliguori@cs.utexas.edu \
    --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.