coda_venus.c revision 1.1 1 1.1 rvb /*
2 1.1 rvb
3 1.1 rvb Coda: an Experimental Distributed File System
4 1.1 rvb Release 3.1
5 1.1 rvb
6 1.1 rvb Copyright (c) 1987-1998 Carnegie Mellon University
7 1.1 rvb All Rights Reserved
8 1.1 rvb
9 1.1 rvb Permission to use, copy, modify and distribute this software and its
10 1.1 rvb documentation is hereby granted, provided that both the copyright
11 1.1 rvb notice and this permission notice appear in all copies of the
12 1.1 rvb software, derivative works or modified versions, and any portions
13 1.1 rvb thereof, and that both notices appear in supporting documentation, and
14 1.1 rvb that credit is given to Carnegie Mellon University in all documents
15 1.1 rvb and publicity pertaining to direct or indirect use of this code or its
16 1.1 rvb derivatives.
17 1.1 rvb
18 1.1 rvb CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS,
19 1.1 rvb SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS
20 1.1 rvb FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON
21 1.1 rvb DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER
22 1.1 rvb RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF
23 1.1 rvb ANY DERIVATIVE WORK.
24 1.1 rvb
25 1.1 rvb Carnegie Mellon encourages users of this software to return any
26 1.1 rvb improvements or extensions that they make, and to grant Carnegie
27 1.1 rvb Mellon the rights to redistribute these changes without encumbrance.
28 1.1 rvb */
29 1.1 rvb
30 1.1 rvb /* $Header: /tank/opengrok/rsync2/NetBSD/src/sys/coda/coda_venus.c,v 1.1 1998/08/29 21:26:45 rvb Exp $ */
31 1.1 rvb
32 1.1 rvb #include <sys/param.h>
33 1.1 rvb #include <sys/systm.h>
34 1.1 rvb #include <sys/malloc.h>
35 1.1 rvb #include <sys/proc.h>
36 1.1 rvb #include <sys/select.h>
37 1.1 rvb #ifdef __FreeBSD_version
38 1.1 rvb #include <sys/ioccom.h>
39 1.1 rvb #else
40 1.1 rvb #include <sys/ioctl.h>
41 1.1 rvb #endif
42 1.1 rvb /* for CNV_OFLAGS below */
43 1.1 rvb #include <sys/fcntl.h>
44 1.1 rvb
45 1.1 rvb #include <cfs/coda.h>
46 1.1 rvb #include <cfs/cnode.h>
47 1.1 rvb #include <cfs/cfs_venus.h>
48 1.1 rvb #include <cfs/pioctl.h>
49 1.1 rvb
50 1.1 rvb #define DECL_NO_IN(name) \
51 1.1 rvb struct cfs_in_hdr *inp; \
52 1.1 rvb struct name ## _out *outp; \
53 1.1 rvb int name ## _size = sizeof (struct cfs_in_hdr); \
54 1.1 rvb int Isize = sizeof (struct cfs_in_hdr); \
55 1.1 rvb int Osize = sizeof (struct name ## _out); \
56 1.1 rvb int error
57 1.1 rvb
58 1.1 rvb #define DECL(name) \
59 1.1 rvb struct name ## _in *inp; \
60 1.1 rvb struct name ## _out *outp; \
61 1.1 rvb int name ## _size = sizeof (struct name ## _in); \
62 1.1 rvb int Isize = sizeof (struct name ## _in); \
63 1.1 rvb int Osize = sizeof (struct name ## _out); \
64 1.1 rvb int error
65 1.1 rvb
66 1.1 rvb #define DECL_NO_OUT(name) \
67 1.1 rvb struct name ## _in *inp; \
68 1.1 rvb struct cfs_out_hdr *outp; \
69 1.1 rvb int name ## _size = sizeof (struct name ## _in); \
70 1.1 rvb int Isize = sizeof (struct name ## _in); \
71 1.1 rvb int Osize = sizeof (struct cfs_out_hdr); \
72 1.1 rvb int error
73 1.1 rvb
74 1.1 rvb #define ALLOC_NO_IN(name) \
75 1.1 rvb if (Osize > name ## _size) \
76 1.1 rvb name ## _size = Osize; \
77 1.1 rvb CFS_ALLOC(inp, struct cfs_in_hdr *, name ## _size);\
78 1.1 rvb outp = (struct name ## _out *) inp
79 1.1 rvb
80 1.1 rvb #define ALLOC(name) \
81 1.1 rvb if (Osize > name ## _size) \
82 1.1 rvb name ## _size = Osize; \
83 1.1 rvb CFS_ALLOC(inp, struct name ## _in *, name ## _size);\
84 1.1 rvb outp = (struct name ## _out *) inp
85 1.1 rvb
86 1.1 rvb #define ALLOC_NO_OUT(name) \
87 1.1 rvb if (Osize > name ## _size) \
88 1.1 rvb name ## _size = Osize; \
89 1.1 rvb CFS_ALLOC(inp, struct name ## _in *, name ## _size);\
90 1.1 rvb outp = (struct cfs_out_hdr *) inp
91 1.1 rvb
92 1.1 rvb #define STRCPY(struc, name, len) \
93 1.1 rvb bcopy(name, (char *)inp + (int)inp->struc, len); \
94 1.1 rvb ((char*)inp + (int)inp->struc)[len++] = 0; \
95 1.1 rvb Isize += len
96 1.1 rvb
97 1.1 rvb #define INIT_IN(in, op, ident, p) \
98 1.1 rvb (in)->opcode = (op); \
99 1.1 rvb (in)->pid = p ? p->p_pid : -1; \
100 1.1 rvb (in)->pgid = p ? p->p_pgid : -1; \
101 1.1 rvb (in)->sid = (p && p->p_session && p->p_session->s_leader) ? (p->p_session->s_leader->p_pid) : -1; \
102 1.1 rvb if (ident != NOCRED) { \
103 1.1 rvb (in)->cred.cr_uid = ident->cr_uid; \
104 1.1 rvb (in)->cred.cr_groupid = ident->cr_gid; \
105 1.1 rvb } else { \
106 1.1 rvb bzero(&((in)->cred),sizeof(struct coda_cred)); \
107 1.1 rvb (in)->cred.cr_uid = -1; \
108 1.1 rvb (in)->cred.cr_groupid = -1; \
109 1.1 rvb } \
110 1.1 rvb
111 1.1 rvb #define CNV_OFLAG(to, from) \
112 1.1 rvb do { \
113 1.1 rvb to = 0; \
114 1.1 rvb if (from & FREAD) to |= C_O_READ; \
115 1.1 rvb if (from & FWRITE) to |= C_O_WRITE; \
116 1.1 rvb if (from & O_TRUNC) to |= C_O_TRUNC; \
117 1.1 rvb if (from & O_EXCL) to |= C_O_EXCL; \
118 1.1 rvb } while (0)
119 1.1 rvb
120 1.1 rvb #define CNV_VV2V_ATTR(top, fromp) \
121 1.1 rvb do { \
122 1.1 rvb (top)->va_type = (fromp)->va_type; \
123 1.1 rvb (top)->va_mode = (fromp)->va_mode; \
124 1.1 rvb (top)->va_nlink = (fromp)->va_nlink; \
125 1.1 rvb (top)->va_uid = (fromp)->va_uid; \
126 1.1 rvb (top)->va_gid = (fromp)->va_gid; \
127 1.1 rvb (top)->va_fsid = VNOVAL; \
128 1.1 rvb (top)->va_fileid = (fromp)->va_fileid; \
129 1.1 rvb (top)->va_size = (fromp)->va_size; \
130 1.1 rvb (top)->va_blocksize = (fromp)->va_blocksize; \
131 1.1 rvb (top)->va_atime = (fromp)->va_atime; \
132 1.1 rvb (top)->va_mtime = (fromp)->va_mtime; \
133 1.1 rvb (top)->va_ctime = (fromp)->va_ctime; \
134 1.1 rvb (top)->va_gen = (fromp)->va_gen; \
135 1.1 rvb (top)->va_flags = (fromp)->va_flags; \
136 1.1 rvb (top)->va_rdev = (fromp)->va_rdev; \
137 1.1 rvb (top)->va_bytes = (fromp)->va_bytes; \
138 1.1 rvb (top)->va_filerev = (fromp)->va_filerev; \
139 1.1 rvb (top)->va_vaflags = VNOVAL; \
140 1.1 rvb (top)->va_spare = VNOVAL; \
141 1.1 rvb } while (0)
142 1.1 rvb
143 1.1 rvb #define CNV_V2VV_ATTR(top, fromp) \
144 1.1 rvb do { \
145 1.1 rvb (top)->va_type = (fromp)->va_type; \
146 1.1 rvb (top)->va_mode = (fromp)->va_mode; \
147 1.1 rvb (top)->va_nlink = (fromp)->va_nlink; \
148 1.1 rvb (top)->va_uid = (fromp)->va_uid; \
149 1.1 rvb (top)->va_gid = (fromp)->va_gid; \
150 1.1 rvb (top)->va_fileid = (fromp)->va_fileid; \
151 1.1 rvb (top)->va_size = (fromp)->va_size; \
152 1.1 rvb (top)->va_blocksize = (fromp)->va_blocksize; \
153 1.1 rvb (top)->va_atime = (fromp)->va_atime; \
154 1.1 rvb (top)->va_mtime = (fromp)->va_mtime; \
155 1.1 rvb (top)->va_ctime = (fromp)->va_ctime; \
156 1.1 rvb (top)->va_gen = (fromp)->va_gen; \
157 1.1 rvb (top)->va_flags = (fromp)->va_flags; \
158 1.1 rvb (top)->va_rdev = (fromp)->va_rdev; \
159 1.1 rvb (top)->va_bytes = (fromp)->va_bytes; \
160 1.1 rvb (top)->va_filerev = (fromp)->va_filerev; \
161 1.1 rvb } while (0)
162 1.1 rvb
163 1.1 rvb
164 1.1 rvb int
165 1.1 rvb venus_root(void *mdp,
166 1.1 rvb struct ucred *cred, struct proc *p,
167 1.1 rvb /*out*/ ViceFid *VFid)
168 1.1 rvb {
169 1.1 rvb DECL_NO_IN(cfs_root); /* sets Isize & Osize */
170 1.1 rvb ALLOC_NO_IN(cfs_root); /* sets inp & outp */
171 1.1 rvb
172 1.1 rvb /* send the open to venus. */
173 1.1 rvb INIT_IN(inp, CFS_ROOT, cred, p);
174 1.1 rvb
175 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
176 1.1 rvb if (!error)
177 1.1 rvb *VFid = outp->VFid;
178 1.1 rvb
179 1.1 rvb CFS_FREE(inp, cfs_root_size);
180 1.1 rvb return error;
181 1.1 rvb }
182 1.1 rvb
183 1.1 rvb int
184 1.1 rvb venus_open(void *mdp, ViceFid *fid, int flag,
185 1.1 rvb struct ucred *cred, struct proc *p,
186 1.1 rvb /*out*/ dev_t *dev, ino_t *inode)
187 1.1 rvb {
188 1.1 rvb int cflag;
189 1.1 rvb DECL(cfs_open); /* sets Isize & Osize */
190 1.1 rvb ALLOC(cfs_open); /* sets inp & outp */
191 1.1 rvb
192 1.1 rvb /* send the open to venus. */
193 1.1 rvb INIT_IN(&inp->ih, CFS_OPEN, cred, p);
194 1.1 rvb inp->VFid = *fid;
195 1.1 rvb CNV_OFLAG(cflag, flag);
196 1.1 rvb inp->flags = cflag;
197 1.1 rvb
198 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
199 1.1 rvb if (!error) {
200 1.1 rvb *dev = outp->dev;
201 1.1 rvb *inode = outp->inode;
202 1.1 rvb }
203 1.1 rvb
204 1.1 rvb CFS_FREE(inp, cfs_open_size);
205 1.1 rvb return error;
206 1.1 rvb }
207 1.1 rvb
208 1.1 rvb int
209 1.1 rvb venus_close(void *mdp, ViceFid *fid, int flag,
210 1.1 rvb struct ucred *cred, struct proc *p)
211 1.1 rvb {
212 1.1 rvb int cflag;
213 1.1 rvb DECL_NO_OUT(cfs_close); /* sets Isize & Osize */
214 1.1 rvb ALLOC_NO_OUT(cfs_close); /* sets inp & outp */
215 1.1 rvb
216 1.1 rvb INIT_IN(&inp->ih, CFS_CLOSE, cred, p);
217 1.1 rvb inp->VFid = *fid;
218 1.1 rvb CNV_OFLAG(cflag, flag);
219 1.1 rvb inp->flags = cflag;
220 1.1 rvb
221 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
222 1.1 rvb
223 1.1 rvb CFS_FREE(inp, cfs_close_size);
224 1.1 rvb return error;
225 1.1 rvb }
226 1.1 rvb
227 1.1 rvb /*
228 1.1 rvb * these two calls will not exist!!! the container file is read/written
229 1.1 rvb * directly.
230 1.1 rvb */
231 1.1 rvb void
232 1.1 rvb venus_read(void)
233 1.1 rvb {
234 1.1 rvb }
235 1.1 rvb
236 1.1 rvb void
237 1.1 rvb venus_write(void)
238 1.1 rvb {
239 1.1 rvb }
240 1.1 rvb
241 1.1 rvb /*
242 1.1 rvb * this is a bit sad too. the ioctl's are for the control file, not for
243 1.1 rvb * normal files.
244 1.1 rvb */
245 1.1 rvb int
246 1.1 rvb venus_ioctl(void *mdp, ViceFid *fid,
247 1.1 rvb int com, int flag, caddr_t data,
248 1.1 rvb struct ucred *cred, struct proc *p)
249 1.1 rvb {
250 1.1 rvb DECL(cfs_ioctl); /* sets Isize & Osize */
251 1.1 rvb struct PioctlData *iap = (struct PioctlData *)data;
252 1.1 rvb int tmp;
253 1.1 rvb
254 1.1 rvb cfs_ioctl_size = VC_MAXMSGSIZE;
255 1.1 rvb ALLOC(cfs_ioctl); /* sets inp & outp */
256 1.1 rvb
257 1.1 rvb INIT_IN(&inp->ih, CFS_IOCTL, cred, p);
258 1.1 rvb inp->VFid = *fid;
259 1.1 rvb
260 1.1 rvb /* command was mutated by increasing its size field to reflect the
261 1.1 rvb * path and follow args. we need to subtract that out before sending
262 1.1 rvb * the command to venus.
263 1.1 rvb */
264 1.1 rvb inp->cmd = (com & ~(IOCPARM_MASK << 16));
265 1.1 rvb tmp = ((com >> 16) & IOCPARM_MASK) - sizeof (char *) - sizeof (int);
266 1.1 rvb inp->cmd |= (tmp & IOCPARM_MASK) << 16;
267 1.1 rvb
268 1.1 rvb inp->rwflag = flag;
269 1.1 rvb inp->len = iap->vi.in_size;
270 1.1 rvb inp->data = (char *)(sizeof (struct cfs_ioctl_in));
271 1.1 rvb
272 1.1 rvb error = copyin(iap->vi.in, (char*)inp + (int)inp->data,
273 1.1 rvb iap->vi.in_size);
274 1.1 rvb if (error) {
275 1.1 rvb CFS_FREE(inp, cfs_ioctl_size);
276 1.1 rvb return(error);
277 1.1 rvb }
278 1.1 rvb
279 1.1 rvb Osize = VC_MAXMSGSIZE;
280 1.1 rvb error = cfscall(mdp, Isize + iap->vi.in_size, &Osize, (char *)inp);
281 1.1 rvb
282 1.1 rvb /* copy out the out buffer. */
283 1.1 rvb if (!error) {
284 1.1 rvb if (outp->len > iap->vi.out_size) {
285 1.1 rvb error = EINVAL;
286 1.1 rvb } else {
287 1.1 rvb error = copyout((char *)outp + (int)outp->data,
288 1.1 rvb iap->vi.out, iap->vi.out_size);
289 1.1 rvb }
290 1.1 rvb }
291 1.1 rvb
292 1.1 rvb CFS_FREE(inp, cfs_ioctl_size);
293 1.1 rvb return error;
294 1.1 rvb }
295 1.1 rvb
296 1.1 rvb int
297 1.1 rvb venus_getattr(void *mdp, ViceFid *fid,
298 1.1 rvb struct ucred *cred, struct proc *p,
299 1.1 rvb /*out*/ struct vattr *vap)
300 1.1 rvb {
301 1.1 rvb DECL(cfs_getattr); /* sets Isize & Osize */
302 1.1 rvb ALLOC(cfs_getattr); /* sets inp & outp */
303 1.1 rvb
304 1.1 rvb /* send the open to venus. */
305 1.1 rvb INIT_IN(&inp->ih, CFS_GETATTR, cred, p);
306 1.1 rvb inp->VFid = *fid;
307 1.1 rvb
308 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
309 1.1 rvb if (!error) {
310 1.1 rvb CNV_VV2V_ATTR(vap, &outp->attr);
311 1.1 rvb }
312 1.1 rvb
313 1.1 rvb CFS_FREE(inp, cfs_getattr_size);
314 1.1 rvb return error;
315 1.1 rvb }
316 1.1 rvb
317 1.1 rvb int
318 1.1 rvb venus_setattr(void *mdp, ViceFid *fid, struct vattr *vap,
319 1.1 rvb struct ucred *cred, struct proc *p)
320 1.1 rvb {
321 1.1 rvb DECL_NO_OUT(cfs_setattr); /* sets Isize & Osize */
322 1.1 rvb ALLOC_NO_OUT(cfs_setattr); /* sets inp & outp */
323 1.1 rvb
324 1.1 rvb /* send the open to venus. */
325 1.1 rvb INIT_IN(&inp->ih, CFS_SETATTR, cred, p);
326 1.1 rvb inp->VFid = *fid;
327 1.1 rvb CNV_V2VV_ATTR(&inp->attr, vap);
328 1.1 rvb
329 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
330 1.1 rvb
331 1.1 rvb CFS_FREE(inp, cfs_setattr_size);
332 1.1 rvb return error;
333 1.1 rvb }
334 1.1 rvb
335 1.1 rvb int
336 1.1 rvb venus_access(void *mdp, ViceFid *fid, int mode,
337 1.1 rvb struct ucred *cred, struct proc *p)
338 1.1 rvb {
339 1.1 rvb DECL_NO_OUT(cfs_access); /* sets Isize & Osize */
340 1.1 rvb ALLOC_NO_OUT(cfs_access); /* sets inp & outp */
341 1.1 rvb
342 1.1 rvb /* send the open to venus. */
343 1.1 rvb INIT_IN(&inp->ih, CFS_ACCESS, cred, p);
344 1.1 rvb inp->VFid = *fid;
345 1.1 rvb #ifdef NetBSD1_3
346 1.1 rvb inp->flags = mode;
347 1.1 rvb #else
348 1.1 rvb inp->flags = mode>>6;
349 1.1 rvb #endif
350 1.1 rvb
351 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
352 1.1 rvb
353 1.1 rvb CFS_FREE(inp, cfs_access_size);
354 1.1 rvb return error;
355 1.1 rvb }
356 1.1 rvb
357 1.1 rvb int
358 1.1 rvb venus_readlink(void *mdp, ViceFid *fid,
359 1.1 rvb struct ucred *cred, struct proc *p,
360 1.1 rvb /*out*/ char **str, int *len)
361 1.1 rvb {
362 1.1 rvb DECL(cfs_readlink); /* sets Isize & Osize */
363 1.1 rvb cfs_readlink_size += CFS_MAXPATHLEN;
364 1.1 rvb ALLOC(cfs_readlink); /* sets inp & outp */
365 1.1 rvb
366 1.1 rvb /* send the open to venus. */
367 1.1 rvb INIT_IN(&inp->ih, CFS_READLINK, cred, p);
368 1.1 rvb inp->VFid = *fid;
369 1.1 rvb
370 1.1 rvb Osize += CFS_MAXPATHLEN;
371 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
372 1.1 rvb if (!error) {
373 1.1 rvb CFS_ALLOC(*str, char *, outp->count);
374 1.1 rvb *len = outp->count;
375 1.1 rvb bcopy((char *)outp + (int)outp->data, *str, *len);
376 1.1 rvb }
377 1.1 rvb
378 1.1 rvb CFS_FREE(inp, cfs_readlink_size);
379 1.1 rvb return error;
380 1.1 rvb }
381 1.1 rvb
382 1.1 rvb int
383 1.1 rvb venus_fsync(void *mdp, ViceFid *fid,
384 1.1 rvb struct ucred *cred, struct proc *p)
385 1.1 rvb {
386 1.1 rvb DECL_NO_OUT(cfs_fsync); /* sets Isize & Osize */
387 1.1 rvb ALLOC_NO_OUT(cfs_fsync); /* sets inp & outp */
388 1.1 rvb
389 1.1 rvb /* send the open to venus. */
390 1.1 rvb INIT_IN(&inp->ih, CFS_FSYNC, cred, p);
391 1.1 rvb inp->VFid = *fid;
392 1.1 rvb
393 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
394 1.1 rvb
395 1.1 rvb CFS_FREE(inp, cfs_fsync_size);
396 1.1 rvb return error;
397 1.1 rvb }
398 1.1 rvb
399 1.1 rvb int
400 1.1 rvb venus_lookup(void *mdp, ViceFid *fid,
401 1.1 rvb const char *nm, int len,
402 1.1 rvb struct ucred *cred, struct proc *p,
403 1.1 rvb /*out*/ ViceFid *VFid, int *vtype)
404 1.1 rvb {
405 1.1 rvb DECL(cfs_lookup); /* sets Isize & Osize */
406 1.1 rvb cfs_lookup_size += len + 1;
407 1.1 rvb ALLOC(cfs_lookup); /* sets inp & outp */
408 1.1 rvb
409 1.1 rvb /* send the open to venus. */
410 1.1 rvb INIT_IN(&inp->ih, CFS_LOOKUP, cred, p);
411 1.1 rvb inp->VFid = *fid;
412 1.1 rvb
413 1.1 rvb inp->name = Isize;
414 1.1 rvb STRCPY(name, nm, len); /* increments Isize */
415 1.1 rvb
416 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
417 1.1 rvb if (!error) {
418 1.1 rvb *VFid = outp->VFid;
419 1.1 rvb *vtype = outp->vtype;
420 1.1 rvb }
421 1.1 rvb
422 1.1 rvb CFS_FREE(inp, cfs_lookup_size);
423 1.1 rvb return error;
424 1.1 rvb }
425 1.1 rvb
426 1.1 rvb int
427 1.1 rvb venus_create(void *mdp, ViceFid *fid,
428 1.1 rvb const char *nm, int len, int exclusive, int mode, struct vattr *va,
429 1.1 rvb struct ucred *cred, struct proc *p,
430 1.1 rvb /*out*/ ViceFid *VFid, struct vattr *attr)
431 1.1 rvb {
432 1.1 rvb DECL(cfs_create); /* sets Isize & Osize */
433 1.1 rvb cfs_create_size += len + 1;
434 1.1 rvb ALLOC(cfs_create); /* sets inp & outp */
435 1.1 rvb
436 1.1 rvb /* send the open to venus. */
437 1.1 rvb INIT_IN(&inp->ih, CFS_CREATE, cred, p);
438 1.1 rvb inp->VFid = *fid;
439 1.1 rvb inp->excl = exclusive ? C_O_EXCL : 0;
440 1.1 rvb #ifdef NetBSD1_3
441 1.1 rvb inp->mode = mode<<6;
442 1.1 rvb #else
443 1.1 rvb inp->mode = mode;
444 1.1 rvb #endif
445 1.1 rvb CNV_V2VV_ATTR(&inp->attr, va);
446 1.1 rvb
447 1.1 rvb inp->name = Isize;
448 1.1 rvb STRCPY(name, nm, len); /* increments Isize */
449 1.1 rvb
450 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
451 1.1 rvb if (!error) {
452 1.1 rvb *VFid = outp->VFid;
453 1.1 rvb CNV_VV2V_ATTR(attr, &outp->attr);
454 1.1 rvb }
455 1.1 rvb
456 1.1 rvb CFS_FREE(inp, cfs_create_size);
457 1.1 rvb return error;
458 1.1 rvb }
459 1.1 rvb
460 1.1 rvb int
461 1.1 rvb venus_remove(void *mdp, ViceFid *fid,
462 1.1 rvb const char *nm, int len,
463 1.1 rvb struct ucred *cred, struct proc *p)
464 1.1 rvb {
465 1.1 rvb DECL_NO_OUT(cfs_remove); /* sets Isize & Osize */
466 1.1 rvb cfs_remove_size += len + 1;
467 1.1 rvb ALLOC_NO_OUT(cfs_remove); /* sets inp & outp */
468 1.1 rvb
469 1.1 rvb /* send the open to venus. */
470 1.1 rvb INIT_IN(&inp->ih, CFS_REMOVE, cred, p);
471 1.1 rvb inp->VFid = *fid;
472 1.1 rvb
473 1.1 rvb inp->name = Isize;
474 1.1 rvb STRCPY(name, nm, len); /* increments Isize */
475 1.1 rvb
476 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
477 1.1 rvb
478 1.1 rvb CFS_FREE(inp, cfs_remove_size);
479 1.1 rvb return error;
480 1.1 rvb }
481 1.1 rvb
482 1.1 rvb int
483 1.1 rvb venus_link(void *mdp, ViceFid *fid, ViceFid *tfid,
484 1.1 rvb const char *nm, int len,
485 1.1 rvb struct ucred *cred, struct proc *p)
486 1.1 rvb {
487 1.1 rvb DECL_NO_OUT(cfs_link); /* sets Isize & Osize */
488 1.1 rvb cfs_link_size += len + 1;
489 1.1 rvb ALLOC_NO_OUT(cfs_link); /* sets inp & outp */
490 1.1 rvb
491 1.1 rvb /* send the open to venus. */
492 1.1 rvb INIT_IN(&inp->ih, CFS_LINK, cred, p);
493 1.1 rvb inp->sourceFid = *fid;
494 1.1 rvb inp->destFid = *tfid;
495 1.1 rvb
496 1.1 rvb inp->tname = Isize;
497 1.1 rvb STRCPY(tname, nm, len); /* increments Isize */
498 1.1 rvb
499 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
500 1.1 rvb
501 1.1 rvb CFS_FREE(inp, cfs_link_size);
502 1.1 rvb return error;
503 1.1 rvb }
504 1.1 rvb
505 1.1 rvb int
506 1.1 rvb venus_rename(void *mdp, ViceFid *fid, ViceFid *tfid,
507 1.1 rvb const char *nm, int len, const char *tnm, int tlen,
508 1.1 rvb struct ucred *cred, struct proc *p)
509 1.1 rvb {
510 1.1 rvb DECL_NO_OUT(cfs_rename); /* sets Isize & Osize */
511 1.1 rvb cfs_rename_size += len + 1 + tlen + 1;
512 1.1 rvb ALLOC_NO_OUT(cfs_rename); /* sets inp & outp */
513 1.1 rvb
514 1.1 rvb /* send the open to venus. */
515 1.1 rvb INIT_IN(&inp->ih, CFS_RENAME, cred, p);
516 1.1 rvb inp->sourceFid = *fid;
517 1.1 rvb inp->destFid = *tfid;
518 1.1 rvb
519 1.1 rvb inp->srcname = Isize;
520 1.1 rvb STRCPY(srcname, nm, len); /* increments Isize */
521 1.1 rvb
522 1.1 rvb inp->destname = Isize;
523 1.1 rvb STRCPY(destname, tnm, tlen); /* increments Isize */
524 1.1 rvb
525 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
526 1.1 rvb
527 1.1 rvb CFS_FREE(inp, cfs_rename_size);
528 1.1 rvb return error;
529 1.1 rvb }
530 1.1 rvb
531 1.1 rvb int
532 1.1 rvb venus_mkdir(void *mdp, ViceFid *fid,
533 1.1 rvb const char *nm, int len, struct vattr *va,
534 1.1 rvb struct ucred *cred, struct proc *p,
535 1.1 rvb /*out*/ ViceFid *VFid, struct vattr *ova)
536 1.1 rvb {
537 1.1 rvb DECL(cfs_mkdir); /* sets Isize & Osize */
538 1.1 rvb cfs_mkdir_size += len + 1;
539 1.1 rvb ALLOC(cfs_mkdir); /* sets inp & outp */
540 1.1 rvb
541 1.1 rvb /* send the open to venus. */
542 1.1 rvb INIT_IN(&inp->ih, CFS_MKDIR, cred, p);
543 1.1 rvb inp->VFid = *fid;
544 1.1 rvb CNV_V2VV_ATTR(&inp->attr, va);
545 1.1 rvb
546 1.1 rvb inp->name = Isize;
547 1.1 rvb STRCPY(name, nm, len); /* increments Isize */
548 1.1 rvb
549 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
550 1.1 rvb if (!error) {
551 1.1 rvb *VFid = outp->VFid;
552 1.1 rvb CNV_VV2V_ATTR(ova, &outp->attr);
553 1.1 rvb }
554 1.1 rvb
555 1.1 rvb CFS_FREE(inp, cfs_mkdir_size);
556 1.1 rvb return error;
557 1.1 rvb }
558 1.1 rvb
559 1.1 rvb int
560 1.1 rvb venus_rmdir(void *mdp, ViceFid *fid,
561 1.1 rvb const char *nm, int len,
562 1.1 rvb struct ucred *cred, struct proc *p)
563 1.1 rvb {
564 1.1 rvb DECL_NO_OUT(cfs_rmdir); /* sets Isize & Osize */
565 1.1 rvb cfs_rmdir_size += len + 1;
566 1.1 rvb ALLOC_NO_OUT(cfs_rmdir); /* sets inp & outp */
567 1.1 rvb
568 1.1 rvb /* send the open to venus. */
569 1.1 rvb INIT_IN(&inp->ih, CFS_RMDIR, cred, p);
570 1.1 rvb inp->VFid = *fid;
571 1.1 rvb
572 1.1 rvb inp->name = Isize;
573 1.1 rvb STRCPY(name, nm, len); /* increments Isize */
574 1.1 rvb
575 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
576 1.1 rvb
577 1.1 rvb CFS_FREE(inp, cfs_rmdir_size);
578 1.1 rvb return error;
579 1.1 rvb }
580 1.1 rvb
581 1.1 rvb int
582 1.1 rvb venus_symlink(void *mdp, ViceFid *fid,
583 1.1 rvb const char *lnm, int llen, const char *nm, int len, struct vattr *va,
584 1.1 rvb struct ucred *cred, struct proc *p)
585 1.1 rvb {
586 1.1 rvb DECL_NO_OUT(cfs_symlink); /* sets Isize & Osize */
587 1.1 rvb cfs_symlink_size += llen + 1 + len + 1;
588 1.1 rvb ALLOC_NO_OUT(cfs_symlink); /* sets inp & outp */
589 1.1 rvb
590 1.1 rvb /* send the open to venus. */
591 1.1 rvb INIT_IN(&inp->ih, CFS_SYMLINK, cred, p);
592 1.1 rvb inp->VFid = *fid;
593 1.1 rvb CNV_V2VV_ATTR(&inp->attr, va);
594 1.1 rvb
595 1.1 rvb inp->srcname = Isize;
596 1.1 rvb STRCPY(srcname, lnm, llen); /* increments Isize */
597 1.1 rvb
598 1.1 rvb inp->tname = Isize;
599 1.1 rvb STRCPY(tname, nm, len); /* increments Isize */
600 1.1 rvb
601 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
602 1.1 rvb
603 1.1 rvb CFS_FREE(inp, cfs_symlink_size);
604 1.1 rvb return error;
605 1.1 rvb }
606 1.1 rvb
607 1.1 rvb int
608 1.1 rvb venus_readdir(void *mdp, ViceFid *fid,
609 1.1 rvb int count, int offset,
610 1.1 rvb struct ucred *cred, struct proc *p,
611 1.1 rvb /*out*/ char *buffer, int *len)
612 1.1 rvb {
613 1.1 rvb DECL(cfs_readdir); /* sets Isize & Osize */
614 1.1 rvb cfs_readdir_size = VC_MAXMSGSIZE;
615 1.1 rvb ALLOC(cfs_readdir); /* sets inp & outp */
616 1.1 rvb
617 1.1 rvb /* send the open to venus. */
618 1.1 rvb INIT_IN(&inp->ih, CFS_READDIR, cred, p);
619 1.1 rvb inp->VFid = *fid;
620 1.1 rvb inp->count = count;
621 1.1 rvb inp->offset = offset;
622 1.1 rvb
623 1.1 rvb Osize = VC_MAXMSGSIZE;
624 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
625 1.1 rvb if (!error) {
626 1.1 rvb bcopy((char *)outp + (int)outp->data, buffer, outp->size);
627 1.1 rvb *len = outp->size;
628 1.1 rvb }
629 1.1 rvb
630 1.1 rvb CFS_FREE(inp, cfs_readdir_size);
631 1.1 rvb return error;
632 1.1 rvb }
633 1.1 rvb
634 1.1 rvb int
635 1.1 rvb venus_fhtovp(void *mdp, ViceFid *fid,
636 1.1 rvb struct ucred *cred, struct proc *p,
637 1.1 rvb /*out*/ ViceFid *VFid, int *vtype)
638 1.1 rvb {
639 1.1 rvb DECL(cfs_vget); /* sets Isize & Osize */
640 1.1 rvb ALLOC(cfs_vget); /* sets inp & outp */
641 1.1 rvb
642 1.1 rvb /* Send the open to Venus. */
643 1.1 rvb INIT_IN(&inp->ih, CFS_VGET, cred, p);
644 1.1 rvb inp->VFid = *fid;
645 1.1 rvb
646 1.1 rvb error = cfscall(mdp, Isize, &Osize, (char *)inp);
647 1.1 rvb if (!error) {
648 1.1 rvb *VFid = outp->VFid;
649 1.1 rvb *vtype = outp->vtype;
650 1.1 rvb }
651 1.1 rvb
652 1.1 rvb CFS_FREE(inp, cfs_vget_size);
653 1.1 rvb return error;
654 1.1 rvb }
655