chiark / gitweb /
@@ -10,6 +10,15 @@
[userv.git] / client.c
index f7bc9a4928965e4a90d984194e8e4878e6097d54..c6b259bbd899c73046766ab8a1e33a572efe5ba5 100644 (file)
--- a/client.c
+++ b/client.c
@@ -284,7 +284,7 @@ static void getprogress(struct progress_msg *progress_r, FILE *file) {
       for (i=0; i<progress_r->data.errmsg.messagelen; i++) {
        c= working_getc(file);
        if (c==EOF) protoreaderror(file,"in error message");
-       if (isprint(c)) putc(c,stderr);
+       if (ISCHAR(isprint,c)) putc(c,stderr);
        else fprintf(stderr,"\\x%02x",(unsigned char)c);
       }
       putc('\n',stderr);
@@ -415,7 +415,7 @@ struct optioninfo {
   optionfunction *fn;
 };
 
-static void usage(void) {
+static void usage(FILE *stream) {
   if (fputs(
     "usage: userv <options> [--] <service-user> <service-name> [<argument> ...]\n"
     "usage: userv <options> -B|--builtin [--] <builtin-service> [<info-argument> ...]\n"
@@ -424,7 +424,7 @@ static void usage(void) {
     "         -t|--timeout <seconds>\n"
     "         -S|--signals <status>|number|number-nocore|highbit|stdout\n"
     "         -w|--fdwait <fd>=wait|nowait|close\n"
-    "         -P|--sigpipe  -H|--hidecwd  -h|--help  --copyright\n"
+    "         -P|--sigpipe  -H|--hidecwd  -h|--help|--version  --copyright\n"
     "         --override <configuration-data> } available only\n"
     "         --override-file <filename>      }  to root\n"
     "         --spoof-user <username>         }  or same user\n"
@@ -434,8 +434,8 @@ static void usage(void) {
     "         for help, type `userv -B help'; remember to quote multi-word X\n"
     "userv and uservd version " VERSION VEREXT "; copyright (C)1996-1999 Ian Jackson.\n"
     "there is NO WARRANTY; type `userv --copyright' for details.\n",
-            stderr) < 0)
-    syscallerror("write usage to stderr");
+            stream) < 0)
+    syscallerror("write usage message");
 }
 
 static void NONRETURNPRINTFFORMAT(1,2) usageerror(const char *fmt, ...) {
@@ -444,7 +444,7 @@ static void NONRETURNPRINTFFORMAT(1,2) usageerror(const char *fmt, ...) {
   fputs("userv: ",stderr);
   vfprintf(stderr,fmt,al);
   fputs("\n\n",stderr);
-  usage();
+  usage(stderr);
   exit(-1);
 }
 
@@ -671,7 +671,14 @@ static void of_hidecwd(const struct optioninfo *oip, const char *value, char *ke
 }
 
 static void of_help(const struct optioninfo *oip, const char *value, char *key) {
-  usage();
+  usage(stdout);
+  if (fclose(stdout)) syscallerror("fclose stdout after writing usage message");
+  exit(0);
+}
+
+static void of_version(const struct optioninfo *oip, const char *value, char *key) {
+  if (puts(VERSION VEREXT) == EOF || fclose(stdout))
+    syscallerror("write version number");
   exit(0);
 }
 
@@ -724,6 +731,7 @@ const struct optioninfo optioninfos[]= {
   { 'H', "hidecwd",       0, of_hidecwd      },
   { 'B', "builtin",       0, of_builtin      },
   { 'h', "help",          0, of_help         },
+  {  0,  "version",       0, of_version      },
   {  0,  "copyright",     0, of_copyright    },
   {  0,  "override",      1, of_override     },
   {  0,  "override-file", 1, of_overridefile },
@@ -858,7 +866,7 @@ static void determine_users(void) {
   }
   if (!loginname) {
     pw= getpwuid(myuid); if (!pw) miscerror("cannot determine your login name");
-    loginname= pw->pw_name;
+    loginname= xstrsave(pw->pw_name);
   }
 
   if (!strcmp(serviceuser,"-")) serviceuser= loginname;