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);
103 } else {
104 fi.name = suffix;
105 ent = popfile(dir, fi);
107 return ent;
110 Ram *
111 popfile(Ram *dir, Fileinf fi)
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 else
127 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;
140 Ram *
141 lookup(Ram *dir, char *name)
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;
152 return 0;