[xen staging] xenstore-client: Add option for raw in-/output

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen staging] xenstore-client: Add option for raw in-/output

patchbot
commit 01dfa3378f915111c5fbc0f188f0cfd2658fe013
Author:     Simon Gaiser <[hidden email]>
AuthorDate: Tue Jul 31 04:56:54 2018 +0200
Commit:     Wei Liu <[hidden email]>
CommitDate: Wed Aug 1 10:24:33 2018 +0100

    xenstore-client: Add option for raw in-/output
   
    Parsing/generating the escape sequences used by xenstore-client is non
    trivial. So make scripting (for use in stubdom) easier by adding a raw
    option.
   
    [added man page entries, facor out expand_buffer]
    Signed-off-by: Marek Marczykowski-Górecki <[hidden email]>
    Acked-by: Wei Liu <[hidden email]>
---
 docs/man/xenstore-read.pod.1     |  4 +++
 docs/man/xenstore-write.pod.1    |  4 +++
 tools/xenstore/xenstore_client.c | 65 ++++++++++++++++++++++++++++++----------
 3 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/docs/man/xenstore-read.pod.1 b/docs/man/xenstore-read.pod.1
index 256d58fb7d..5496de17a8 100644
--- a/docs/man/xenstore-read.pod.1
+++ b/docs/man/xenstore-read.pod.1
@@ -20,6 +20,10 @@ Prefix value with key name.
 
 Connect to the Xenstore daemon using a local socket only.
 
+=item B<-R>
+
+Read raw value, skip escaping non-printable characters (\x..).
+
 =back
 
 =head1 BUGS
diff --git a/docs/man/xenstore-write.pod.1 b/docs/man/xenstore-write.pod.1
index 424ab0e30e..78cbbe1a69 100644
--- a/docs/man/xenstore-write.pod.1
+++ b/docs/man/xenstore-write.pod.1
@@ -17,6 +17,10 @@ provided to write them at once - in one Xenstore transaction.
 
 Connect to the Xenstore daemon using a local socket only.
 
+=item B<-R>
+
+Write raw value, skip parsing escaped characters (\x..).
+
 =back
 
 =head1 BUGS
diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c
index 3d14d37e62..3afc630ab8 100644
--- a/tools/xenstore/xenstore_client.c
+++ b/tools/xenstore/xenstore_client.c
@@ -44,6 +44,17 @@ static struct expanding_buffer ebuf;
 
 static int output_size = 0;
 
