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