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