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