Home | History | Annotate | Line # | Download | only in librpcsvc
nfs_prot.x revision 1.3
      1 /*
      2  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      3  * unrestricted use provided that this legend is included on all tape
      4  * media and as a part of the software program in whole or part.  Users
      5  * may copy or modify Sun RPC without charge, but are not authorized
      6  * to license or distribute it to anyone else except as part of a product or
      7  * program developed by the user.
      8  *
      9  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     10  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     11  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     12  *
     13  * Sun RPC is provided with no support and without any obligation on the
     14  * part of Sun Microsystems, Inc. to assist in its use, correction,
     15  * modification or enhancement.
     16  *
     17  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     18  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     19  * OR ANY PART THEREOF.
     20  *
     21  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     22  * or profits or other special, indirect and consequential damages, even if
     23  * Sun has been advised of the possibility of such damages.
     24  *
     25  * Sun Microsystems, Inc.
     26  * 2550 Garcia Avenue
     27  * Mountain View, California  94043
     28  */
     29 
     30 #ifndef RPC_HDR
     31 %#include <sys/cdefs.h>
     32 %#ifndef lint
     33 %/*static char sccsid[] = "from: @(#)nfs_prot.x 1.2 87/10/12 Copyr 1987 Sun Micro";*/
     34 %/*static char sccsid[] = "from: @(#)nfs_prot.x	2.1 88/08/01 4.0 RPCSRC";*/
     35 %__RCSID("$NetBSD: nfs_prot.x,v 1.3 1997/10/09 14:21:21 lukem Exp $");
     36 %#endif /* not lint */
     37 #endif
     38 
     39 const NFS_PORT          = 2049;
     40 const NFS_MAXDATA       = 8192;
     41 const NFS_MAXPATHLEN    = 1024;
     42 const NFS_MAXNAMLEN	= 255;
     43 const NFS_FHSIZE	= 32;
     44 const NFS_COOKIESIZE	= 4;
     45 const NFS_FIFO_DEV	= -1;	/* size kludge for named pipes */
     46 
     47 /*
     48  * File types
     49  */
     50 const NFSMODE_FMT  = 0170000;	/* type of file */
     51 const NFSMODE_DIR  = 0040000;	/* directory */
     52 const NFSMODE_CHR  = 0020000;	/* character special */
     53 const NFSMODE_BLK  = 0060000;	/* block special */
     54 const NFSMODE_REG  = 0100000;	/* regular */
     55 const NFSMODE_LNK  = 0120000;	/* symbolic link */
     56 const NFSMODE_SOCK = 0140000;	/* socket */
     57 const NFSMODE_FIFO = 0010000;	/* fifo */
     58 
     59 /*
     60  * Error status
     61  */
     62 enum nfsstat {
     63 	NFS_OK= 0,		/* no error */
     64 	NFSERR_PERM=1,		/* Not owner */
     65 	NFSERR_NOENT=2,		/* No such file or directory */
     66 	NFSERR_IO=5,		/* I/O error */
     67 	NFSERR_NXIO=6,		/* No such device or address */
     68 	NFSERR_ACCES=13,	/* Permission denied */
     69 	NFSERR_EXIST=17,	/* File exists */
     70 	NFSERR_NODEV=19,	/* No such device */
     71 	NFSERR_NOTDIR=20,	/* Not a directory*/
     72 	NFSERR_ISDIR=21,	/* Is a directory */
     73 	NFSERR_FBIG=27,		/* File too large */
     74 	NFSERR_NOSPC=28,	/* No space left on device */
     75 	NFSERR_ROFS=30,		/* Read-only file system */
     76 	NFSERR_NAMETOOLONG=63,	/* File name too long */
     77 	NFSERR_NOTEMPTY=66,	/* Directory not empty */
     78 	NFSERR_DQUOT=69,	/* Disc quota exceeded */
     79 	NFSERR_STALE=70,	/* Stale NFS file handle */
     80 	NFSERR_WFLUSH=99	/* write cache flushed */
     81 };
     82 
     83 /*
     84  * File types
     85  */
     86 enum ftype {
     87 	NFNON = 0,	/* non-file */
     88 	NFREG = 1,	/* regular file */
     89 	NFDIR = 2,	/* directory */
     90 	NFBLK = 3,	/* block special */
     91 	NFCHR = 4,	/* character special */
     92 	NFLNK = 5,	/* symbolic link */
     93 	NFSOCK = 6,	/* unix domain sockets */
     94 	NFBAD = 7,	/* unused */
     95 	NFFIFO = 8 	/* named pipe */
     96 };
     97 
     98 /*
     99  * File access handle
    100  */
    101 struct nfs_fh {
    102 	opaque data[NFS_FHSIZE];
    103 };
    104 
    105 /*
    106  * Timeval
    107  */
    108 struct nfstime {
    109 	unsigned seconds;
    110 	unsigned useconds;
    111 };
    112 
    113 
    114 /*
    115  * File attributes
    116  */
    117 struct fattr {
    118 	ftype type;		/* file type */
    119 	unsigned mode;		/* protection mode bits */
    120 	unsigned nlink;		/* # hard links */
    121 	unsigned uid;		/* owner user id */
    122 	unsigned gid;		/* owner group id */
    123 	unsigned size;		/* file size in bytes */
    124 	unsigned blocksize;	/* prefered block size */
    125 	unsigned rdev;		/* special device # */
    126 	unsigned blocks;	/* Kb of disk used by file */
    127 	unsigned fsid;		/* device # */
    128 	unsigned fileid;	/* inode # */
    129 	nfstime	atime;		/* time of last access */
    130 	nfstime	mtime;		/* time of last modification */
    131 	nfstime	ctime;		/* time of last change */
    132 };
    133 
    134 /*
    135  * File attributes which can be set
    136  */
    137 struct sattr {
    138 	unsigned mode;	/* protection mode bits */
    139 	unsigned uid;	/* owner user id */
    140 	unsigned gid;	/* owner group id */
    141 	unsigned size;	/* file size in bytes */
    142 	nfstime	atime;	/* time of last access */
    143 	nfstime	mtime;	/* time of last modification */
    144 };
    145 
    146 
    147 typedef string filename<NFS_MAXNAMLEN>;
    148 typedef string nfspath<NFS_MAXPATHLEN>;
    149 
    150 /*
    151  * Reply status with file attributes
    152  */
    153 union attrstat switch (nfsstat status) {
    154 case NFS_OK:
    155 	fattr attributes;
    156 default:
    157 	void;
    158 };
    159 
    160 struct sattrargs {
    161 	nfs_fh file;
    162 	sattr attributes;
    163 };
    164 
    165 /*
    166  * Arguments for directory operations
    167  */
    168 struct diropargs {
    169 	nfs_fh	dir;	/* directory file handle */
    170 	filename name;		/* name (up to NFS_MAXNAMLEN bytes) */
    171 };
    172 
    173 struct diropokres {
    174 	nfs_fh file;
    175 	fattr attributes;
    176 };
    177 
    178 /*
    179  * Results from directory operation
    180  */
    181 union diropres switch (nfsstat status) {
    182 case NFS_OK:
    183 	diropokres diropres;
    184 default:
    185 	void;
    186 };
    187 
    188 union readlinkres switch (nfsstat status) {
    189 case NFS_OK:
    190 	nfspath data;
    191 default:
    192 	void;
    193 };
    194 
    195 /*
    196  * Arguments to remote read
    197  */
    198 struct readargs {
    199 	nfs_fh file;		/* handle for file */
    200 	unsigned offset;	/* byte offset in file */
    201 	unsigned count;		/* immediate read count */
    202 	unsigned totalcount;	/* total read count (from this offset)*/
    203 };
    204 
    205 /*
    206  * Status OK portion of remote read reply
    207  */
    208 struct readokres {
    209 	fattr	attributes;	/* attributes, need for pagin*/
    210 	opaque data<NFS_MAXDATA>;
    211 };
    212 
    213 union readres switch (nfsstat status) {
    214 case NFS_OK:
    215 	readokres reply;
    216 default:
    217 	void;
    218 };
    219 
    220 /*
    221  * Arguments to remote write
    222  */
    223 struct writeargs {
    224 	nfs_fh	file;		/* handle for file */
    225 	unsigned beginoffset;	/* beginning byte offset in file */
    226 	unsigned offset;	/* current byte offset in file */
    227 	unsigned totalcount;	/* total write count (to this offset)*/
    228 	opaque data<NFS_MAXDATA>;
    229 };
    230 
    231 struct createargs {
    232 	diropargs where;
    233 	sattr attributes;
    234 };
    235 
    236 struct renameargs {
    237 	diropargs from;
    238 	diropargs to;
    239 };
    240 
    241 struct linkargs {
    242 	nfs_fh from;
    243 	diropargs to;
    244 };
    245 
    246 struct symlinkargs {
    247 	diropargs from;
    248 	nfspath to;
    249 	sattr attributes;
    250 };
    251 
    252 
    253 typedef opaque nfscookie[NFS_COOKIESIZE];
    254 
    255 /*
    256  * Arguments to readdir
    257  */
    258 struct readdirargs {
    259 	nfs_fh dir;		/* directory handle */
    260 	nfscookie cookie;
    261 	unsigned count;		/* number of directory bytes to read */
    262 };
    263 
    264 struct entry {
    265 	unsigned fileid;
    266 	filename name;
    267 	nfscookie cookie;
    268 	entry *nextentry;
    269 };
    270 
    271 struct dirlist {
    272 	entry *entries;
    273 	bool eof;
    274 };
    275 
    276 union readdirres switch (nfsstat status) {
    277 case NFS_OK:
    278 	dirlist reply;
    279 default:
    280 	void;
    281 };
    282 
    283 struct statfsokres {
    284 	unsigned tsize;	/* preferred transfer size in bytes */
    285 	unsigned bsize;	/* fundamental file system block size */
    286 	unsigned blocks;	/* total blocks in file system */
    287 	unsigned bfree;	/* free blocks in fs */
    288 	unsigned bavail;	/* free blocks avail to non-superuser */
    289 };
    290 
    291 union statfsres switch (nfsstat status) {
    292 case NFS_OK:
    293 	statfsokres reply;
    294 default:
    295 	void;
    296 };
    297 
    298 /*
    299  * Remote file service routines
    300  */
    301 program NFS_PROGRAM {
    302 	version NFS_VERSION {
    303 		void
    304 		NFSPROC_NULL(void) = 0;
    305 
    306 		attrstat
    307 		NFSPROC_GETATTR(nfs_fh) =	1;
    308 
    309 		attrstat
    310 		NFSPROC_SETATTR(sattrargs) = 2;
    311 
    312 		void
    313 		NFSPROC_ROOT(void) = 3;
    314 
    315 		diropres
    316 		NFSPROC_LOOKUP(diropargs) = 4;
    317 
    318 		readlinkres
    319 		NFSPROC_READLINK(nfs_fh) = 5;
    320 
    321 		readres
    322 		NFSPROC_READ(readargs) = 6;
    323 
    324 		void
    325 		NFSPROC_WRITECACHE(void) = 7;
    326 
    327 		attrstat
    328 		NFSPROC_WRITE(writeargs) = 8;
    329 
    330 		diropres
    331 		NFSPROC_CREATE(createargs) = 9;
    332 
    333 		nfsstat
    334 		NFSPROC_REMOVE(diropargs) = 10;
    335 
    336 		nfsstat
    337 		NFSPROC_RENAME(renameargs) = 11;
    338 
    339 		nfsstat
    340 		NFSPROC_LINK(linkargs) = 12;
    341 
    342 		nfsstat
    343 		NFSPROC_SYMLINK(symlinkargs) = 13;
    344 
    345 		diropres
    346 		NFSPROC_MKDIR(createargs) = 14;
    347 
    348 		nfsstat
    349 		NFSPROC_RMDIR(diropargs) = 15;
    350 
    351 		readdirres
    352 		NFSPROC_READDIR(readdirargs) = 16;
    353 
    354 		statfsres
    355 		NFSPROC_STATFS(nfs_fh) = 17;
    356 	} = 2;
    357 } = 100003;
    358 
    359