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 <fcall.h>
4 2277c5d7 2004-03-21 devnull #include <thread.h>
5 2277c5d7 2004-03-21 devnull #include <9p.h>
7 2277c5d7 2004-03-21 devnull static char Ebad[] = "something bad happened";
8 2277c5d7 2004-03-21 devnull static char Enomem[] = "no memory";
10 2277c5d7 2004-03-21 devnull typedef struct Ramfile Ramfile;
11 2277c5d7 2004-03-21 devnull struct Ramfile {
12 2277c5d7 2004-03-21 devnull char *data;
13 2277c5d7 2004-03-21 devnull int ndata;
17 2277c5d7 2004-03-21 devnull fsread(Req *r)
19 2277c5d7 2004-03-21 devnull Ramfile *rf;
20 2277c5d7 2004-03-21 devnull vlong offset;
21 2277c5d7 2004-03-21 devnull long count;
23 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
24 2277c5d7 2004-03-21 devnull offset = r->ifcall.offset;
25 2277c5d7 2004-03-21 devnull count = r->ifcall.count;
27 cbeb0b26 2006-04-01 devnull /*print("read %ld %lld\n", *count, offset); */
28 2277c5d7 2004-03-21 devnull if(offset >= rf->ndata){
29 2277c5d7 2004-03-21 devnull r->ofcall.count = 0;
30 2277c5d7 2004-03-21 devnull respond(r, nil);
34 2277c5d7 2004-03-21 devnull if(offset+count >= rf->ndata)
35 2277c5d7 2004-03-21 devnull count = rf->ndata - offset;
37 2277c5d7 2004-03-21 devnull memmove(r->ofcall.data, rf->data+offset, count);
38 2277c5d7 2004-03-21 devnull r->ofcall.count = count;
39 2277c5d7 2004-03-21 devnull respond(r, nil);
43 2277c5d7 2004-03-21 devnull fswrite(Req *r)
46 2277c5d7 2004-03-21 devnull Ramfile *rf;
47 2277c5d7 2004-03-21 devnull vlong offset;
48 2277c5d7 2004-03-21 devnull long count;
50 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
51 2277c5d7 2004-03-21 devnull offset = r->ifcall.offset;
52 2277c5d7 2004-03-21 devnull count = r->ifcall.count;
54 2277c5d7 2004-03-21 devnull if(offset+count >= rf->ndata){
55 2277c5d7 2004-03-21 devnull v = realloc(rf->data, offset+count);
56 2277c5d7 2004-03-21 devnull if(v == nil){
57 2277c5d7 2004-03-21 devnull respond(r, Enomem);
60 2277c5d7 2004-03-21 devnull rf->data = v;
61 2277c5d7 2004-03-21 devnull rf->ndata = offset+count;
62 ce1e3a79 2008-05-06 rsc r->fid->file->dir.length = rf->ndata;
64 2277c5d7 2004-03-21 devnull memmove(rf->data+offset, r->ifcall.data, count);
65 2277c5d7 2004-03-21 devnull r->ofcall.count = count;
66 2277c5d7 2004-03-21 devnull respond(r, nil);
70 2277c5d7 2004-03-21 devnull fscreate(Req *r)
72 2277c5d7 2004-03-21 devnull Ramfile *rf;
75 2277c5d7 2004-03-21 devnull if(f = createfile(r->fid->file, r->ifcall.name, r->fid->uid, r->ifcall.perm, nil)){
76 2277c5d7 2004-03-21 devnull rf = emalloc9p(sizeof *rf);
77 2277c5d7 2004-03-21 devnull f->aux = rf;
78 2277c5d7 2004-03-21 devnull r->fid->file = f;
79 ce1e3a79 2008-05-06 rsc r->ofcall.qid = f->dir.qid;
80 2277c5d7 2004-03-21 devnull respond(r, nil);
83 2277c5d7 2004-03-21 devnull respond(r, Ebad);
87 2277c5d7 2004-03-21 devnull fsopen(Req *r)
89 2277c5d7 2004-03-21 devnull Ramfile *rf;
91 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
93 2277c5d7 2004-03-21 devnull if(rf && (r->ifcall.mode&OTRUNC)){
94 2277c5d7 2004-03-21 devnull rf->ndata = 0;
95 ce1e3a79 2008-05-06 rsc r->fid->file->dir.length = 0;
98 2277c5d7 2004-03-21 devnull respond(r, nil);
102 2277c5d7 2004-03-21 devnull fsdestroyfile(File *f)
104 2277c5d7 2004-03-21 devnull Ramfile *rf;
106 cbeb0b26 2006-04-01 devnull /*fprint(2, "clunk\n"); */
107 2277c5d7 2004-03-21 devnull rf = f->aux;
109 2277c5d7 2004-03-21 devnull free(rf->data);
110 2277c5d7 2004-03-21 devnull free(rf);
114 2277c5d7 2004-03-21 devnull Srv fs = {
115 2277c5d7 2004-03-21 devnull .open= fsopen,
116 2277c5d7 2004-03-21 devnull .read= fsread,
117 2277c5d7 2004-03-21 devnull .write= fswrite,
118 2277c5d7 2004-03-21 devnull .create= fscreate,
122 2277c5d7 2004-03-21 devnull usage(void)
124 2277c5d7 2004-03-21 devnull fprint(2, "usage: ramfs [-D] [-s srvname] [-m mtpt]\n");
125 ce1e3a79 2008-05-06 rsc threadexitsall("usage");
129 b3a20a96 2020-12-30 rsc threadmaybackground(void)
135 ce1e3a79 2008-05-06 rsc threadmain(int argc, char **argv)
137 2277c5d7 2004-03-21 devnull char *srvname = nil;
138 2277c5d7 2004-03-21 devnull char *mtpt = nil;
141 2277c5d7 2004-03-21 devnull fs.tree = alloctree(nil, nil, DMDIR|0777, fsdestroyfile);
142 ce1e3a79 2008-05-06 rsc q = fs.tree->root->dir.qid;
144 2277c5d7 2004-03-21 devnull ARGBEGIN{
145 2277c5d7 2004-03-21 devnull case 'D':
146 2277c5d7 2004-03-21 devnull chatty9p++;
148 2277c5d7 2004-03-21 devnull case 's':
149 2277c5d7 2004-03-21 devnull srvname = EARGF(usage());
151 2277c5d7 2004-03-21 devnull case 'm':
152 2277c5d7 2004-03-21 devnull mtpt = EARGF(usage());
154 2277c5d7 2004-03-21 devnull default:
155 2277c5d7 2004-03-21 devnull usage();
156 2277c5d7 2004-03-21 devnull }ARGEND;
158 2277c5d7 2004-03-21 devnull if(argc)
159 2277c5d7 2004-03-21 devnull usage();
161 2277c5d7 2004-03-21 devnull if(chatty9p)
162 2277c5d7 2004-03-21 devnull fprint(2, "ramsrv.nopipe %d srvname %s mtpt %s\n", fs.nopipe, srvname, mtpt);
163 2277c5d7 2004-03-21 devnull if(srvname == nil && mtpt == nil)
164 2277c5d7 2004-03-21 devnull sysfatal("you should at least specify a -s or -m option");
166 ce1e3a79 2008-05-06 rsc threadpostmountsrv(&fs, srvname, mtpt, MREPL|MCREATE);
167 ce1e3a79 2008-05-06 rsc threadexits(0);