mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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 <marmarek@invisiblethingslab.com> Acked-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
1 parent
be541e53ad
commit
01dfa3378f
3 files changed
+57
-16
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||