1 | /* $NetBSD: coda.h,v 1.19 2015/09/06 06:00:59 dholland Exp $ */ |
2 | |
3 | /* |
4 | |
5 | Coda: an Experimental Distributed File System |
6 | Release 4.0 |
7 | |
8 | Copyright (c) 1987-1999 Carnegie Mellon University |
9 | All Rights Reserved |
10 | |
11 | Permission to use, copy, modify and distribute this software and its |
12 | documentation is hereby granted, provided that both the copyright |
13 | notice and this permission notice appear in all copies of the |
14 | software, derivative works or modified versions, and any portions |
15 | thereof, and that both notices appear in supporting documentation, and |
16 | that credit is given to Carnegie Mellon University in all documents |
17 | and publicity pertaining to direct or indirect use of this code or its |
18 | derivatives. |
19 | |
20 | CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS, |
21 | SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS |
22 | FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON |
23 | DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER |
24 | RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF |
25 | ANY DERIVATIVE WORK. |
26 | |
27 | Carnegie Mellon encourages users of this software to return any |
28 | improvements or extensions that they make, and to grant Carnegie |
29 | Mellon the rights to redistribute these changes without encumbrance. |
30 | */ |
31 | |
32 | /* |
33 | * |
34 | * Based on cfs.h from Mach, but revamped for increased simplicity. |
35 | * Linux modifications by |
36 | * Peter Braam, Aug 1996 |
37 | */ |
38 | |
39 | #ifndef _CODA_HEADER_ |
40 | #define |
41 | |
42 | #if defined(__NetBSD__) |
43 | #include <sys/ioccom.h> |
44 | #if defined(_KERNEL_OPT) |
45 | /* pull in optional CODA_COMPAT_5 flag and NVCODA. */ |
46 | #include "opt_coda_compat.h" |
47 | #include <vcoda.h> |
48 | #else |
49 | #define NVCODA 4 |
50 | #endif |
51 | #endif |
52 | |
53 | /* Catch new _KERNEL defn for NetBSD and DJGPP/__CYGWIN32__ */ |
54 | #if defined(__NetBSD__) || \ |
55 | ((defined(DJGPP) || defined(__CYGWIN32__)) && !defined(KERNEL)) |
56 | #include <sys/types.h> |
57 | #include <sys/systm.h> |
58 | #endif |
59 | |
60 | #ifndef CODA_MAXSYMLINKS |
61 | #define CODA_MAXSYMLINKS 10 |
62 | #endif |
63 | |
64 | #if defined(DJGPP) || defined(__CYGWIN32__) |
65 | #ifdef KERNEL |
66 | typedef unsigned long u_long; |
67 | typedef unsigned int u_int; |
68 | typedef unsigned short u_short; |
69 | typedef u_long ino_t; |
70 | typedef u_long dev_t; |
71 | typedef void *void *; |
72 | #ifdef DOS |
73 | typedef unsigned __int64 u_quad_t; |
74 | #else |
75 | typedef unsigned long long u_quad_t; |
76 | #endif |
77 | |
78 | #define inline |
79 | |
80 | struct timespec { |
81 | long ts_sec; |
82 | long ts_nsec; |
83 | }; |
84 | #else /* DJGPP but not KERNEL */ |
85 | #include <sys/time.h> |
86 | typedef unsigned long long u_quad_t; |
87 | #endif /* !KERNEL */ |
88 | #endif /* !DJGPP */ |
89 | |
90 | |
91 | #if defined(__linux__) |
92 | #define cdev_t u_quad_t |
93 | #ifndef __KERNEL__ |
94 | #if !defined(_UQUAD_T_) && (!defined(__GLIBC__) || __GLIBC__ < 2) |
95 | #define _UQUAD_T_ 1 |
96 | typedef unsigned long long u_quad_t; |
97 | #endif |
98 | #else /*__KERNEL__ */ |
99 | typedef unsigned long long u_quad_t; |
100 | #endif /* __KERNEL__ */ |
101 | #else |
102 | #define cdev_t dev_t |
103 | #endif |
104 | |
105 | /* Solaris Definitions */ |
106 | #if defined(sun) |
107 | #include <sys/types.h> |
108 | #include <sys/time.h> |
109 | typedef unsigned long long u_quad_t; |
110 | #undef __BIT_TYPES_DEFINED__ |
111 | #endif |
112 | |
113 | /* Mac OS X / Darwin */ |
114 | #if defined(__APPLE__) && defined(__MACH__) |
115 | #define __BIT_TYPES_DEFINED__ |
116 | #endif |
117 | |
118 | #ifndef __BIT_TYPES_DEFINED__ |
119 | #define __BIT_TYPES_DEFINED__ |
120 | typedef signed char int8_t; |
121 | typedef unsigned char u_int8_t; |
122 | typedef short int16_t; |
123 | typedef unsigned short u_int16_t; |
124 | typedef int int32_t; |
125 | typedef unsigned int u_int32_t; |
126 | #endif |
127 | |
128 | |
129 | /* |
130 | * Cfs constants |
131 | */ |
132 | #define CODA_MAXNAMLEN 255 |
133 | #define CODA_MAXPATHLEN 1024 |
134 | #define CODA_MAXSYMLINK 10 |
135 | |
136 | /* these are Coda's version of O_RDONLY etc combinations |
137 | * to deal with VFS open modes |
138 | */ |
139 | #define C_O_READ 0x001 |
140 | #define C_O_WRITE 0x002 |
141 | #define C_O_TRUNC 0x010 |
142 | #define C_O_EXCL 0x100 |
143 | #define C_O_CREAT 0x200 |
144 | |
145 | /* these are to find mode bits in Venus */ |
146 | #define C_M_READ 00400 |
147 | #define C_M_WRITE 00200 |
148 | |
149 | /* for access Venus will use */ |
150 | #define C_A_C_OK 8 /* Test for writing upon create. */ |
151 | #define C_A_R_OK 4 /* Test for read permission. */ |
152 | #define C_A_W_OK 2 /* Test for write permission. */ |
153 | #define C_A_X_OK 1 /* Test for execute permission. */ |
154 | #define C_A_F_OK 0 /* Test for existence. */ |
155 | |
156 | #if defined(sun) |
157 | #define _VENUS_DIRENT_T_ 1 |
158 | struct venus_dirent { |
159 | unsigned long d_fileno; /* file number of entry */ |
160 | unsigned short d_reclen; /* length of this record */ |
161 | unsigned short d_namlen; /* length of string in d_name */ |
162 | char d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */ |
163 | }; |
164 | #undef DIRSIZ |
165 | #define DIRSIZ(dp) ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \ |
166 | (((dp)->d_namlen+1 + 3) &~ 3)) |
167 | #endif |
168 | |
169 | #ifndef _VENUS_DIRENT_T_ |
170 | #define _VENUS_DIRENT_T_ 1 |
171 | struct venus_dirent { |
172 | unsigned long d_fileno; /* file number of entry */ |
173 | unsigned short d_reclen; /* length of this record */ |
174 | unsigned char d_type; /* file type, see below */ |
175 | unsigned char d_namlen; /* length of string in d_name */ |
176 | char d_name[CODA_MAXNAMLEN + 1];/* name must be no longer than this */ |
177 | }; |
178 | #undef DIRSIZ |
179 | #define DIRSIZ(dp) ((sizeof (struct venus_dirent) - (CODA_MAXNAMLEN+1)) + \ |
180 | (((dp)->d_namlen+1 + 3) &~ 3)) |
181 | |
182 | /* |
183 | * File types |
184 | */ |
185 | #define CDT_UNKNOWN 0 |
186 | #define CDT_FIFO 1 |
187 | #define CDT_CHR 2 |
188 | #define CDT_DIR 4 |
189 | #define CDT_BLK 6 |
190 | #define CDT_REG 8 |
191 | #define CDT_LNK 10 |
192 | #define CDT_SOCK 12 |
193 | #define CDT_WHT 14 |
194 | |
195 | /* |
196 | * Convert between stat structure types and directory types. |
197 | */ |
198 | #define IFTOCDT(mode) (((mode) & 0170000) >> 12) |
199 | #define CDTTOIF(dirtype) ((dirtype) << 12) |
200 | |
201 | #endif |
202 | |
203 | #ifdef CODA_COMPAT_5 |
204 | |
205 | typedef struct { |
206 | u_long Volume; |
207 | u_long Vnode; |
208 | u_long Unique; |
209 | } CodaFid; |
210 | |
211 | static inline ino_t coda_f2i(CodaFid *fid) |
212 | { |
213 | if (!fid) return 0; |
214 | return (fid->Unique + (fid->Vnode<<10) + (fid->Volume<<20)); |
215 | } |
216 | |
217 | static inline char * coda_f2s(CodaFid *fid) |
218 | { |
219 | static char fid_str [35]; |
220 | snprintf (fid_str, 35, "[%lx.%lx.%lx]" , fid->Volume, |
221 | fid->Vnode, fid->Unique); |
222 | return fid_str; |
223 | } |
224 | |
225 | static inline int coda_fid_eq (CodaFid *fid1, CodaFid *fid2) |
226 | { |
227 | return (fid1->Volume == fid2->Volume && |
228 | fid1->Vnode == fid2->Vnode && |
229 | fid1->Unique == fid2->Unique); |
230 | } |
231 | |
232 | struct coda_cred { |
233 | u_int32_t cr_uid, cr_euid, cr_suid, cr_fsuid; /* Real, efftve, set, fs uid*/ |
234 | u_int32_t cr_groupid, cr_egid, cr_sgid, cr_fsgid; /* same for groups */ |
235 | }; |
236 | |
237 | #else |
238 | |
239 | typedef struct { |
240 | u_int32_t opaque[4]; |
241 | } CodaFid; |
242 | |
243 | |
244 | static inline ino_t coda_f2i(CodaFid *fid) |
245 | { |
246 | if (!fid) return 0; |
247 | return (fid->opaque[1] + (fid->opaque[2]<<10) + (fid->opaque[3]<<20)); |
248 | } |
249 | |
250 | static inline char * coda_f2s(CodaFid *fid) |
251 | { |
252 | static char fid_str [35]; |
253 | snprintf (fid_str, 35, "[%x.%x.%x.%x]" , fid->opaque[0], |
254 | fid->opaque[1], fid->opaque[2], fid->opaque[3]); |
255 | return fid_str; |
256 | } |
257 | |
258 | static inline int coda_fid_eq (CodaFid *fid1, CodaFid *fid2) |
259 | { |
260 | return (fid1->opaque[0] == fid2->opaque[0] && |
261 | fid1->opaque[1] == fid2->opaque[1] && |
262 | fid1->opaque[2] == fid2->opaque[2] && |
263 | fid1->opaque[3] == fid2->opaque[3]); |
264 | } |
265 | |
266 | #endif |
267 | |
268 | #ifndef _VENUS_VATTR_T_ |
269 | #define _VENUS_VATTR_T_ |
270 | /* |
271 | * Vnode types. VNON means no type. |
272 | */ |
273 | enum coda_vtype { C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD }; |
274 | |
275 | struct coda_vattr { |
276 | long va_type; /* vnode type (for create) */ |
277 | u_short va_mode; /* files access mode and type */ |
278 | short va_nlink; /* number of references to file */ |
279 | uid_t va_uid; /* owner user id */ |
280 | gid_t va_gid; /* owner group id */ |
281 | u_long va_fileid; /* file id */ |
282 | u_quad_t va_size; /* file size in bytes */ |
283 | long va_blocksize; /* blocksize preferred for i/o */ |
284 | struct timespec va_atime; /* time of last access */ |
285 | struct timespec va_mtime; /* time of last modification */ |
286 | struct timespec va_ctime; /* time file changed */ |
287 | u_long va_gen; /* generation number of file */ |
288 | u_long va_flags; /* flags defined for file */ |
289 | cdev_t va_rdev; /* device special file represents */ |
290 | u_quad_t va_bytes; /* bytes of disk space held by file */ |
291 | u_quad_t va_filerev; /* file modification number */ |
292 | }; |
293 | |
294 | #endif |
295 | |
296 | /* structure used by CODA_STATFS for getting cache information from venus */ |
297 | struct coda_statfs { |
298 | int32_t f_blocks; |
299 | int32_t f_bfree; |
300 | int32_t f_bavail; |
301 | int32_t f_files; |
302 | int32_t f_ffree; |
303 | }; |
304 | |
305 | /* |
306 | * Kernel <--> Venus communications. |
307 | */ |
308 | |
309 | #define CODA_ROOT 2 |
310 | #define CODA_OPEN_BY_FD 3 |
311 | #define CODA_OPEN 4 |
312 | #define CODA_CLOSE 5 |
313 | #define CODA_IOCTL 6 |
314 | #define CODA_GETATTR 7 |
315 | #define CODA_SETATTR 8 |
316 | #define CODA_ACCESS 9 |
317 | #define CODA_LOOKUP 10 |
318 | #define CODA_CREATE 11 |
319 | #define CODA_REMOVE 12 |
320 | #define CODA_LINK 13 |
321 | #define CODA_RENAME 14 |
322 | #define CODA_MKDIR 15 |
323 | #define CODA_RMDIR 16 |
324 | #define CODA_READDIR 17 |
325 | #define CODA_SYMLINK 18 |
326 | #define CODA_READLINK 19 |
327 | #define CODA_FSYNC 20 |
328 | #define CODA_INACTIVE 21 |
329 | #define CODA_VGET 22 |
330 | #define CODA_SIGNAL 23 |
331 | #define CODA_REPLACE 24 /* DOWNCALL */ |
332 | #define CODA_FLUSH 25 /* DOWNCALL */ |
333 | #define CODA_PURGEUSER 26 /* DOWNCALL */ |
334 | #define CODA_ZAPFILE 27 /* DOWNCALL */ |
335 | #define CODA_ZAPDIR 28 /* DOWNCALL */ |
336 | #define CODA_PURGEFID 30 /* DOWNCALL */ |
337 | #define CODA_OPEN_BY_PATH 31 |
338 | #define CODA_RESOLVE 32 |
339 | #define CODA_REINTEGRATE 33 |
340 | #define CODA_STATFS 34 |
341 | #define CODA_NCALLS 35 |
342 | |
343 | #define DOWNCALL(opcode) (opcode >= CODA_REPLACE && opcode <= CODA_PURGEFID) |
344 | |
345 | #define VC_MAXDATASIZE 8192 |
346 | #define VC_MAXMSGSIZE sizeof(union inputArgs)+sizeof(union outputArgs) +\ |
347 | VC_MAXDATASIZE |
348 | |
349 | #define CIOC_KERNEL_VERSION _IOWR('c', 10, sizeof (int)) |
350 | |
351 | #if 0 |
352 | #define CODA_KERNEL_VERSION 0 /* don't care about kernel version number */ |
353 | #define CODA_KERNEL_VERSION 1 /* The old venus 4.6 compatible interface */ |
354 | #endif |
355 | #ifdef CODA_COMPAT_5 |
356 | #define CODA_KERNEL_VERSION 2 /* venus_lookup gets an extra parameter */ |
357 | #else |
358 | #define CODA_KERNEL_VERSION 3 /* 128-bit fids for realms */ |
359 | #endif |
360 | |
361 | /* |
362 | * Venus <-> Coda RPC arguments |
363 | */ |
364 | #ifdef CODA_COMPAT_5 |
365 | struct coda_in_hdr { |
366 | unsigned long opcode; |
367 | unsigned long unique; /* Keep multiple outstanding msgs distinct */ |
368 | u_short pid; /* Common to all */ |
369 | u_short pgid; /* Common to all */ |
370 | u_short sid; /* Common to all */ |
371 | struct coda_cred cred; /* Common to all */ |
372 | }; |
373 | #else |
374 | struct coda_in_hdr { |
375 | u_int32_t opcode; |
376 | u_int32_t unique; /* Keep multiple outstanding msgs distinct */ |
377 | pid_t pid; /* Common to all */ |
378 | pid_t pgid; /* Common to all */ |
379 | uid_t uid; /* Common to all */ |
380 | }; |
381 | #endif |
382 | |
383 | /* Really important that opcode and unique are 1st two fields! */ |
384 | struct coda_out_hdr { |
385 | u_int32_t opcode; |
386 | u_int32_t unique; |
387 | u_int32_t result; |
388 | }; |
389 | |
390 | /* coda_root: NO_IN */ |
391 | struct coda_root_out { |
392 | struct coda_out_hdr oh; |
393 | CodaFid Fid; |
394 | }; |
395 | |
396 | struct coda_root_in { |
397 | struct coda_in_hdr in; |
398 | }; |
399 | |
400 | /* coda_open: */ |
401 | struct coda_open_in { |
402 | struct coda_in_hdr ih; |
403 | CodaFid Fid; |
404 | int flags; |
405 | }; |
406 | |
407 | struct coda_open_out { |
408 | struct coda_out_hdr oh; |
409 | cdev_t dev; |
410 | ino_t inode; /* host inode of container file */ |
411 | }; |
412 | |
413 | |
414 | /* coda_close: */ |
415 | struct coda_close_in { |
416 | struct coda_in_hdr ih; |
417 | CodaFid Fid; |
418 | int flags; |
419 | }; |
420 | |
421 | struct coda_close_out { |
422 | struct coda_out_hdr out; |
423 | }; |
424 | |
425 | /* coda_ioctl: */ |
426 | struct coda_ioctl_in { |
427 | struct coda_in_hdr ih; |
428 | CodaFid Fid; |
429 | int cmd; |
430 | int len; |
431 | int rwflag; |
432 | char *data; /* Place holder for data. */ |
433 | }; |
434 | |
435 | struct coda_ioctl_out { |
436 | struct coda_out_hdr oh; |
437 | int len; |
438 | void * data; /* Place holder for data. */ |
439 | }; |
440 | |
441 | |
442 | /* coda_getattr: */ |
443 | struct coda_getattr_in { |
444 | struct coda_in_hdr ih; |
445 | CodaFid Fid; |
446 | }; |
447 | |
448 | struct coda_getattr_out { |
449 | struct coda_out_hdr oh; |
450 | struct coda_vattr attr; |
451 | }; |
452 | |
453 | |
454 | /* coda_setattr: NO_OUT */ |
455 | struct coda_setattr_in { |
456 | struct coda_in_hdr ih; |
457 | CodaFid Fid; |
458 | struct coda_vattr attr; |
459 | }; |
460 | |
461 | struct coda_setattr_out { |
462 | struct coda_out_hdr out; |
463 | }; |
464 | |
465 | /* coda_access: NO_OUT */ |
466 | struct coda_access_in { |
467 | struct coda_in_hdr ih; |
468 | CodaFid Fid; |
469 | int flags; |
470 | }; |
471 | |
472 | struct coda_access_out { |
473 | struct coda_out_hdr out; |
474 | }; |
475 | |
476 | |
477 | /* lookup flags */ |
478 | #define CLU_CASE_SENSITIVE 0x01 |
479 | #define CLU_CASE_INSENSITIVE 0x02 |
480 | |
481 | /* coda_lookup: */ |
482 | struct coda_lookup_in { |
483 | struct coda_in_hdr ih; |
484 | CodaFid Fid; |
485 | int name; /* Place holder for data. */ |
486 | int flags; |
487 | }; |
488 | |
489 | struct coda_lookup_out { |
490 | struct coda_out_hdr oh; |
491 | CodaFid Fid; |
492 | int vtype; |
493 | }; |
494 | |
495 | |
496 | /* coda_create: */ |
497 | struct coda_create_in { |
498 | struct coda_in_hdr ih; |
499 | CodaFid Fid; |
500 | struct coda_vattr attr; |
501 | int excl; |
502 | int mode; |
503 | int name; /* Place holder for data. */ |
504 | }; |
505 | |
506 | struct coda_create_out { |
507 | struct coda_out_hdr oh; |
508 | CodaFid Fid; |
509 | struct coda_vattr attr; |
510 | }; |
511 | |
512 | |
513 | /* coda_remove: NO_OUT */ |
514 | struct coda_remove_in { |
515 | struct coda_in_hdr ih; |
516 | CodaFid Fid; |
517 | int name; /* Place holder for data. */ |
518 | }; |
519 | |
520 | struct coda_remove_out { |
521 | struct coda_out_hdr out; |
522 | }; |
523 | |
524 | /* coda_link: NO_OUT */ |
525 | struct coda_link_in { |
526 | struct coda_in_hdr ih; |
527 | CodaFid sourceFid; /* cnode to link *to* */ |
528 | CodaFid destFid; /* Directory in which to place link */ |
529 | int tname; /* Place holder for data. */ |
530 | }; |
531 | |
532 | struct coda_link_out { |
533 | struct coda_out_hdr out; |
534 | }; |
535 | |
536 | |
537 | /* coda_rename: NO_OUT */ |
538 | struct coda_rename_in { |
539 | struct coda_in_hdr ih; |
540 | CodaFid sourceFid; |
541 | int srcname; |
542 | CodaFid destFid; |
543 | int destname; |
544 | }; |
545 | |
546 | struct coda_rename_out { |
547 | struct coda_out_hdr out; |
548 | }; |
549 | |
550 | /* coda_mkdir: */ |
551 | struct coda_mkdir_in { |
552 | struct coda_in_hdr ih; |
553 | CodaFid Fid; |
554 | struct coda_vattr attr; |
555 | int name; /* Place holder for data. */ |
556 | }; |
557 | |
558 | struct coda_mkdir_out { |
559 | struct coda_out_hdr oh; |
560 | CodaFid Fid; |
561 | struct coda_vattr attr; |
562 | }; |
563 | |
564 | |
565 | /* coda_rmdir: NO_OUT */ |
566 | struct coda_rmdir_in { |
567 | struct coda_in_hdr ih; |
568 | CodaFid Fid; |
569 | int name; /* Place holder for data. */ |
570 | }; |
571 | |
572 | struct coda_rmdir_out { |
573 | struct coda_out_hdr out; |
574 | }; |
575 | |
576 | /* coda_readdir: */ |
577 | struct coda_readdir_in { |
578 | struct coda_in_hdr ih; |
579 | CodaFid Fid; |
580 | int count; |
581 | int offset; |
582 | }; |
583 | |
584 | struct coda_readdir_out { |
585 | struct coda_out_hdr oh; |
586 | int size; |
587 | void * data; /* Place holder for data. */ |
588 | }; |
589 | |
590 | /* coda_symlink: NO_OUT */ |
591 | struct coda_symlink_in { |
592 | struct coda_in_hdr ih; |
593 | CodaFid Fid; /* Directory to put symlink in */ |
594 | int srcname; |
595 | struct coda_vattr attr; |
596 | int tname; |
597 | }; |
598 | |
599 | struct coda_symlink_out { |
600 | struct coda_out_hdr out; |
601 | }; |
602 | |
603 | /* coda_readlink: */ |
604 | struct coda_readlink_in { |
605 | struct coda_in_hdr ih; |
606 | CodaFid Fid; |
607 | }; |
608 | |
609 | struct coda_readlink_out { |
610 | struct coda_out_hdr oh; |
611 | int count; |
612 | void * data; /* Place holder for data. */ |
613 | }; |
614 | |
615 | |
616 | /* coda_fsync: NO_OUT */ |
617 | struct coda_fsync_in { |
618 | struct coda_in_hdr ih; |
619 | CodaFid Fid; |
620 | }; |
621 | |
622 | struct coda_fsync_out { |
623 | struct coda_out_hdr out; |
624 | }; |
625 | |
626 | /* coda_vget: */ |
627 | struct coda_vget_in { |
628 | struct coda_in_hdr ih; |
629 | CodaFid Fid; |
630 | }; |
631 | |
632 | struct coda_vget_out { |
633 | struct coda_out_hdr oh; |
634 | CodaFid Fid; |
635 | int vtype; |
636 | }; |
637 | |
638 | |
639 | /* CODA_SIGNAL is out-of-band, doesn't need data. */ |
640 | /* CODA_INVALIDATE is a venus->kernel call */ |
641 | /* CODA_FLUSH is a venus->kernel call */ |
642 | |
643 | /* coda_purgeuser: */ |
644 | /* CODA_PURGEUSER is a venus->kernel call */ |
645 | struct coda_purgeuser_out { |
646 | struct coda_out_hdr oh; |
647 | #ifdef CODA_COMPAT_5 |
648 | struct coda_cred cred; |
649 | #else |
650 | uid_t uid; |
651 | #endif |
652 | }; |
653 | |
654 | /* coda_zapfile: */ |
655 | /* CODA_ZAPFILE is a venus->kernel call */ |
656 | struct coda_zapfile_out { |
657 | struct coda_out_hdr oh; |
658 | CodaFid Fid; |
659 | }; |
660 | |
661 | /* coda_zapdir: */ |
662 | /* CODA_ZAPDIR is a venus->kernel call */ |
663 | struct coda_zapdir_out { |
664 | struct coda_out_hdr oh; |
665 | CodaFid Fid; |
666 | }; |
667 | |
668 | /* coda_zapnode: */ |
669 | /* CODA_ZAPVNODE is a venus->kernel call */ |
670 | struct coda_zapvnode_out { |
671 | struct coda_out_hdr oh; |
672 | #ifdef CODA_COMPAT_5 |
673 | struct coda_cred cred; |
674 | #endif |
675 | CodaFid Fid; |
676 | }; |
677 | |
678 | /* coda_purgefid: */ |
679 | /* CODA_PURGEFID is a venus->kernel call */ |
680 | struct coda_purgefid_out { |
681 | struct coda_out_hdr oh; |
682 | CodaFid Fid; |
683 | }; |
684 | |
685 | /* coda_replace: */ |
686 | /* CODA_REPLACE is a venus->kernel call */ |
687 | struct coda_replace_out { /* coda_replace is a venus->kernel call */ |
688 | struct coda_out_hdr oh; |
689 | CodaFid NewFid; |
690 | CodaFid OldFid; |
691 | }; |
692 | |
693 | /* coda_open_by_fd: */ |
694 | struct coda_open_by_fd_in { |
695 | struct coda_in_hdr ih; |
696 | CodaFid Fid; |
697 | int flags; |
698 | }; |
699 | |
700 | struct coda_open_by_fd_out { |
701 | struct coda_out_hdr oh; |
702 | int fd; |
703 | struct file *fh; |
704 | }; |
705 | |
706 | /* coda_open_by_path: */ |
707 | struct coda_open_by_path_in { |
708 | struct coda_in_hdr ih; |
709 | CodaFid Fid; |
710 | int flags; |
711 | }; |
712 | |
713 | struct coda_open_by_path_out { |
714 | struct coda_out_hdr oh; |
715 | int path; |
716 | }; |
717 | |
718 | /* coda_statfs: NO_IN */ |
719 | struct coda_statfs_in { |
720 | struct coda_in_hdr ih; |
721 | }; |
722 | |
723 | struct coda_statfs_out { |
724 | struct coda_out_hdr oh; |
725 | struct coda_statfs stat; |
726 | }; |
727 | |
728 | /* |
729 | * Occasionally, we don't cache the fid returned by CODA_LOOKUP. |
730 | * For instance, if the fid is inconsistent. |
731 | * This case is handled by setting the top bit of the type result parameter. |
732 | */ |
733 | #define CODA_NOCACHE 0x80000000 |
734 | |
735 | union inputArgs { |
736 | struct coda_in_hdr ih; /* NB: every struct below begins with an ih */ |
737 | struct coda_open_in coda_open; |
738 | struct coda_close_in coda_close; |
739 | struct coda_ioctl_in coda_ioctl; |
740 | struct coda_getattr_in coda_getattr; |
741 | struct coda_setattr_in coda_setattr; |
742 | struct coda_access_in coda_access; |
743 | struct coda_lookup_in coda_lookup; |
744 | struct coda_create_in coda_create; |
745 | struct coda_remove_in coda_remove; |
746 | struct coda_link_in coda_link; |
747 | struct coda_rename_in coda_rename; |
748 | struct coda_mkdir_in coda_mkdir; |
749 | struct coda_rmdir_in coda_rmdir; |
750 | struct coda_readdir_in coda_readdir; |
751 | struct coda_symlink_in coda_symlink; |
752 | struct coda_readlink_in coda_readlink; |
753 | struct coda_fsync_in coda_fsync; |
754 | struct coda_vget_in coda_vget; |
755 | struct coda_open_by_fd_in coda_open_by_fd; |
756 | struct coda_open_by_path_in coda_open_by_path; |
757 | struct coda_statfs_in coda_statfs; |
758 | }; |
759 | |
760 | union outputArgs { |
761 | struct coda_out_hdr oh; /* NB: every struct below begins with an oh */ |
762 | struct coda_root_out coda_root; |
763 | struct coda_open_out coda_open; |
764 | struct coda_ioctl_out coda_ioctl; |
765 | struct coda_getattr_out coda_getattr; |
766 | struct coda_lookup_out coda_lookup; |
767 | struct coda_create_out coda_create; |
768 | struct coda_mkdir_out coda_mkdir; |
769 | struct coda_readdir_out coda_readdir; |
770 | struct coda_readlink_out coda_readlink; |
771 | struct coda_vget_out coda_vget; |
772 | struct coda_purgeuser_out coda_purgeuser; |
773 | struct coda_zapfile_out coda_zapfile; |
774 | struct coda_zapdir_out coda_zapdir; |
775 | struct coda_zapvnode_out coda_zapvnode; |
776 | struct coda_purgefid_out coda_purgefid; |
777 | struct coda_replace_out coda_replace; |
778 | struct coda_open_by_fd_out coda_open_by_fd; |
779 | struct coda_open_by_path_out coda_open_by_path; |
780 | struct coda_statfs_out coda_statfs; |
781 | }; |
782 | |
783 | union coda_downcalls { |
784 | /* CODA_INVALIDATE is a venus->kernel call */ |
785 | /* CODA_FLUSH is a venus->kernel call */ |
786 | struct coda_purgeuser_out purgeuser; |
787 | struct coda_zapfile_out zapfile; |
788 | struct coda_zapdir_out zapdir; |
789 | struct coda_zapvnode_out zapvnode; |
790 | struct coda_purgefid_out purgefid; |
791 | struct coda_replace_out replace; |
792 | }; |
793 | |
794 | |
795 | /* |
796 | * Used for identifying usage of "Control" and pioctls |
797 | */ |
798 | |
799 | #define PIOCPARM_MASK 0x0000ffff |
800 | struct ViceIoctl { |
801 | void *in, *out; /* Data to be transferred in, or out */ |
802 | unsigned short in_size; /* Size of input buffer <= 8K */ |
803 | unsigned short out_size;/* Maximum size of output buffer, <= 8K */ |
804 | }; |
805 | |
806 | struct PioctlData { |
807 | const char *path; |
808 | int follow; |
809 | #if defined(__CYGWIN32__) || defined(__NT_CODA__) |
810 | int cmd; |
811 | #endif |
812 | struct ViceIoctl vi; |
813 | }; |
814 | |
815 | #define CODA_CONTROL ".CONTROL" |
816 | #define CODA_CONTROLLEN 8 |
817 | #define CTL_INO -1 |
818 | #define CTL_FILE "/coda/.CONTROL" |
819 | |
820 | |
821 | #ifdef CODA_COMPAT_5 |
822 | #define CTL_FID { -1, -1, -1 } |
823 | #define IS_CTL_FID(fidp) ((fidp)->Volume == -1 &&\ |
824 | (fidp)->Vnode == -1 &&\ |
825 | (fidp)->Unique == -1) |
826 | #define INVAL_FID { 0, 0, 0 } |
827 | #else |
828 | #define CTL_FID { { -1, -1, -1, -1 } } |
829 | #define IS_CTL_FID(fidp) ((fidp)->opaque[0] == -1 &&\ |
830 | (fidp)->opaque[1] == -1 &&\ |
831 | (fidp)->opaque[2] == -1 &&\ |
832 | (fidp)->opaque[3] == -1) |
833 | #define INVAL_FID { { 0, 0, 0, 0 } } |
834 | #endif |
835 | |
836 | /* Data passed to mount */ |
837 | |
838 | #define CODA_MOUNT_VERSION 1 |
839 | |
840 | struct coda_mount_data { |
841 | int version; |
842 | int fd; /* Opened device */ |
843 | }; |
844 | |
845 | #endif |
846 | |
847 | |