+/* make sure there is at least 'len' more space in output_buf */
+static void expand_buffer(size_t len)
+{
+    if (output_pos + len > output_size) {
+        output_size += len + 1024;
+        output_buf = realloc(output_buf, output_size);
+        if (output_buf == NULL)
+            err(1, "malloc");
+    }
+}
+
 static void
 output(const char *fmt, ...) {
     va_list ap;
@@ -55,12 +66,7 @@ output(const char *fmt, ...) {
     if (len < 0)
  err(1, "output");
     va_end(ap);
-    if (len + 1 + output_pos > output_size) {
- output_size += len + 1024;
- output_buf = realloc(output_buf, output_size);
- if (output_buf == NULL)
-    err(1, "malloc");
-    }
+    expand_buffer(len + 1);
     va_start(ap, fmt);
     if (vsnprintf(&output_buf[output_pos], len + 1, fmt, ap) != len)
  err(1, "output");
@@ -69,6 +75,14 @@ output(const char *fmt, ...) {
 }
 
 static void
+output_raw(const char *data, int len)
+{
+    expand_buffer(len);
+    memcpy(&output_buf[output_pos], data, len);
+    output_pos += len;
+}
+
+static void
 usage(enum mode mode, int incl_mode, const char *progname)
 {
     const char *mstr = NULL;
@@ -78,10 +92,10 @@ usage(enum mode mode, int incl_mode, const char *progname)
  errx(1, "Usage: %s <mode> [-h] [...]", progname);
     case MODE_read:
  mstr = incl_mode ? "read " : "";
- errx(1, "Usage: %s %s[-h] [-p] [-s] key [...]", progname, mstr);
+ errx(1, "Usage: %s %s[-h] [-p] [-s] [-R] key [...]", progname, mstr);
     case MODE_write:
  mstr = incl_mode ? "write " : "";
- errx(1, "Usage: %s %s[-h] [-s] key value [...]", progname, mstr);
+ errx(1, "Usage: %s %s[-h] [-s] [-R] key value [...]", progname, mstr);
     case MODE_rm:
  mstr = incl_mode ? "rm " : "";
  errx(1, "Usage: %s %s[-h] [-s] [-t] key [...]", progname, mstr);
@@ -293,7 +307,8 @@ do_watch(struct xs_handle *xsh, int max_events)
 
 static int
 perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh,
-        xs_transaction_t xth, int prefix, int tidy, int upto, int recurse, int nr_watches)
+        xs_transaction_t xth, int prefix, int tidy, int upto, int recurse, int nr_watches,
+        int raw)
 {
     switch (mode) {
     case MODE_ls:
@@ -322,17 +337,27 @@ perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh
             }
             if (prefix)
                 output("%s: ", argv[optind]);
-            output("%s\n", sanitise_value(&ebuf, val, len));
+            if (raw)
+                output_raw(val, len);
+            else
+                output("%s\n", sanitise_value(&ebuf, val, len));
             free(val);
             optind++;
             break;
         }
         case MODE_write: {
             char *val_spec = argv[optind + 1];
+            char *val;
             unsigned len;
-            expanding_buffer_ensure(&ebuf, strlen(val_spec)+1);
-            unsanitise_value(ebuf.buf, &len, val_spec);
-            if (!xs_write(xsh, xth, argv[optind], ebuf.buf, len)) {
+            if (raw) {
+                val = val_spec;
+                len = strlen(val_spec);
+            } else {
+                expanding_buffer_ensure(&ebuf, strlen(val_spec)+1);
+                unsanitise_value(ebuf.buf, &len, val_spec);
+                val = ebuf.buf;
+            }
+            if (!xs_write(xsh, xth, argv[optind], val, len)) {
                 warnx("could not write path %s", argv[optind]);
                 return 1;
             }
@@ -506,6 +531,7 @@ main(int argc, char **argv)
     int recurse = 0;
     int nr_watches = -1;
     int transaction;
+    int raw = 0;
     struct winsize ws;
     enum mode mode;
 
@@ -539,10 +565,11 @@ main(int argc, char **argv)
     {"upto",    0, 0, 'u'}, /* MODE_chmod */
     {"recurse", 0, 0, 'r'}, /* MODE_chmod */
     {"number",  1, 0, 'n'}, /* MODE_watch */
+    {"raw",     0, 0, 'R'}, /* MODE_read || MODE_write */
     {0, 0, 0, 0}
  };
 
- c = getopt_long(argc - switch_argv, argv + switch_argv, "hfspturn:",
+ c = getopt_long(argc - switch_argv, argv + switch_argv, "hfspturn:R",
  long_options, &index);
  if (c == -1)
     break;
@@ -593,6 +620,12 @@ main(int argc, char **argv)
     else
  usage(mode, switch_argv, argv[0]);
     break;
+ case 'R':
+    if ( mode == MODE_read || mode == MODE_write )
+ raw = 1;
+    else
+ usage(mode, switch_argv, argv[0]);
+    break;
  }
     }
 
@@ -646,7 +679,7 @@ again:
     errx(1, "couldn't start transaction");
     }
 
-    ret = perform(mode, optind, argc - switch_argv, argv + switch_argv, xsh, xth, prefix, tidy, upto, recurse, nr_watches);
+    ret = perform(mode, optind, argc - switch_argv, argv + switch_argv, xsh, xth, prefix, tidy, upto, recurse, nr_watches, raw);
 
     if (transaction && !xs_transaction_end(xsh, xth, ret)) {
  if (ret == 0 && errno == EAGAIN) {
@@ -657,7 +690,7 @@ again:
     }
 
     if (output_pos)
- printf("%s", output_buf);
+        fwrite(output_buf, 1, output_pos, stdout);
 
     free(output_buf);
     free(ebuf.buf);
--
generated by git-patchbot for /home/xen/git/xen.git#staging


_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog