diff -rbuw original/authrhosts.c ./authrhosts.c --- original/authrhosts.c Sat Mar 2 19:05:51 2002 +++ ./authrhosts.c Thu May 2 22:33:21 2002 @@ -24,7 +24,7 @@ { USED(tx); - if(ruserok(remotehostname, 0, rx->uname, rx->uname) < 0){ + if(ruserok(remotehostname, 0, rx->uname, rx->luname) < 0){ fprint(2, "ruserok(%s, %s) not okay\n", remotehostname, rx->uname); return "u9fs: rhosts authentication failed"; } diff -rbuw original/fcall.h ./fcall.h --- original/fcall.h Sat Mar 2 19:05:52 2002 +++ ./fcall.h Thu May 2 22:18:28 2002 @@ -20,6 +20,7 @@ char *uname; /* Tattach, Tauth */ char *aname; /* Tattach, Tauth */ + char *luname; /* local name */ u32int perm; /* Tcreate */ diff -rbuw original/u9fs.c ./u9fs.c --- original/u9fs.c Sat Mar 2 19:05:53 2002 +++ ./u9fs.c Thu May 2 22:39:20 2002 @@ -353,6 +353,31 @@ seterror(tx, e); } +char* +stripusername(char *aname, char **username) +{ + char *p = aname; + char *e; + while(*p && isspace(*p)) + p++; + if (strncmp(p, "-l", 2) != 0) + return aname; + p++; + p++; + if (! isspace(*p)) + return aname; + while(*p && isspace(*p)) + p++; + *username = p; + while(*p && !isspace(*p)) + p++; + e = p; + while(*p && isspace(*p)) + p++; + *e = '\0'; + return p; +} + void rattach(Fcall *rx, Fcall *tx) { @@ -360,9 +385,16 @@ Fid *fid; User *u; + rx->luname = nil; + if(rx->aname == nil) rx->aname = ""; + rx->aname = stripusername(rx->aname, &rx->luname); + fprint(2, "aname %s uname %s luname %s\n", rx->aname, rx->uname, rx->luname?rx->luname:""); + if(rx->luname == nil) + rx->luname = rx->uname; + if(strcmp(rx->aname, "device") == 0){ if(connected && !devallowed){ seterror(tx, Especial0); @@ -376,7 +408,7 @@ } } - if(strcmp(rx->uname, "none") == 0){ + if(strcmp(rx->luname, "none") == 0){ if(authed == 0){ seterror(tx, Eauth); return; @@ -401,9 +433,9 @@ } if(defaultuser) - rx->uname = defaultuser; + rx->luname = defaultuser; - if((u = uname2user(rx->uname)) == nil || u->id == 0){ + if((u = uname2user(rx->luname)) == nil || u->id == 0){ /* we don't know anyone named root... */ seterror(tx, Eunknownuser); freefid(fid);