/* * COMPONENT_NAME: onchdrs * * FUNCTIONS: NA_ISFIFO * NA_SETFIFO * geterrno * isrofile * n2v_rdev * n2v_type * puterrno * * ORIGINS: 24 * */ /* * (c) Copyright Sun Microsystems, Inc. 1988 */ /* (#)nfs.h 2.2 88/05/20 NFSSRC4.0 from 2.36 88/02/08 SMI */ #ifdef _ONCPLUS #include #else #ifndef __NFS_HEADER__ #define __NFS_HEADER__ struct mbuf; struct buf; struct vnode; struct dirent; /* Maximum size of data portion of a remote request */ #define NFS_MAXDATA 8192 #define NFS_MAXNAMLEN 255 #define NFS_MAXPATHLEN 1024 /* * Rpc retransmission parameters */ #define NFS_TIMEO 11 /* initial timeout in tenths of a sec. */ #define NFS_RETRIES 5 /* times to retry request */ /* * maximum transfer size for different interfaces */ #define ECTSIZE 4096 #define IETSIZE 8192 /* * default nfs socket size */ #define NFS_SOCKET_SZ_DEFAULT 60000 /* * default write gather size */ #define NFS_WRGATHER_SZ_DEFAULT 4096 /* * default nfso option nfs_portmon value */ #define NFS_PORTMON_DEFAULT 0 /* * default nfso option nfs_setattr_err_ignore value */ #define NFS_SETATTR_ERR_DEFAULT 0 /* * default nfso option krpc_udpcksum (check sum) */ #define NFS_CHKSUM_DEFAULT 1 /* * default for nfso option nfs_repeat_msg (repeat nfs kernel messages) */ #define NFS_REPEAT_MSG_DEFAULT 0 /* * default size of the nfs server duplicate cache */ #define NFS_DUPCACHE_SIZE_DEFAULT 1000 /* * default base priority of the nfs server daemons */ #define NFS_DEFAULT_BASE_PRIORITY 65 /* * default for the dynamic retransmission flag on NFS client */ #define NFS_DYNAMIC_RETRANS_DEFAULT 1 /* * default for number of pages for NFS client iopacing */ #define NFS_CLIENT_IOPACE_PAGES 32 /* * Error status * Should include all possible net errors. * For now we just cast errno into an enum nfsstat. */ enum nfsstat { NFS_OK = 0, /* no error */ NFSERR_PERM=EPERM, /* Not owner */ NFSERR_NOENT=ENOENT, /* No such file or directory */ NFSERR_IO=EIO, /* I/O error */ NFSERR_NXIO=ENXIO, /* No such device or address */ NFSERR_ACCES=EACCES, /* Permission denied */ NFSERR_EXIST=EEXIST, /* File exists */ NFSERR_NODEV=ENODEV, /* No such device */ NFSERR_NOTDIR=ENOTDIR, /* Not a directory */ NFSERR_ISDIR=EISDIR, /* Is a directory */ NFSERR_FBIG=EFBIG, /* File too large */ NFSERR_NOSPC=ENOSPC, /* No space left on device */ NFSERR_ROFS=EROFS, /* Read-only file system */ NFSERR_NAMETOOLONG=ENAMETOOLONG,/* File name too long */ NFSERR_NOTEMPTY=ENOTEMPTY, /* Directory not empty */ NFSERR_DQUOT=EDQUOT, /* Disc quota exceeded */ NFSERR_STALE=ESTALE, /* Stale NFS file handle */ NFSERR_WFLUSH /* write cache flushed */ }; #define NFS_ELLIMIT 34 #define NFS_EULIMIT 99 static _puterrno[] = { 0,75,77,99,99,99, 99,99,99,99,99,78,99,99,99,79, 99,99,70,99,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50, 51,52,53,54,55,56,57,58,60,61, 64,65,99,67,68,62,63,66,69,68, 99,99,99,71,99,99,99,99,99,99 }; static _geterrno[] = { 0,54,55,56,57,58, 59,60,61,62,63,64,65,66,67,68, 69,70,71,72,73,74,75,76,77,99, 78,79,85,86,80,81,87,83,84,88, 52,93,99,99,99,35,99,36,45,49, 99,99,99,99,99,99,99,99,99,99, 99,99,99,99,99,99,99,99,99,99 }; #define puterrno(error) \ ((enum nfsstat)((error) > NFS_ELLIMIT && (error) < NFS_EULIMIT ? \ _puterrno[(error) - NFS_ELLIMIT] : (error))) #define geterrno(status) \ ((int)((status) > NFS_ELLIMIT && (status) < NFS_EULIMIT ? \ _geterrno[(status) - NFS_ELLIMIT] : (((status)&&(((status)&0xFF)==0))?5:(status)))) /* * File types */ enum nfsftype { NFNON, NFREG, /* regular file */ NFDIR, /* directory */ NFBLK, /* block special */ NFCHR, /* character special */ NFLNK /* symbolic link */ }; /* * Special kludge for fifos (named pipes) [to adhere to NFS Protocol Spec] * * VFIFO is not in the protocol spec (VNON will be replaced by VFIFO) * so the over-the-wire representation is VCHR with a '-1' device number. * * NOTE: This kludge becomes unnecessary with the Protocol Revision, * but it may be necessary to support it (backwards compatibility). */ #define NFS_FIFO_TYPE NFCHR #define NFS_FIFO_MODE S_IFCHR #define NFS_FIFO_DEV (~0) /* identify fifo in nfs attributes */ #define NA_ISFIFO(NA) (((NA)->na_type == NFS_FIFO_TYPE) && \ ((NA)->na_rdev == NFS_FIFO_DEV)) /* set fifo in nfs attributes */ #define NA_SETFIFO(NA) { \ (NA)->na_type = NFS_FIFO_TYPE; \ (NA)->na_rdev = NFS_FIFO_DEV; \ (NA)->na_mode = ((NA)->na_mode&~S_IFMT)|NFS_FIFO_MODE; \ } /* * Size of an fhandle in bytes */ #define NFS_FHSIZE 32 /* * File access handle * This structure is the Sun server representation of a file. * It is handed out by a server for the client to use in further * file transactions. */ #ifdef NFSSERVER /* * This struct is only used to find the size of the data field in the * fhandle structure below. */ static struct fhsize { fsid_t f1; u_short f2; char f3[4]; u_short f4; char f5[4]; }; #define NFS_FHMAXDATA ((NFS_FHSIZE - sizeof (struct fhsize) + 8) / 2) #undef fh_len struct svcfh { fsid_t fh_fsid; /* filesystem id */ u_short fh_len; /* file number length */ char fh_data[NFS_FHMAXDATA]; /* and data */ u_short fh_xlen; /* export file number length */ char fh_xdata[NFS_FHMAXDATA];/* and data */ }; typedef struct svcfh fhandl_t; #else /* * This is the client view of an fhandle */ typedef struct { char fh_data[NFS_FHSIZE]; /* opaque data */ } fhandl_t; #endif #define fhandle_t fhandl_t /* * Arguments to remote write and writecache */ struct nfswriteargs { fhandle_t wa_fhandle; /* handle for file */ u_int wa_begoff; /* beginning byte offset in file */ u_int wa_offset; /* current byte offset in file */ u_int wa_totcount; /* total write cnt (to this offset) */ u_int wa_count; /* size of this write */ char *wa_data; /* data to write (up to NFS_MAXDATA) */ struct mbuf *wa_mbuf; /* mbuf containing data */ }; /* * File attributes */ struct nfsfattr { enum nfsftype na_type; /* file type */ u_int na_mode; /* protection mode bits */ u_int na_nlink; /* # hard links */ u_int na_uid; /* owner user id */ u_int na_gid; /* owner group id */ u_int na_size; /* file size in bytes */ u_int na_blocksize; /* prefered block size */ u_int na_rdev; /* special device # */ u_int na_blocks; /* Kb of disk used by file */ u_int na_fsid; /* device # */ u_int na_nodeid; /* inode # */ struct timeval32 na_atime; /* time of last access */ struct timeval32 na_mtime; /* time of last modification */ struct timeval32 na_ctime; /* time of last change */ }; #define n2v_type(x) (NA_ISFIFO(x) ? VFIFO : (enum vtype)((x)->na_type)) #define n2v_rdev(x) (NA_ISFIFO(x) ? 0 : (x)->na_rdev) /* * Arguments to remote read */ struct nfsreadargs { fhandle_t ra_fhandle; /* handle for file */ u_long ra_offset; /* byte offset in file */ u_long ra_count; /* immediate read count */ u_long ra_totcount; /* total read cnt (from this offset) */ }; /* * Status OK portion of remote read reply */ struct nfsrrok { struct nfsfattr rrok_attr; /* attributes, need for pagin */ u_long rrok_count; /* bytes of data */ char *rrok_data; /* data (up to NFS_MAXDATA bytes) */ struct buf *rrok_bp; /* buffer pointer for bread */ struct vnode *rrok_vp; /* vnode assoc. with mapping */ }; /* * Reply from remote read */ struct nfsrdresult { enum nfsstat rr_status; /* status of read */ union { struct nfsrrok rr_ok_u; /* attributes, need for pagin */ } rr_u; }; #define rr_ok rr_u.rr_ok_u #define rr_attr rr_u.rr_ok_u.rrok_attr #define rr_count rr_u.rr_ok_u.rrok_count #define rr_data rr_u.rr_ok_u.rrok_data #define rr_bp rr_u.rr_ok_u.rrok_bp #define rr_vp rr_u.rr_ok_u.rrok_vp /* * File attributes which can be set */ struct nfssattr { u_int sa_mode; /* protection mode bits */ u_int sa_uid; /* owner user id */ u_int sa_gid; /* owner group id */ u_int sa_size; /* file size in bytes */ struct timeval32 sa_atime; /* time of last access */ struct timeval32 sa_mtime; /* time of last modification */ }; /* * Reply status with file attributes */ struct nfsattrstat { enum nfsstat ns_status; /* reply status */ union { struct nfsfattr ns_attr_u; /* NFS_OK: file attributes */ } ns_u; }; #define ns_attr ns_u.ns_attr_u /* * NFS_OK part of read sym link reply union */ struct nfssrok { u_long srok_count; /* size of string */ char *srok_data; /* string (up to NFS_MAXPATHLEN bytes) */ }; /* * Result of reading symbolic link */ struct nfsrdlnres { enum nfsstat rl_status; /* status of symlink read */ union { struct nfssrok rl_srok_u; /* name of linked to */ } rl_u; }; #define rl_srok rl_u.rl_srok_u #define rl_count rl_u.rl_srok_u.srok_count #define rl_data rl_u.rl_srok_u.srok_data /* * Arguments to readdir */ struct nfsrddirargs { fhandle_t rda_fh; /* directory handle */ u_int rda_offset; /* offset in directory (opaque) */ u_int rda_count; /* number of directory bytes to read */ }; /* * NFS_OK part of readdir result */ struct nfsrdok { u_int rdok_offset; /* next offset (opaque) */ u_int rdok_size; /* size in bytes of entries */ bool_t rdok_eof; /* true if last entry is in result */ struct dirent *rdok_entries; /* variable number of entries */ }; /* * Readdir result */ struct nfsrddirres { u_int rd_bufsize; /* client request size (not xdr'ed) */ u_int rd_origreqsize; /* client request size */ enum nfsstat rd_status; union { struct nfsrdok rd_rdok_u; } rd_u; }; #define rd_rdok rd_u.rd_rdok_u #define rd_offset rd_u.rd_rdok_u.rdok_offset #define rd_size rd_u.rd_rdok_u.rdok_size #define rd_eof rd_u.rd_rdok_u.rdok_eof #define rd_entries rd_u.rd_rdok_u.rdok_entries /* * Arguments for directory operations */ struct nfsdiropargs { fhandle_t da_fhandle; /* directory file handle */ char *da_name; /* name (up to NFS_MAXNAMLEN bytes) */ }; /* * NFS_OK part of directory operation result */ struct nfsdrok { fhandle_t drok_fhandle; /* result file handle */ struct nfsfattr drok_attr; /* result file attributes */ }; /* * Results from directory operation */ struct nfsdiropres { enum nfsstat dr_status; /* result status */ union { struct nfsdrok dr_drok_u; /* NFS_OK result */ } dr_u; }; #define dr_drok dr_u.dr_drok_u #define dr_fhandle dr_u.dr_drok_u.drok_fhandle #define dr_attr dr_u.dr_drok_u.drok_attr /* * arguments to setattr */ struct nfssaargs { fhandle_t saa_fh; /* fhandle of file to be set */ struct nfssattr saa_sa; /* new attributes */ }; /* * arguments to create and mkdir */ struct nfscreatargs { struct nfsdiropargs ca_da; /* file name to create and parent dir */ struct nfssattr ca_sa; /* initial attributes */ }; /* * arguments to link */ struct nfslinkargs { fhandle_t la_from; /* old file */ struct nfsdiropargs la_to; /* new file and parent dir */ }; /* * arguments to rename */ struct nfsrnmargs { struct nfsdiropargs rna_from; /* old file and parent dir */ struct nfsdiropargs rna_to; /* new file and parent dir */ }; /* * arguments to symlink */ struct nfsslargs { struct nfsdiropargs sla_from; /* old file and parent dir */ char *sla_tnm; /* new name */ struct nfssattr sla_sa; /* attributes */ }; /* * NFS_OK part of statfs operation */ struct nfsstatfsok { u_int fsok_tsize; /* preferred transfer size in bytes */ u_int fsok_bsize; /* fundamental file system block size */ u_int fsok_blocks; /* total blocks in file system */ u_int fsok_bfree; /* free blocks in fs */ u_int fsok_bavail; /* free blocks avail to non-superuser */ }; /* * Results of statfs operation */ struct nfsstatfs { enum nfsstat fs_status; /* result status */ union { struct nfsstatfsok fs_fsok_u; /* NFS_OK result */ } fs_u; }; #define fs_fsok fs_u.fs_fsok_u #define fs_tsize fs_u.fs_fsok_u.fsok_tsize #define fs_bsize fs_u.fs_fsok_u.fsok_bsize #define fs_blocks fs_u.fs_fsok_u.fsok_blocks #define fs_bfree fs_u.fs_fsok_u.fsok_bfree #define fs_bavail fs_u.fs_fsok_u.fsok_bavail /* * XDR routines for handling structures defined above */ bool_t xdr_attrstat(); bool_t xdr_creatargs(); bool_t xdr_diropargs(); bool_t xdr_diropres(); bool_t xdr_drok(); bool_t xdr_fattr(); bool_t xdr_fhandle(); bool_t xdr_linkargs(); bool_t xdr_rddirargs(); bool_t xdr_putrddirres(); bool_t xdr_getrddirres(); bool_t xdr_rdlnres(); bool_t xdr_rdresult(); bool_t xdr_readargs(); bool_t xdr_rnmargs(); bool_t xdr_rrok(); bool_t xdr_saargs(); bool_t xdr_sattr(); bool_t xdr_slargs(); bool_t xdr_srok(); bool_t xdr_timeval(); bool_t xdr_writeargs(); bool_t xdr_statfs(); /* * Remote file service routines */ #define RFS_NULL 0 #define RFS_GETATTR 1 #define RFS_SETATTR 2 #define RFS_ROOT 3 #define RFS_LOOKUP 4 #define RFS_READLINK 5 #define RFS_READ 6 #define RFS_WRITECACHE 7 #define RFS_WRITE 8 #define RFS_CREATE 9 #define RFS_REMOVE 10 #define RFS_RENAME 11 #define RFS_LINK 12 #define RFS_SYMLINK 13 #define RFS_MKDIR 14 #define RFS_RMDIR 15 #define RFS_READDIR 16 #define RFS_STATFS 17 #define RFS_NPROC 18 /* * remote file service numbers */ #define NFS_PROGRAM ((u_long)100003) #define NFS_VERSION ((u_long)2) #define NFS_PORT 2049 /* * isrofile macro */ #define isrofile(vp) (vp->v_type != VCHR && \ vp->v_type != VBLK && \ vp->v_type != VFIFO && \ (vp->v_vfsp->vfs_flag & VFS_RDONLY)) #ifdef _KERNEL #ifndef dprint #define dprint if (nfsdebug > 2) __dprint__ #endif #define printf console_printf #endif #endif /* __NFS_HEADER__ */ #endif