All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages
@ 2018-07-31  2:56 Marek Marczykowski-Górecki
  2018-07-31  2:56 ` [PATCH v2 2/2] xenstore-client: Add option for raw in-/output Marek Marczykowski-Górecki
  2018-07-31  9:02 ` [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Wei Liu
  0 siblings, 2 replies; 4+ messages in thread
From: Marek Marczykowski-Górecki @ 2018-07-31  2:56 UTC (permalink / raw)
  To: xen-devel
  Cc: Wei Liu, Ian Jackson, Marek Marczykowski-Górecki, xen-devel

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
---
Changes in v2:
 - new patch

---
 docs/man/xenstore-read.pod.1  | 28 ++++++++++++++++++++++++++++
 docs/man/xenstore-write.pod.1 | 25 +++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 docs/man/xenstore-read.pod.1
 create mode 100644 docs/man/xenstore-write.pod.1

diff --git a/docs/man/xenstore-read.pod.1 b/docs/man/xenstore-read.pod.1
new file mode 100644
index 0000000000..256d58fb7d
--- /dev/null
+++ b/docs/man/xenstore-read.pod.1
@@ -0,0 +1,28 @@
+=head1 NAME
+
+xenstore-read - read Xenstore values
+
+=head1 SYNOPSIS
+
+B<xenstore-read> [I<OPTION>]... [I<PATH>]...
+
+=head1 DESCRIPTION
+
+Read values of one or more Xenstore I<PATH>s.
+
+=over
+
+=item B<-p>
+
+Prefix value with key name.
+
+=item B<-s>
+
+Connect to the Xenstore daemon using a local socket only.
+
+=back
+
+=head1 BUGS
+
+Send bugs to xen-devel@lists.xen.org, see
+http://wiki.xen.org/xenwiki/ReportingBugs on how to send bug reports.
diff --git a/docs/man/xenstore-write.pod.1 b/docs/man/xenstore-write.pod.1
new file mode 100644
index 0000000000..424ab0e30e
--- /dev/null
+++ b/docs/man/xenstore-write.pod.1
@@ -0,0 +1,25 @@
+=head1 NAME
+
+xenstore-write - write Xenstore values
+
+=head1 SYNOPSIS
+
+B<xenstore-read> [I<OPTION>]... I<PATH> I<VALUE>...
+
+=head1 DESCRIPTION
+
+Write I<VALUE>s to Xenstore I<PATH>s. Multiple pairs I<PATH> I<VALUE> can be
+provided to write them at once - in one Xenstore transaction.
+
+=over
+
+=item B<-s>
+
+Connect to the Xenstore daemon using a local socket only.
+
+=back
+
+=head1 BUGS
+
+Send bugs to xen-devel@lists.xen.org, see
+http://wiki.xen.org/xenwiki/ReportingBugs on how to send bug reports.
-- 
2.17.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] xenstore-client: Add option for raw in-/output
  2018-07-31  2:56 [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Marek Marczykowski-Górecki
@ 2018-07-31  2:56 ` Marek Marczykowski-Górecki
  2018-07-31  9:03   ` Wei Liu
  2018-07-31  9:02 ` [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Wei Liu
  1 sibling, 1 reply; 4+ messages in thread
From: Marek Marczykowski-Górecki @ 2018-07-31  2:56 UTC (permalink / raw)
  To: xen-devel
  Cc: Simon Gaiser, Wei Liu, Ian Jackson,
	Marek Marczykowski-Górecki, xen-devel

From: Simon Gaiser <simon@invisiblethingslab.com>

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 <marmarek@invisiblethingslab.com>
---
Changes in v2:
 - man page entries
 - factor out expand_buffer
---
 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");
@@ -68,6 +74,14 @@ output(const char *fmt, ...) {
     output_pos += len;
 }
 
+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)
 {
@@ -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);
-- 
2.17.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages
  2018-07-31  2:56 [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Marek Marczykowski-Górecki
  2018-07-31  2:56 ` [PATCH v2 2/2] xenstore-client: Add option for raw in-/output Marek Marczykowski-Górecki
@ 2018-07-31  9:02 ` Wei Liu
  1 sibling, 0 replies; 4+ messages in thread
From: Wei Liu @ 2018-07-31  9:02 UTC (permalink / raw)
  To: Marek Marczykowski-Górecki
  Cc: Wei Liu, Ian Jackson, xen-devel, xen-devel

On Tue, Jul 31, 2018 at 04:56:53AM +0200, Marek Marczykowski-Górecki wrote:
> Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

Thanks for doing this!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2 2/2] xenstore-client: Add option for raw in-/output
  2018-07-31  2:56 ` [PATCH v2 2/2] xenstore-client: Add option for raw in-/output Marek Marczykowski-Górecki
@ 2018-07-31  9:03   ` Wei Liu
  0 siblings, 0 replies; 4+ messages in thread
From: Wei Liu @ 2018-07-31  9:03 UTC (permalink / raw)
  To: Marek Marczykowski-Górecki
  Cc: Simon Gaiser, Wei Liu, Ian Jackson, xen-devel, xen-devel

On Tue, Jul 31, 2018 at 04:56:54AM +0200, Marek Marczykowski-Górecki wrote:
> From: Simon Gaiser <simon@invisiblethingslab.com>
> 
> 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 <marmarek@invisiblethingslab.com>

Acked-by: Wei Liu <wei.liu2@citrix.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-07-31  9:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-31  2:56 [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Marek Marczykowski-Górecki
2018-07-31  2:56 ` [PATCH v2 2/2] xenstore-client: Add option for raw in-/output Marek Marczykowski-Górecki
2018-07-31  9:03   ` Wei Liu
2018-07-31  9:02 ` [PATCH v2 1/2] docs: add xenstore-read and xenstore-write man pages Wei Liu

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.