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