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