chiark / gitweb /
Call it beta.
[userv.git] / client.c
index 243a333c5fe29af9a7e9528e813dce02fd68c070..740aac54e44ecd357b2e21a61b58f82ab22b71b4 100644 (file)
--- a/client.c
+++ b/client.c
@@ -2,7 +2,7 @@
  * userv - client.c
  * client code
  *
  * userv - client.c
  * client code
  *
- * Copyright (C)1996-1997 Ian Jackson
+ * Copyright (C)1996-1997,1999 Ian Jackson
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by
@@ -128,7 +128,7 @@ static uid_t myuid, spoofuid;
 static gid_t mygid, spoofgid, *gidarray;
 static int ngids;
 static struct opening_msg opening_mbuf;
 static gid_t mygid, spoofgid, *gidarray;
 static int ngids;
 static struct opening_msg opening_mbuf;
-static const char *logname;
+static const char *loginname;
 static char *cwdbuf;
 static size_t cwdbufsize;
 static char *ovbuf;
 static char *cwdbuf;
 static size_t cwdbufsize;
 static char *ovbuf;
@@ -436,8 +436,10 @@ static void usage(void) {
     "         --override-file <filename>      }  to root\n"
     "         --spoof-user <username>         }  or same user\n"
     "fdmodifiers:            read    write  overwrite    trunc[ate]\n"
     "         --override-file <filename>      }  to root\n"
     "         --spoof-user <username>         }  or same user\n"
     "fdmodifiers:            read    write  overwrite    trunc[ate]\n"
-    "(separate with commas)  append  sync   excl[usive]  creat[e]  fd\n\n"
-    "userv and uservd version " VERSION VEREXT "; copyright (C)1996-1997 Ian Jackson.\n"
+    "(separate with commas)  append  sync   excl[usive]  creat[e]  fd\n"
+    "userv -B 'X' ... is same as userv --override 'execute-builtin X' - 'X' ...\n"
+    "         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");
     "there is NO WARRANTY; type `userv --copyright' for details.\n",
             stderr) < 0)
     syscallerror("write usage to stderr");
