The "-h" parameter of the xenstore-* programs is explicitly meant to
show the usage information of the programs. This use case should not
result in an error of the program's exit code.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
V2:
- new patch
---
tools/xs-clients/xenstore_client.c | 40 +++++++++++++++---------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/tools/xs-clients/xenstore_client.c b/tools/xs-clients/xenstore_client.c
index a104cf6487..1794451d43 100644
--- a/tools/xs-clients/xenstore_client.c
+++ b/tools/xs-clients/xenstore_client.c
@@ -214,37 +214,37 @@ output_raw(const char *data, int len)
}
static void
-usage(enum mode mode, int incl_mode, const char *progname)
+usage(int eval, enum mode mode, int incl_mode, const char *progname)
{
const char *mstr = NULL;
switch (mode) {
case MODE_unknown:
- errx(1, "Usage: %s <mode> [-h] [...]", progname);
+ errx(eval, "Usage: %s <mode> [-h] [...]", progname);
case MODE_read:
mstr = incl_mode ? "read " : "";
- errx(1, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
case MODE_write:
mstr = incl_mode ? "write " : "";
- errx(1, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
case MODE_rm:
mstr = incl_mode ? "rm " : "";
- errx(1, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
case MODE_exists:
mstr = incl_mode ? "exists " : "";
/* fallthrough */
case MODE_list:
mstr = mstr ? : incl_mode ? "list " : "";
- errx(1, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
case MODE_ls:
mstr = mstr ? : incl_mode ? "ls " : "";
- errx(1, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
case MODE_chmod:
mstr = incl_mode ? "chmod " : "";
- errx(1, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
case MODE_watch:
mstr = incl_mode ? "watch " : "";
- errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
+ errx(eval, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
}
}
@@ -685,7 +685,7 @@ main(int argc, char **argv)
command = command + strlen("xenstore-");
}
else if (argc < 2)
- usage(MODE_unknown, 0, argv[0]);
+ usage(1, MODE_unknown, 0, argv[0]);
else
{
command = argv[1];
@@ -715,7 +715,7 @@ main(int argc, char **argv)
switch (c) {
case 'h':
- usage(mode, switch_argv, argv[0]);
+ usage(0, mode, switch_argv, argv[0]);
/* NOTREACHED */
case 'f':
if ( mode == MODE_ls ) {
@@ -723,44 +723,44 @@ main(int argc, char **argv)
desired_width = 0;
show_whole_path = 1;
} else {
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
}
break;
case 'p':
if ( mode == MODE_read || mode == MODE_list || mode == MODE_ls )
prefix = 1;
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
case 't':
if ( mode == MODE_rm )
tidy = 1;
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
case 'u':
if ( mode == MODE_chmod )
upto = 1;
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
case 'r':
if ( mode == MODE_chmod )
recurse = 1;
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
case 'n':
if ( mode == MODE_watch )
nr_watches = atoi(optarg);
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
case 'R':
if ( mode == MODE_read || mode == MODE_write )
raw = 1;
else
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
break;
}
}
@@ -770,13 +770,13 @@ main(int argc, char **argv)
break;
case MODE_write:
if ((argc - switch_argv - optind) % 2 == 1) {
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
/* NOTREACHED */
}
/* DROP-THRU */
default:
if (optind == argc - switch_argv) {
- usage(mode, switch_argv, argv[0]);
+ usage(1, mode, switch_argv, argv[0]);
/* NOTREACHED */
}
}
--
2.53.0
On 12/03/2026 3:51 pm, Juergen Gross wrote:
> diff --git a/tools/xs-clients/xenstore_client.c b/tools/xs-clients/xenstore_client.c
> index a104cf6487..1794451d43 100644
> --- a/tools/xs-clients/xenstore_client.c
> +++ b/tools/xs-clients/xenstore_client.c
> @@ -214,37 +214,37 @@ output_raw(const char *data, int len)
> }
>
> static void
> -usage(enum mode mode, int incl_mode, const char *progname)
> +usage(int eval, enum mode mode, int incl_mode, const char *progname)
> {
> const char *mstr = NULL;
>
> switch (mode) {
> case MODE_unknown:
> - errx(1, "Usage: %s <mode> [-h] [...]", progname);
> + errx(eval, "Usage: %s <mode> [-h] [...]", progname);
> case MODE_read:
> mstr = incl_mode ? "read " : "";
> - errx(1, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
> case MODE_write:
> mstr = incl_mode ? "write " : "";
> - errx(1, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
> case MODE_rm:
> mstr = incl_mode ? "rm " : "";
> - errx(1, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
> case MODE_exists:
> mstr = incl_mode ? "exists " : "";
> /* fallthrough */
> case MODE_list:
> mstr = mstr ? : incl_mode ? "list " : "";
> - errx(1, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
> case MODE_ls:
> mstr = mstr ? : incl_mode ? "ls " : "";
> - errx(1, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
> case MODE_chmod:
> mstr = incl_mode ? "chmod " : "";
> - errx(1, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
> case MODE_watch:
> mstr = incl_mode ? "watch " : "";
> - errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
> + errx(eval, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
> }
> }
I'd not even spotted this, but I agree it wants fixing. Could I
possibly talk you into naming the parameter err_val, seeing as eval
commonly means something very different.
~Andrew
On 12.03.26 17:00, Andrew Cooper wrote:
> On 12/03/2026 3:51 pm, Juergen Gross wrote:
>> diff --git a/tools/xs-clients/xenstore_client.c b/tools/xs-clients/xenstore_client.c
>> index a104cf6487..1794451d43 100644
>> --- a/tools/xs-clients/xenstore_client.c
>> +++ b/tools/xs-clients/xenstore_client.c
>> @@ -214,37 +214,37 @@ output_raw(const char *data, int len)
>> }
>>
>> static void
>> -usage(enum mode mode, int incl_mode, const char *progname)
>> +usage(int eval, enum mode mode, int incl_mode, const char *progname)
>> {
>> const char *mstr = NULL;
>>
>> switch (mode) {
>> case MODE_unknown:
>> - errx(1, "Usage: %s <mode> [-h] [...]", progname);
>> + errx(eval, "Usage: %s <mode> [-h] [...]", progname);
>> case MODE_read:
>> mstr = incl_mode ? "read " : "";
>> - errx(1, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-p] [-R] key [...]", progname, mstr);
>> case MODE_write:
>> mstr = incl_mode ? "write " : "";
>> - errx(1, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-R] key value [...]", progname, mstr);
>> case MODE_rm:
>> mstr = incl_mode ? "rm " : "";
>> - errx(1, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-t] key [...]", progname, mstr);
>> case MODE_exists:
>> mstr = incl_mode ? "exists " : "";
>> /* fallthrough */
>> case MODE_list:
>> mstr = mstr ? : incl_mode ? "list " : "";
>> - errx(1, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-p] key [...]", progname, mstr);
>> case MODE_ls:
>> mstr = mstr ? : incl_mode ? "ls " : "";
>> - errx(1, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-f] [-p] [path]", progname, mstr);
>> case MODE_chmod:
>> mstr = incl_mode ? "chmod " : "";
>> - errx(1, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-u] [-r] key <mode [modes...]>", progname, mstr);
>> case MODE_watch:
>> mstr = incl_mode ? "watch " : "";
>> - errx(1, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
>> + errx(eval, "Usage: %s %s[-h] [-n NR] key", progname, mstr);
>> }
>> }
>
> I'd not even spotted this, but I agree it wants fixing. Could I
> possibly talk you into naming the parameter err_val, seeing as eval
> commonly means something very different.
I took the parameter name from the errx() man page (I believe "eval" is an
abbreviation of "exit-value").
I'm fine renaming it, though.
Juergen
© 2016 - 2026 Red Hat, Inc.