From mboxrd@z Thu Jan 1 00:00:00 1970 Message-Id: <200204081314.g38DEMW18473@copernicus.cs.utwente.nl> To: 9fans@cse.psu.edu Subject: Re: [9fans] u9fs: dealing with user names that differ between unix and plan 9? In-reply-to: Your message of "Fri, 05 Apr 2002 20:23:06 +0200." <200204051823.g35IN6e06640@copernicus.cs.utwente.nl> References: <20020405154846.61C8119988@mail.cse.psu.edu> <200204051823.g35IN6e06640@copernicus.cs.utwente.nl> From: Axel Belinfante Mime-Version: 1.0 Content-Type: multipart/mixed ; boundary="==_Exmh_10660053770" Date: Mon, 8 Apr 2002 15:14:21 +0200 Topicbox-Message-UUID: 736ceeea-eaca-11e9-9e20-41e7f4b1d025 This is a multipart MIME message. --==_Exmh_10660053770 Content-Type: text/plain; charset=us-ascii In addition to using the user name mapping file I now also look for a '-l user' prefix in the attach 'aname' field (if present, I just use it and skip the mapping file lookup). Axel. --==_Exmh_10660053770 Content-Type: text/plain ; name="diff"; charset=us-ascii Content-Description: diff Content-Disposition: attachment; filename="diff" --- u9fs.c.original Fri Apr 5 19:54:35 2002 +++ u9fs.c Mon Apr 8 14:05:30 2002 @@ -96,6 +96,8 @@ int readonly; int myuid; char *onlyuser; +char *mapfile; +char mapbuf[1024]; void io(void); void error(char*); @@ -112,6 +114,8 @@ Ulong vers(struct stat*); void errjmp(const char*); int omode(int); +char* stripusername(char*, char**); +char* remote2local(char*, char*); char* id2name(Pass**, int); Pass* id2pass(Pass**, int); Pass* name2pass(Pass**, char*); @@ -150,11 +154,12 @@ char Euid[] = "can't set uid"; char Egid[] = "can't set gid"; char Eowner[] = "not owner"; +char Emapfileerr[] = "error opening mapping file"; void usage(void) { - fprintf(stderr, "u9fs [-r] [-u user uid]\n"); + fprintf(stderr, "u9fs [-r] [-u user uid] [-m mapfile]\n"); exit(1); } @@ -172,6 +177,7 @@ DBG(fprintf(stderr, "u9fs\nkill %d\n", getpid())); onlyuid = -1; + mapfile = 0; ARGBEGIN{ case 'r': readonly++; @@ -185,6 +191,11 @@ usage(); onlyuid = atoi(s); break; + case 'm': + mapfile = ARGF(); + if(mapfile == 0) + usage(); + break; default: usage(); break; @@ -311,6 +322,9 @@ { Rfile *rf; Pass *p; + char *localname; + char *aname; + char *username; if(file0 == 0){ file0 = newfile(); @@ -321,7 +335,10 @@ } if(!okfid(rhdr.fid)) errjmp(Ebadfid); - if(strncmp(rhdr.aname, "device", 6) == 0){ + username = 0; + aname = stripusername(rhdr.aname, &username); + DBG(fprintf(stderr, "uname %s username:%s\n", aname, username?username:"")); + if(strncmp(aname, "device", 6) == 0){ if(connected && !devallowed) errjmp(Especial0); devallowed = 1; @@ -334,14 +351,20 @@ rf = &rfile[rhdr.fid]; if(rf->busy) errjmp(Efidactive); - p = name2pass(uidname, rhdr.uname); + if (username == 0) + localname = remote2local(mapfile, rhdr.uname); + else + localname = username; + if(localname == 0) + errjmp(Eunknown); + p = name2pass(uidname, localname); if(p == 0) errjmp(Eunknown); if(p->id == 0 || (uid_t)p->id == (uid_t)-1 || myuid && p->id != myuid) errjmp(Eperm); # ifdef SOCKETS - if(!myuid && ruserok(bsdhost, 0, rhdr.uname, rhdr.uname) < 0) + if(!myuid && ruserok(bsdhost, 0, rhdr.uname, localname) < 0) errjmp(Eperm); # endif /* mark busy & inc ref cnt only after committed to succeed */ @@ -955,6 +978,81 @@ q |= qdev[dev]<<24; q |= st->st_ino & 0x00FFFFFFUL; return q; +} + +char* +stripusername(char *aname, char **username) +{ + char *p = aname; + char *e; + DBG(fprintf(stderr, "aname: %s\n", aname)); + while(*p && isspace(*p)) + p++; + if (strncmp(p, "-l", 2) != 0) + return aname; + p++; + p++; + DBG(fprintf(stderr, "aname: found -l\n")); + if (! isspace(*p)) + return aname; + DBG(fprintf(stderr, "aname: found space\n")); + while(*p && isspace(*p)) + p++; + *username = p; + while(*p && !isspace(*p)) + p++; + e = p; + while(*p && isspace(*p)) + p++; + *e = '\0'; + DBG(fprintf(stderr, "aname: found username: %s\n", *username)); + DBG(fprintf(stderr, "aname: rest: %s\n", p)); + return p; +} + +char* +remote2local(char *mapfile, char *name) +{ + FILE *f; + char *p; + char *r; + char *re; + char *l; + char *le; + char *res = name; + if (mapfile == 0) + return res; + if ((f = fopen(mapfile, "r")) == 0) + errjmp(Emapfileerr); + DBG(fprintf(stderr, "using mapfile %s\n", mapfile)); + while(fgets(mapbuf, sizeof(mapbuf), f)) { + DBG(fprintf(stderr, "mapfile line: %s\n", mapbuf)); + p = mapbuf; + while(*p && isspace(*p)) + p++; + if (*p == '#') + continue; + r = p; + while(*p && !isspace(*p)) + p++; + re = p; + while(*p && isspace(*p)) + p++; + l = p; + while(*p && !isspace(*p)) + p++; + le = p; + *re = '\0'; + *le = '\0'; + DBG(fprintf(stderr, "\tmap '%s' -> '%s'\n", r, l)); + if (strcmp(r, name) == 0) { + res = l; + break; + } + } + DBG(fprintf(stderr, "mapped '%s' -> '%s'\n", name, res)); + fclose(f); + return res; } Pass* --==_Exmh_10660053770--