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 <fcall.h>
4 2277c5d7 2004-03-21 devnull #include <thread.h>
5 2277c5d7 2004-03-21 devnull #include <9p.h>
6 2277c5d7 2004-03-21 devnull
7 2277c5d7 2004-03-21 devnull static char Ebad[] = "something bad happened";
8 2277c5d7 2004-03-21 devnull static char Enomem[] = "no memory";
9 2277c5d7 2004-03-21 devnull
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;
14 2277c5d7 2004-03-21 devnull };
15 2277c5d7 2004-03-21 devnull
16 2277c5d7 2004-03-21 devnull void
17 2277c5d7 2004-03-21 devnull fsread(Req *r)
18 2277c5d7 2004-03-21 devnull {
19 2277c5d7 2004-03-21 devnull Ramfile *rf;
20 2277c5d7 2004-03-21 devnull vlong offset;
21 2277c5d7 2004-03-21 devnull long count;
22 2277c5d7 2004-03-21 devnull
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;
26 2277c5d7 2004-03-21 devnull
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);
31 2277c5d7 2004-03-21 devnull return;
32 2277c5d7 2004-03-21 devnull }
33 2277c5d7 2004-03-21 devnull
34 2277c5d7 2004-03-21 devnull if(offset+count >= rf->ndata)
35 2277c5d7 2004-03-21 devnull count = rf->ndata - offset;
36 2277c5d7 2004-03-21 devnull
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);
40 2277c5d7 2004-03-21 devnull }
41 2277c5d7 2004-03-21 devnull
42 2277c5d7 2004-03-21 devnull void
43 2277c5d7 2004-03-21 devnull fswrite(Req *r)
44 2277c5d7 2004-03-21 devnull {
45 2277c5d7 2004-03-21 devnull void *v;
46 2277c5d7 2004-03-21 devnull Ramfile *rf;
47 2277c5d7 2004-03-21 devnull vlong offset;
48 2277c5d7 2004-03-21 devnull long count;
49 2277c5d7 2004-03-21 devnull
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;
53 2277c5d7 2004-03-21 devnull
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);
58 2277c5d7 2004-03-21 devnull return;
59 2277c5d7 2004-03-21 devnull }
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;
63 2277c5d7 2004-03-21 devnull }
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);
67 2277c5d7 2004-03-21 devnull }
68 2277c5d7 2004-03-21 devnull
69 2277c5d7 2004-03-21 devnull void
70 2277c5d7 2004-03-21 devnull fscreate(Req *r)
71 2277c5d7 2004-03-21 devnull {
72 2277c5d7 2004-03-21 devnull Ramfile *rf;
73 2277c5d7 2004-03-21 devnull File *f;
74 2277c5d7 2004-03-21 devnull
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);
81 2277c5d7 2004-03-21 devnull return;
82 2277c5d7 2004-03-21 devnull }
83 2277c5d7 2004-03-21 devnull respond(r, Ebad);
84 2277c5d7 2004-03-21 devnull }
85 2277c5d7 2004-03-21 devnull
86 2277c5d7 2004-03-21 devnull void
87 2277c5d7 2004-03-21 devnull fsopen(Req *r)
88 2277c5d7 2004-03-21 devnull {
89 2277c5d7 2004-03-21 devnull Ramfile *rf;
90 2277c5d7 2004-03-21 devnull
91 2277c5d7 2004-03-21 devnull rf = r->fid->file->aux;
92 2277c5d7 2004-03-21 devnull
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;
96 2277c5d7 2004-03-21 devnull }
97 2277c5d7 2004-03-21 devnull
98 2277c5d7 2004-03-21 devnull respond(r, nil);
99 2277c5d7 2004-03-21 devnull }
100 2277c5d7 2004-03-21 devnull
101 2277c5d7 2004-03-21 devnull void
102 2277c5d7 2004-03-21 devnull fsdestroyfile(File *f)
103 2277c5d7 2004-03-21 devnull {
104 2277c5d7 2004-03-21 devnull Ramfile *rf;
105 2277c5d7 2004-03-21 devnull
106 cbeb0b26 2006-04-01 devnull /*fprint(2, "clunk\n"); */
107 2277c5d7 2004-03-21 devnull rf = f->aux;
108 2277c5d7 2004-03-21 devnull if(rf){
109 2277c5d7 2004-03-21 devnull free(rf->data);
110 2277c5d7 2004-03-21 devnull free(rf);
111 2277c5d7 2004-03-21 devnull }
112 2277c5d7 2004-03-21 devnull }
113 2277c5d7 2004-03-21 devnull
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,
119 2277c5d7 2004-03-21 devnull };
120 2277c5d7 2004-03-21 devnull
121 2277c5d7 2004-03-21 devnull void
122 2277c5d7 2004-03-21 devnull usage(void)
123 2277c5d7 2004-03-21 devnull {
124 2277c5d7 2004-03-21 devnull fprint(2, "usage: ramfs [-D] [-s srvname] [-m mtpt]\n");
125 ce1e3a79 2008-05-06 rsc threadexitsall("usage");
126 2277c5d7 2004-03-21 devnull }
127 2277c5d7 2004-03-21 devnull
128 b3a20a96 2020-12-30 rsc int
129 b3a20a96 2020-12-30 rsc threadmaybackground(void)
130 b3a20a96 2020-12-30 rsc {
131 b3a20a96 2020-12-30 rsc return 1;
132 b3a20a96 2020-12-30 rsc }
133 b3a20a96 2020-12-30 rsc
134 2277c5d7 2004-03-21 devnull void
135 ce1e3a79 2008-05-06 rsc threadmain(int argc, char **argv)
136 2277c5d7 2004-03-21 devnull {
137 2277c5d7 2004-03-21 devnull char *srvname = nil;
138 2277c5d7 2004-03-21 devnull char *mtpt = nil;
139 2277c5d7 2004-03-21 devnull Qid q;
140 2277c5d7 2004-03-21 devnull
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;
143 2277c5d7 2004-03-21 devnull
144 2277c5d7 2004-03-21 devnull ARGBEGIN{
145 2277c5d7 2004-03-21 devnull case 'D':
146 2277c5d7 2004-03-21 devnull chatty9p++;
147 2277c5d7 2004-03-21 devnull break;
148 2277c5d7 2004-03-21 devnull case 's':
149 2277c5d7 2004-03-21 devnull srvname = EARGF(usage());
150 2277c5d7 2004-03-21 devnull break;
151 2277c5d7 2004-03-21 devnull case 'm':
152 2277c5d7 2004-03-21 devnull mtpt = EARGF(usage());
153 2277c5d7 2004-03-21 devnull break;
154 2277c5d7 2004-03-21 devnull default:
155 2277c5d7 2004-03-21 devnull usage();
156 2277c5d7 2004-03-21 devnull }ARGEND;
157 2277c5d7 2004-03-21 devnull
158 2277c5d7 2004-03-21 devnull if(argc)
159 2277c5d7 2004-03-21 devnull usage();
160 2277c5d7 2004-03-21 devnull
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");
165 2277c5d7 2004-03-21 devnull
166 ce1e3a79 2008-05-06 rsc threadpostmountsrv(&fs, srvname, mtpt, MREPL|MCREATE);
167 ce1e3a79 2008-05-06 rsc threadexits(0);
168 2277c5d7 2004-03-21 devnull }