1bd389b36SDavid du Colombier #include <u.h> 2bd389b36SDavid du Colombier #include <libc.h> 3219b2ee8SDavid 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 while ((cp = Brdline(bp, '\n'))) { 237dd7cddfSDavid du Colombier int nf; 247dd7cddfSDavid du Colombier cp[Blinelen(bp)-1] = 0; 257dd7cddfSDavid du Colombier nf = getfields(cp, line, 3, 0, ":\n"); 267dd7cddfSDavid du Colombier if (nf<3) { 277dd7cddfSDavid du Colombier fprint(2, "bad format in %s\n", file); 287dd7cddfSDavid du Colombier break; 297dd7cddfSDavid du Colombier } 30bd389b36SDavid du Colombier if (nid>=maxid) { 31bd389b36SDavid du Colombier maxid *= 2; 32bd389b36SDavid du Colombier up = (Idmap *)erealloc(up, maxid*sizeof(Idmap)); 33bd389b36SDavid du Colombier } 34bd389b36SDavid du Colombier up[nid].id = atoi(line[2]); 35bd389b36SDavid du Colombier up[nid].name = strdup(line[0]); 36bd389b36SDavid du Colombier nid++; 37bd389b36SDavid du Colombier } 38219b2ee8SDavid du Colombier Bterm(bp); 39bd389b36SDavid du Colombier up[nid].name = 0; 40bd389b36SDavid du Colombier return up; 41bd389b36SDavid du Colombier } 42bd389b36SDavid du Colombier 43bd389b36SDavid du Colombier char * 44bd389b36SDavid du Colombier mapid(Idmap *up, int id) 45bd389b36SDavid du Colombier { 46bd389b36SDavid du Colombier char buf[16]; 47bd389b36SDavid du Colombier 48bd389b36SDavid du Colombier if (up) 49bd389b36SDavid du Colombier while (up->name){ 50bd389b36SDavid du Colombier if (up->id==id) 51bd389b36SDavid du Colombier return strdup(up->name); 52bd389b36SDavid du Colombier up++; 53bd389b36SDavid du Colombier } 54bd389b36SDavid du Colombier sprint(buf, "%d", id); 55bd389b36SDavid du Colombier return strdup(buf); 56bd389b36SDavid du Colombier } 57bd389b36SDavid du Colombier 58bd389b36SDavid du Colombier Ram * 59bd389b36SDavid du Colombier poppath(Fileinf fi, int new) 60bd389b36SDavid du Colombier { 61bd389b36SDavid du Colombier char *suffix; 62bd389b36SDavid du Colombier Ram *dir, *ent; 637dd7cddfSDavid du Colombier Fileinf f; 647dd7cddfSDavid du Colombier 65bd389b36SDavid du Colombier if (*fi.name=='\0') 66bd389b36SDavid du Colombier return 0; 67bd389b36SDavid du Colombier if (suffix=strrchr(fi.name, '/')){ 68bd389b36SDavid du Colombier *suffix = 0; 69bd389b36SDavid du Colombier suffix++; 70bd389b36SDavid du Colombier if (*suffix=='\0'){ 71*9a747e4fSDavid du Colombier fi.mode |= DMDIR; 72bd389b36SDavid du Colombier return poppath(fi, 1); 73bd389b36SDavid du Colombier } 74bd389b36SDavid du Colombier f = fi; 75bd389b36SDavid du Colombier f.size = 0; 76bd389b36SDavid du Colombier f.addr = 0; 77*9a747e4fSDavid du Colombier f.mode = 0555|DMDIR; 78bd389b36SDavid du Colombier dir = poppath(f, 0); 79219b2ee8SDavid du Colombier if (dir==0) 80219b2ee8SDavid du Colombier dir = ram; 81bd389b36SDavid du Colombier } else { 82bd389b36SDavid du Colombier suffix = fi.name; 83bd389b36SDavid du Colombier dir = ram; 84bd389b36SDavid du Colombier if (strcmp(suffix, ".")==0) 85bd389b36SDavid du Colombier return dir; 86bd389b36SDavid du Colombier } 87bd389b36SDavid du Colombier ent = lookup(dir, suffix); 88bd389b36SDavid du Colombier fi.mode |= 0400; /* at least user read */ 89bd389b36SDavid du Colombier if (ent){ 90*9a747e4fSDavid du Colombier if (((fi.mode&DMDIR)!=0) != ((ent->qid.type&QTDIR)!=0)){ 91bd389b36SDavid du Colombier fprint(2, "%s/%s directory botch\n", fi.name, suffix); 92bd389b36SDavid du Colombier exits(""); 93bd389b36SDavid du Colombier } 94bd389b36SDavid du Colombier if (new) { 95bd389b36SDavid du Colombier ent->ndata = fi.size; 96bd389b36SDavid du Colombier ent->data = fi.addr; 97bd389b36SDavid du Colombier ent->perm = fi.mode; 98bd389b36SDavid du Colombier ent->mtime = fi.mdate; 99bd389b36SDavid du Colombier ent->user = mapid(uidmap, fi.uid); 100bd389b36SDavid du Colombier ent->group = mapid(gidmap, fi.gid); 101bd389b36SDavid du Colombier } 102bd389b36SDavid du Colombier } else { 1037dd7cddfSDavid du Colombier fi.name = suffix; 104bd389b36SDavid du Colombier ent = popfile(dir, fi); 105bd389b36SDavid du Colombier } 106bd389b36SDavid du Colombier return ent; 107bd389b36SDavid du Colombier } 108bd389b36SDavid du Colombier 109bd389b36SDavid du Colombier Ram * 110bd389b36SDavid du Colombier popfile(Ram *dir, Fileinf fi) 111bd389b36SDavid du Colombier { 112bd389b36SDavid du Colombier Ram *ent = (Ram *)emalloc(sizeof(Ram)); 113bd389b36SDavid du Colombier if (*fi.name=='\0') 114bd389b36SDavid du Colombier return 0; 115bd389b36SDavid du Colombier ent->busy = 1; 116bd389b36SDavid du Colombier ent->open = 0; 117bd389b36SDavid du Colombier ent->parent = dir; 118bd389b36SDavid du Colombier ent->next = dir->child; 119bd389b36SDavid du Colombier dir->child = ent; 120bd389b36SDavid du Colombier ent->child = 0; 121*9a747e4fSDavid du Colombier ent->qid.path = ++path; 122bd389b36SDavid du Colombier ent->qid.vers = 0; 123*9a747e4fSDavid du Colombier if(fi.mode&DMDIR) 124*9a747e4fSDavid du Colombier ent->qid.type = QTDIR; 125*9a747e4fSDavid du Colombier else 126*9a747e4fSDavid du Colombier ent->qid.type = QTFILE; 127bd389b36SDavid du Colombier ent->perm = fi.mode; 128*9a747e4fSDavid du Colombier ent->name = estrdup(fi.name); 129bd389b36SDavid du Colombier ent->atime = ent->mtime = fi.mdate; 130bd389b36SDavid du Colombier ent->user = mapid(uidmap, fi.uid); 131bd389b36SDavid du Colombier ent->group = mapid(gidmap, fi.gid); 132bd389b36SDavid du Colombier ent->ndata = fi.size; 133bd389b36SDavid du Colombier ent->data = fi.addr; 134bd389b36SDavid du Colombier ent->replete |= replete; 135bd389b36SDavid du Colombier return ent; 136bd389b36SDavid du Colombier } 137bd389b36SDavid du Colombier 138bd389b36SDavid du Colombier Ram * 139bd389b36SDavid du Colombier lookup(Ram *dir, char *name) 140bd389b36SDavid du Colombier { 141bd389b36SDavid du Colombier Ram *r; 142bd389b36SDavid du Colombier 143219b2ee8SDavid du Colombier if (dir==0) 144219b2ee8SDavid du Colombier return 0; 145bd389b36SDavid du Colombier for (r=dir->child; r; r=r->next){ 146bd389b36SDavid du Colombier if (r->busy==0 || strcmp(r->name, name)!=0) 147bd389b36SDavid du Colombier continue; 148bd389b36SDavid du Colombier return r; 149bd389b36SDavid du Colombier } 150bd389b36SDavid du Colombier return 0; 151bd389b36SDavid du Colombier } 152