[PATCH v2 6/8] tools/xs-clients: don't exit with error when using -h parameter

Juergen Gross posted 8 patches 1 week, 4 days ago
[PATCH v2 6/8] tools/xs-clients: don't exit with error when using -h parameter
Posted by Juergen Gross 1 week, 4 days ago
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
Re: [PATCH v2 6/8] tools/xs-clients: don't exit with error when using -h parameter
Posted by Andrew Cooper 1 week, 4 days ago
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

Re: [PATCH v2 6/8] tools/xs-clients: don't exit with error when using -h parameter
Posted by Juergen Gross 1 week, 4 days ago
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