@@ -682,7 +684,7 @@ static void of_help(const struct optioninfo *oip, const char *value, char *key)
 
 static void of_copyright(const struct optioninfo *oip, const char *value, char *key) {
   if (fputs(
 
 static void of_copyright(const struct optioninfo *oip, const char *value, char *key) {
   if (fputs(
-" userv - user service daemon and client; copyright (C)1996-1997 Ian Jackson\n\n"
+" userv - user service daemon and client; copyright (C)1996-1999 Ian Jackson\n\n"
 " This is free software; you can redistribute it and/or modify it under the\n"
 " terms of the GNU General Public License as published by the Free Software\n"
 " Foundation; either version 2 of the License, or (at your option) any\n"
 " This is free software; you can redistribute it and/or modify it under the\n"
 " terms of the GNU General Public License as published by the Free Software\n"
 " Foundation; either version 2 of the License, or (at your option) any\n"
@@ -855,18 +857,18 @@ static void determine_users(void) {
   
   spoofuid= myuid;
   spoofgid= mygid;
   
   spoofuid= myuid;
   spoofgid= mygid;
-  logname= getenv("LOGNAME");
-  if (!logname) logname= getenv("USER");
-  if (logname) {
-    pw= getpwnam(logname);
-    if (!pw || pw->pw_uid != myuid) logname= 0;
+  loginname= getenv("LOGNAME");
+  if (!loginname) loginname= getenv("USER");
+  if (loginname) {
+    pw= getpwnam(loginname);
+    if (!pw || pw->pw_uid != myuid) loginname= 0;
   }
   }
-  if (!logname) {
+  if (!loginname) {
     pw= getpwuid(myuid); if (!pw) miscerror("cannot determine your login name");
     pw= getpwuid(myuid); if (!pw) miscerror("cannot determine your login name");
-    logname= pw->pw_name;
+    loginname= pw->pw_name;
   }
 
   }
 
-  if (!strcmp(serviceuser,"-")) serviceuser= logname;
+  if (!strcmp(serviceuser,"-")) serviceuser= loginname;
   pw= getpwnam(serviceuser);
   if (!pw) miscerror("requested service user `%s' is not a user",serviceuser);
   serviceuid= pw->pw_uid;
   pw= getpwnam(serviceuser);
   if (!pw) miscerror("requested service user `%s' is not a user",serviceuser);
   serviceuid= pw->pw_uid;
@@ -876,9 +878,9 @@ static void determine_users(void) {
               " the user who will be providing the service");
 
   if (spoofuser) {
               " the user who will be providing the service");
 
   if (spoofuser) {
-    logname= spoofuser;
-    pw= getpwnam(logname);
-    if (!pw) miscerror("spoofed login name `%s' is not valid",logname);
+    loginname= spoofuser;
+    pw= getpwnam(loginname);
+    if (!pw) miscerror("spoofed login name `%s' is not valid",loginname);
     spoofuid= pw->pw_uid;
     spoofgid= pw->pw_gid;
     ngidssize= ngids; ngids= 0;
     spoofuid= pw->pw_uid;
     spoofgid= pw->pw_gid;
     ngidssize= ngids; ngids= 0;
@@ -888,7 +890,7 @@ static void determine_users(void) {
     }
     gidarray[ngids++]= spoofgid;
     while ((gr= getgrent())) { /* ouch! getgrent has no error behaviour! */
     }
     gidarray[ngids++]= spoofgid;
     while ((gr= getgrent())) { /* ouch! getgrent has no error behaviour! */
-      for (mem= gr->gr_mem; *mem && strcmp(*mem,logname); mem++);
+      for (mem= gr->gr_mem; *mem && strcmp(*mem,loginname); mem++);
       if (!*mem) continue;
       if (ngids>=ngidssize) {
       if (ngids>=MAX_GIDS) miscerror("spoofed user is member of too many groups");
       if (!*mem) continue;
       if (ngids>=ngidssize) {
       if (ngids>=MAX_GIDS) miscerror("spoofed user is member of too many groups");
@@ -1050,7 +1052,7 @@ static void server_sendrequest(int argc, char *const *argv) {
   request_mbuf.clientpid= getpid();
   request_mbuf.serviceuserlen= strlen(serviceuser);
   request_mbuf.servicelen= strlen(argv[0]);
   request_mbuf.clientpid= getpid();
   request_mbuf.serviceuserlen= strlen(serviceuser);
   request_mbuf.servicelen= strlen(argv[0]);
-  request_mbuf.lognamelen= strlen(logname);
+  request_mbuf.loginnamelen= strlen(loginname);
   request_mbuf.spoofed= spoofuser ? 1 : 0;
   request_mbuf.cwdlen= cwdbufsize;
   request_mbuf.callinguid= spoofuid;
   request_mbuf.spoofed= spoofuser ? 1 : 0;
   request_mbuf.cwdlen= cwdbufsize;
   request_mbuf.callinguid= spoofuid;
@@ -1069,7 +1071,7 @@ static void server_sendrequest(int argc, char *const *argv) {
   xfwrite(&request_mbuf,sizeof(request_mbuf),swfile);
   xfwrite(serviceuser,sizeof(*serviceuser)*request_mbuf.serviceuserlen,swfile);
   xfwrite(argv[0],sizeof(*argv[0])*request_mbuf.servicelen,swfile);
   xfwrite(&request_mbuf,sizeof(request_mbuf),swfile);
   xfwrite(serviceuser,sizeof(*serviceuser)*request_mbuf.serviceuserlen,swfile);
   xfwrite(argv[0],sizeof(*argv[0])*request_mbuf.servicelen,swfile);
-  xfwrite(logname,sizeof(*logname)*request_mbuf.lognamelen,swfile);
+  xfwrite(loginname,sizeof(*loginname)*request_mbuf.loginnamelen,swfile);
   xfwrite(cwdbuf,sizeof(*cwdbuf)*request_mbuf.cwdlen,swfile);
   if (ovused>=0) xfwrite(ovbuf,sizeof(*ovbuf)*ovused,swfile);
   xfwrite(&spoofgid,sizeof(gid_t),swfile);
   xfwrite(cwdbuf,sizeof(*cwdbuf)*request_mbuf.cwdlen,swfile);
   if (ovused>=0) xfwrite(ovbuf,sizeof(*ovbuf)*ovused,swfile);
   xfwrite(&spoofgid,sizeof(gid_t),swfile);