Blame


1 2277c5d7 2004-03-21 devnull #include <u.h>
2 2277c5d7 2004-03-21 devnull #include <libc.h>
3 2277c5d7 2004-03-21 devnull #include <auth.h>
4 2277c5d7 2004-03-21 devnull #include <fcall.h>
5 2277c5d7 2004-03-21 devnull #include <thread.h>
6 2277c5d7 2004-03-21 devnull #include <9p.h>
7 2277c5d7 2004-03-21 devnull
8 2277c5d7 2004-03-21 devnull static char Ebad[] = "something bad happened";
9 2277c5d7 2004-03-21 devnull static char Enomem[] = "no memory";
10 2277c5d7 2004-03-21 devnull
11 2277c5d7 2004-03-21 devnull typedef struct Ramfile Ramfile;
12 2277c5d7 2004-03-21 devnull struct Ramfile {
13 2277c5d7 2004-03-21 devnull char *data;
14 2277c5d7 2004-03-21 devnull int ndata;
15 2277c5d7 2004-03-21 devnull };
16 2277c5d7 2004-03-21 devnull
17 2277c5d7 2004-03-21 devnull void
18 2277c5d7 2004-03-21 devnull fsread(Req *r)
19 2277c5d7 2004-03-21 devnull {
20 2277c5d7 2004-03-21 devnull Ramfile *rf;
21 2277c5d7 2004-03-21 devnull vlong offset;
22 2277c5d7 2004-03-21 devnull long count;
23 2277c5d7 2004-03-21 devnull
24 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
25 2277c5d7 2004-03-21 devnull offset = r->ifcall.offset;
26 2277c5d7 2004-03-21 devnull count = r->ifcall.count;
27 2277c5d7 2004-03-21 devnull
28 cbeb0b26 2006-04-01 devnull /*print("read %ld %lld\n", *count, offset); */
29 2277c5d7 2004-03-21 devnull if(offset >= rf->ndata){
30 2277c5d7 2004-03-21 devnull r->ofcall.count = 0;
31 2277c5d7 2004-03-21 devnull respond(r, nil);
32 2277c5d7 2004-03-21 devnull return;
33 2277c5d7 2004-03-21 devnull }
34 2277c5d7 2004-03-21 devnull
35 2277c5d7 2004-03-21 devnull if(offset+count >= rf->ndata)
36 2277c5d7 2004-03-21 devnull count = rf->ndata - offset;
37 2277c5d7 2004-03-21 devnull
38 2277c5d7 2004-03-21 devnull memmove(r->ofcall.data, rf->data+offset, count);
39 2277c5d7 2004-03-21 devnull r->ofcall.count = count;
40 2277c5d7 2004-03-21 devnull respond(r, nil);
41 2277c5d7 2004-03-21 devnull }
42 2277c5d7 2004-03-21 devnull
43 2277c5d7 2004-03-21 devnull void
44 2277c5d7 2004-03-21 devnull fswrite(Req *r)
45 2277c5d7 2004-03-21 devnull {
46 2277c5d7 2004-03-21 devnull void *v;
47 2277c5d7 2004-03-21 devnull Ramfile *rf;
48 2277c5d7 2004-03-21 devnull vlong offset;
49 2277c5d7 2004-03-21 devnull long count;
50 2277c5d7 2004-03-21 devnull
51 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
52 2277c5d7 2004-03-21 devnull offset = r->ifcall.offset;
53 2277c5d7 2004-03-21 devnull count = r->ifcall.count;
54 2277c5d7 2004-03-21 devnull
55 2277c5d7 2004-03-21 devnull if(offset+count >= rf->ndata){
56 2277c5d7 2004-03-21 devnull v = realloc(rf->data, offset+count);
57 2277c5d7 2004-03-21 devnull if(v == nil){
58 2277c5d7 2004-03-21 devnull respond(r, Enomem);
59 2277c5d7 2004-03-21 devnull return;
60 2277c5d7 2004-03-21 devnull }
61 2277c5d7 2004-03-21 devnull rf->data = v;
62 2277c5d7 2004-03-21 devnull rf->ndata = offset+count;
63 2277c5d7 2004-03-21 devnull r->fid->file->length = rf->ndata;
64 2277c5d7 2004-03-21 devnull }
65 2277c5d7 2004-03-21 devnull memmove(rf->data+offset, r->ifcall.data, count);
66 2277c5d7 2004-03-21 devnull r->ofcall.count = count;
67 2277c5d7 2004-03-21 devnull respond(r, nil);
68 2277c5d7 2004-03-21 devnull }
69 2277c5d7 2004-03-21 devnull
70 2277c5d7 2004-03-21 devnull void
71 2277c5d7 2004-03-21 devnull fscreate(Req *r)
72 2277c5d7 2004-03-21 devnull {
73 2277c5d7 2004-03-21 devnull Ramfile *rf;
74 2277c5d7 2004-03-21 devnull File *f;
75 2277c5d7 2004-03-21 devnull
76 2277c5d7 2004-03-21 devnull if(f = createfile(r->fid->file, r->ifcall.name, r->fid->uid, r->ifcall.perm, nil)){
77 2277c5d7 2004-03-21 devnull rf = emalloc9p(sizeof *rf);
78 2277c5d7 2004-03-21 devnull f->aux = rf;
79 2277c5d7 2004-03-21 devnull r->fid->file = f;
80 2277c5d7 2004-03-21 devnull r->ofcall.qid = f->qid;
81 2277c5d7 2004-03-21 devnull respond(r, nil);
82 2277c5d7 2004-03-21 devnull return;
83 2277c5d7 2004-03-21 devnull }
84 2277c5d7 2004-03-21 devnull respond(r, Ebad);
85 2277c5d7 2004-03-21 devnull }
86 2277c5d7 2004-03-21 devnull
87 2277c5d7 2004-03-21 devnull void
88 2277c5d7 2004-03-21 devnull fsopen(Req *r)
89 2277c5d7 2004-03-21 devnull {
90 2277c5d7 2004-03-21 devnull Ramfile *rf;
91 2277c5d7 2004-03-21 devnull
92 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
93 2277c5d7 2004-03-21 devnull
94 2277c5d7 2004-03-21 devnull if(rf && (r->ifcall.mode&OTRUNC)){
95 2277c5d7 2004-03-21 devnull rf->ndata = 0;
96 2277c5d7 2004-03-21 devnull r->fid->file->length = 0;
97 2277c5d7 2004-03-21 devnull }
98 2277c5d7 2004-03-21 devnull
99 2277c5d7 2004-03-21 devnull respond(r, nil);
100 2277c5d7 2004-03-21 devnull }
101 2277c5d7 2004-03-21 devnull
102 2277c5d7 2004-03-21 devnull void
103 2277c5d7 2004-03-21 devnull fsdestroyfile(File *f)
104 2277c5d7 2004-03-21 devnull {
105 2277c5d7 2004-03-21 devnull Ramfile *rf;
106 2277c5d7 2004-03-21 devnull
107 cbeb0b26 2006-04-01 devnull /*fprint(2, "clunk\n"); */
108 2277c5d7 2004-03-21 devnull rf = f->aux;
109 2277c5d7 2004-03-21 devnull if(rf){
110 2277c5d7 2004-03-21 devnull free(rf->data);
111 2277c5d7 2004-03-21 devnull free(rf);
112 2277c5d7 2004-03-21 devnull }
113 2277c5d7 2004-03-21 devnull }
114 2277c5d7 2004-03-21 devnull
115 2277c5d7 2004-03-21 devnull Srv fs = {
116 2277c5d7 2004-03-21 devnull .open= fsopen,
117 2277c5d7 2004-03-21 devnull .read= fsread,
118 2277c5d7 2004-03-21 devnull .write= fswrite,
119 2277c5d7 2004-03-21 devnull .create= fscreate,
120 2277c5d7 2004-03-21 devnull };
121 2277c5d7 2004-03-21 devnull
122 2277c5d7 2004-03-21 devnull void
123 2277c5d7 2004-03-21 devnull usage(void)
124 2277c5d7 2004-03-21 devnull {
125 2277c5d7 2004-03-21 devnull fprint(2, "usage: ramfs [-D] [-s srvname] [-m mtpt]\n");
126 2277c5d7 2004-03-21 devnull exits("usage");
127 2277c5d7 2004-03-21 devnull }
128 2277c5d7 2004-03-21 devnull
129 2277c5d7 2004-03-21 devnull void
130 2277c5d7 2004-03-21 devnull main(int argc, char **argv)
131 2277c5d7 2004-03-21 devnull {
132 2277c5d7 2004-03-21 devnull char *srvname = nil;
133 2277c5d7 2004-03-21 devnull char *mtpt = nil;
134 2277c5d7 2004-03-21 devnull Qid q;
135 2277c5d7 2004-03-21 devnull
136 2277c5d7 2004-03-21 devnull fs.tree = alloctree(nil, nil, DMDIR|0777, fsdestroyfile);
137 2277c5d7 2004-03-21 devnull q = fs.tree->root->qid;
138 2277c5d7 2004-03-21 devnull
139 2277c5d7 2004-03-21 devnull ARGBEGIN{
140 2277c5d7 2004-03-21 devnull case 'D':
141 2277c5d7 2004-03-21 devnull chatty9p++;
142 2277c5d7 2004-03-21 devnull break;
143 2277c5d7 2004-03-21 devnull case 's':
144 2277c5d7 2004-03-21 devnull srvname = EARGF(usage());
145 2277c5d7 2004-03-21 devnull break;
146 2277c5d7 2004-03-21 devnull case 'm':
147 2277c5d7 2004-03-21 devnull mtpt = EARGF(usage());
148 2277c5d7 2004-03-21 devnull break;
149 2277c5d7 2004-03-21 devnull default:
150 2277c5d7 2004-03-21 devnull usage();
151 2277c5d7 2004-03-21 devnull }ARGEND;
152 2277c5d7 2004-03-21 devnull
153 2277c5d7 2004-03-21 devnull if(argc)
154 2277c5d7 2004-03-21 devnull usage();
155 2277c5d7 2004-03-21 devnull
156 2277c5d7 2004-03-21 devnull if(chatty9p)
157 2277c5d7 2004-03-21 devnull fprint(2, "ramsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt);
158 2277c5d7 2004-03-21 devnull if(srvname == nil && mtpt == nil)
159 2277c5d7 2004-03-21 devnull sysfatal("you should at least specify a -s or -m option");
160 2277c5d7 2004-03-21 devnull
161 2277c5d7 2004-03-21 devnull postmountsrv(&fs, srvname, mtpt, MREPL|MCREATE);
162 2277c5d7 2004-03-21 devnull exits(0);
163 2277c5d7 2004-03-21 devnull }