1bd389b36SDavid du Colombier #include <u.h> 2bd389b36SDavid du Colombier #include <libc.h> 3*219b2ee8SDavid du Colombier #include <auth.h> 4bd389b36SDavid du Colombier #include <fcall.h> 5bd389b36SDavid du Colombier #include <tapefs.h> 6bd389b36SDavid du Colombier #include <bio.h> 7bd389b36SDavid du Colombier 8bd389b36SDavid du Colombier Idmap * 9bd389b36SDavid du Colombier getpass(char *file) 10bd389b36SDavid du Colombier { 11bd389b36SDavid du Colombier Biobuf *bp; 12bd389b36SDavid du Colombier char *cp; 13bd389b36SDavid du Colombier Idmap *up; 14bd389b36SDavid du Colombier int nid, maxid; 15bd389b36SDavid du Colombier char *line[4]; 16bd389b36SDavid du Colombier 17bd389b36SDavid du Colombier if ((bp = Bopen(file, OREAD)) == 0) 18bd389b36SDavid du Colombier error("Can't open passwd/group"); 19bd389b36SDavid du Colombier up = emalloc(1*sizeof(Idmap)); 20bd389b36SDavid du Colombier maxid = 1; 21bd389b36SDavid du Colombier nid = 0; 22bd389b36SDavid du Colombier setfields(":\n"); 23bd389b36SDavid du Colombier while ((cp = Brdline(bp, '\n'))) { 24bd389b36SDavid du Colombier getfields(cp, line, 3); 25bd389b36SDavid du Colombier if (nid>=maxid) { 26bd389b36SDavid du Colombier maxid *= 2; 27bd389b36SDavid du Colombier up = (Idmap *)erealloc(up, maxid*sizeof(Idmap)); 28bd389b36SDavid du Colombier } 29bd389b36SDavid du Colombier if (line[0] && line[2]) { 30bd389b36SDavid du Colombier up[nid].id = atoi(line[2]); 31bd389b36SDavid du Colombier up[nid].name = strdup(line[0]); 32bd389b36SDavid du Colombier nid++; 33bd389b36SDavid du Colombier } 34bd389b36SDavid du Colombier } 35*219b2ee8SDavid du Colombier Bterm(bp); 36bd389b36SDavid du Colombier up[nid].name = 0; 37bd389b36SDavid du Colombier return up; 38bd389b36SDavid du Colombier } 39bd389b36SDavid du Colombier 40bd389b36SDavid du Colombier char * 41bd389b36SDavid du Colombier mapid(Idmap *up, int id) 42bd389b36SDavid du Colombier { 43bd389b36SDavid du Colombier char buf[16]; 44bd389b36SDavid du Colombier 45bd389b36SDavid du Colombier if (up) 46bd389b36SDavid du Colombier while (up->name){ 47bd389b36SDavid du Colombier if (up->id==id) 48bd389b36SDavid du Colombier return strdup(up->name); 49bd389b36SDavid du Colombier up++; 50bd389b36SDavid du Colombier } 51bd389b36SDavid du Colombier sprint(buf, "%d", id); 52bd389b36SDavid du Colombier return strdup(buf); 53bd389b36SDavid du Colombier } 54bd389b36SDavid du Colombier 55bd389b36SDavid du Colombier Ram * 56bd389b36SDavid du Colombier poppath(Fileinf fi, int new) 57bd389b36SDavid du Colombier { 58bd389b36SDavid du Colombier char *suffix; 59bd389b36SDavid du Colombier Ram *dir, *ent; 60bd389b36SDavid du Colombier if (*fi.name=='\0') 61bd389b36SDavid du Colombier return 0; 62bd389b36SDavid du Colombier if (suffix=strrchr(fi.name, '/')){ 63bd389b36SDavid du Colombier Fileinf f; 64bd389b36SDavid du Colombier *suffix = 0; 65bd389b36SDavid du Colombier suffix++; 66bd389b36SDavid du Colombier if (*suffix=='\0'){ 67bd389b36SDavid du Colombier fi.mode |= CHDIR; 68bd389b36SDavid du Colombier return poppath(fi, 1); 69bd389b36SDavid du Colombier } 70bd389b36SDavid du Colombier f = fi; 71bd389b36SDavid du Colombier f.size = 0; 72bd389b36SDavid du Colombier f.addr = 0; 73bd389b36SDavid du Colombier f.mode = 0555|CHDIR; 74bd389b36SDavid du Colombier dir = poppath(f, 0); 75*219b2ee8SDavid du Colombier if (dir==0) 76*219b2ee8SDavid du Colombier dir = ram; 77bd389b36SDavid du Colombier } else { 78bd389b36SDavid du Colombier suffix = fi.name; 79bd389b36SDavid du Colombier dir = ram; 80bd389b36SDavid du Colombier if (strcmp(suffix, ".")==0) 81bd389b36SDavid du Colombier return dir; 82bd389b36SDavid du Colombier } 83bd389b36SDavid du Colombier ent = lookup(dir, suffix); 84bd389b36SDavid du Colombier fi.mode |= 0400; /* at least user read */ 85bd389b36SDavid du Colombier if (ent){ 86bd389b36SDavid du Colombier if ((fi.mode&CHDIR) != (ent->qid.path&CHDIR)){ 87bd389b36SDavid du Colombier fprint(2, "%s/%s directory botch\n", fi.name, suffix); 88bd389b36SDavid du Colombier exits(""); 89bd389b36SDavid du Colombier } 90bd389b36SDavid du Colombier if (new) { 91bd389b36SDavid du Colombier ent->ndata = fi.size; 92bd389b36SDavid du Colombier ent->data = fi.addr; 93bd389b36SDavid du Colombier ent->perm = fi.mode; 94bd389b36SDavid du Colombier ent->mtime = fi.mdate; 95bd389b36SDavid du Colombier ent->user = mapid(uidmap, fi.uid); 96bd389b36SDavid du Colombier ent->group = mapid(gidmap, fi.gid); 97bd389b36SDavid du Colombier } 98bd389b36SDavid du Colombier } else { 99bd389b36SDavid du Colombier strncpy(fi.name, suffix, NAMELEN); 100bd389b36SDavid du Colombier ent = popfile(dir, fi); 101bd389b36SDavid du Colombier } 102bd389b36SDavid du Colombier return ent; 103bd389b36SDavid du Colombier } 104bd389b36SDavid du Colombier 105bd389b36SDavid du Colombier Ram * 106bd389b36SDavid du Colombier popfile(Ram *dir, Fileinf fi) 107bd389b36SDavid du Colombier { 108bd389b36SDavid du Colombier Ram *ent = (Ram *)emalloc(sizeof(Ram)); 109bd389b36SDavid du Colombier 110bd389b36SDavid du Colombier if (*fi.name=='\0') 111bd389b36SDavid du Colombier return 0; 112bd389b36SDavid du Colombier ent->busy = 1; 113bd389b36SDavid du Colombier ent->open = 0; 114bd389b36SDavid du Colombier ent->parent = dir; 115bd389b36SDavid du Colombier ent->next = dir->child; 116bd389b36SDavid du Colombier dir->child = ent; 117bd389b36SDavid du Colombier ent->child = 0; 118bd389b36SDavid du Colombier ent->qid.path = ++path | fi.mode&CHDIR; 119bd389b36SDavid du Colombier ent->qid.vers = 0; 120bd389b36SDavid du Colombier ent->perm = fi.mode; 121bd389b36SDavid du Colombier strncpy(ent->name, fi.name, NAMELEN); 122bd389b36SDavid du Colombier ent->atime = ent->mtime = fi.mdate; 123bd389b36SDavid du Colombier ent->user = mapid(uidmap, fi.uid); 124bd389b36SDavid du Colombier ent->group = mapid(gidmap, fi.gid); 125bd389b36SDavid du Colombier ent->ndata = fi.size; 126bd389b36SDavid du Colombier ent->data = fi.addr; 127bd389b36SDavid du Colombier ent->replete |= replete; 128bd389b36SDavid du Colombier return ent; 129bd389b36SDavid du Colombier } 130bd389b36SDavid du Colombier 131bd389b36SDavid du Colombier Ram * 132bd389b36SDavid du Colombier lookup(Ram *dir, char *name) 133bd389b36SDavid du Colombier { 134bd389b36SDavid du Colombier Ram *r; 135bd389b36SDavid du Colombier 136*219b2ee8SDavid du Colombier if (dir==0) 137*219b2ee8SDavid du Colombier return 0; 138bd389b36SDavid du Colombier for (r=dir->child; r; r=r->next){ 139bd389b36SDavid du Colombier if (r->busy==0 || strcmp(r->name, name)!=0) 140bd389b36SDavid du Colombier continue; 141bd389b36SDavid du Colombier return r; 142bd389b36SDavid du Colombier } 143bd389b36SDavid du Colombier return 0; 144bd389b36SDavid du Colombier } 145