Blame


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