Home | History | Annotate | Download | only in rpcsvc
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /* ident	"%Z%%M%	%I%	%E% SMI" */
     23 
     24 /*
     25  * Copyright (c) 1988,1990-1992,1998 by Sun Microsystems, Inc.
     26  * All rights reserved.
     27  */
     28 
     29 /*
     30  * Protocol description for the mount program
     31  */
     32 
     33 const MNTPATHLEN = 1024;	/* maximum bytes in a pathname argument */
     34 const MNTNAMLEN = 255;		/* maximum bytes in a name argument */
     35 const FHSIZE = 32;		/* size in bytes of a v2 file handle */
     36 const FHSIZE3 = 64;		/*  "   "    "   "  " v3  "     "    */
     37 
     38 /*
     39  * The fhandle is the file handle that the server passes to the client.
     40  * All file operations are done using the file handles to refer to a file
     41  * or a directory. The file handle can contain whatever information the
     42  * server needs to distinguish an individual file.
     43  *
     44  * Versions 1 and 2 of the protocol share a filehandle of 32 bytes.
     45  *
     46  * Version 3 supports a 64 byte filehandle that can be used only
     47  * with version 3 of the NFS protocol.
     48  */
     49 
     50 typedef opaque fhandle[FHSIZE];
     51 typedef opaque fhandle3<FHSIZE3>;
     52 
     53 /*
     54  * If a V2 status of zero is returned, the call completed successfully, and
     55  * a file handle for the directory follows. A non-zero status indicates
     56  * some sort of error. The status corresponds with UNIX error numbers.
     57  */
     58 union fhstatus switch (unsigned fhs_status) {
     59 case 0:
     60 	fhandle fhs_fhandle;
     61 default:
     62 	void;
     63 };
     64 
     65 /*
     66  * This #define is added for backwards compatability with applications
     67  * which reference the old style fhstatus.  The second element of that
     68  * structure was called fhs_fh, instead of the current fhs_fhandle.
     69  */
     70 %
     71 %#define	fhs_fh	fhstatus_u.fhs_fhandle
     72 
     73 /*
     74  * The following status codes are defined for the V3 mount service:
     75  * Note that the precise enum encoding must be followed; the values
     76  * are derived from existing implementation practice, and there is
     77  * no good reason to disturb them.
     78  */
     79 enum mountstat3 {
     80         MNT_OK= 0,              /* no error */
     81         MNT3ERR_PERM=1,         /* Not owner */
     82         MNT3ERR_NOENT=2,        /* No such file or directory */
     83         MNT3ERR_IO=5,           /* I/O error */
     84         MNT3ERR_ACCES=13,       /* Permission denied */
     85         MNT3ERR_NOTDIR=20,      /* Not a directory*/
     86         MNT3ERR_INVAL=22,       /* Invalid argument.*/
     87         MNT3ERR_NAMETOOLONG=63, /* File name too long */
     88         MNT3ERR_NOTSUPP=10004,  /* operation not supported */
     89         MNT3ERR_SERVERFAULT=10006 /* An i/o or similar failure caused */
     90                                 /* the server to abandon the request */
     91                                 /* No attributes can be returned. The */
     92                                 /* client should translate this into EIO */
     93 };
     94 
     95 /*
     96  * A V3 server returns a file handle and a list of the authentication
     97  * flavors that the server will accept for this mount.  If the list
     98  * is empty, AUTH_UNIX is required.  Otherwise, any of the flavors
     99  * listed in auth_flavors<> may be used (but no others).
    100  * The values of the authentication flavors are defined in the
    101  * underlying RPC protocol.
    102  */
    103 struct mountres3_ok {
    104 	fhandle3 fhandle;
    105 	int auth_flavors<>;
    106 };
    107 
    108 /*
    109  * If a V3 status of MNT_OK is returned, the call completed successfully, and
    110  * a file handle for the directory follows. Any other status indicates
    111  * some sort of error.
    112  */
    113 
    114 union mountres3 switch (mountstat3 fhs_status) {
    115 case MNT_OK:
    116         mountres3_ok mountinfo;
    117 default:
    118         void;
    119 };
    120 
    121 /*
    122  * The type dirpath is the pathname of a directory
    123  */
    124 typedef string dirpath<MNTPATHLEN>;
    125 
    126 /*
    127  * The type name is used for arbitrary names (hostnames, groupnames)
    128  */
    129 typedef string name<MNTNAMLEN>;
    130 
    131 /*
    132  * A list of who has what mounted. This information is
    133  * strictly advisory, since there is no mechanism to
    134  * enforce the removal of stale information. The strongest
    135  * assertion that can be made is that if a hostname:directory
    136  * pair appears in the list, the server has exported the
    137  * directory to that client at some point since the server
    138  * export data base was (re)initialized. Note also that there
    139  * is no limit on the length of the information returned
    140  * in this structure, and this may cause problems if the
    141  * mount service is accessed via a connectionless transport.
    142  *
    143  * The ifdef will ensure that these are only carried over to
    144  * mount.h - no xdr routines will be generated. We want to
    145  * do these by hand, to avoid the recursive stack-blowing ones
    146  * that rpcgen will generate.
    147  */
    148 #ifdef RPC_HDR
    149 typedef struct mountbody *mountlist;
    150 struct mountbody {
    151 	name ml_hostname;
    152 	dirpath ml_directory;
    153 	mountlist ml_next;
    154 };
    155 #endif /* RPC_HDR */
    156 
    157 /*
    158  * A list of netgroups
    159  */
    160 typedef struct groupnode *groups;
    161 struct groupnode {
    162 	name gr_name;
    163 	groups gr_next;
    164 };
    165 
    166 /*
    167  * A list of what is exported and to whom
    168  */
    169 typedef struct exportnode *exports;
    170 struct exportnode {
    171 	dirpath ex_dir;
    172 	groups ex_groups;
    173 	exports ex_next;
    174 };
    175 
    176 /*
    177  * POSIX pathconf information
    178  */
    179 struct ppathcnf {
    180 	int	pc_link_max;	/* max links allowed */
    181 	short	pc_max_canon;	/* max line len for a tty */
    182 	short	pc_max_input;	/* input a tty can eat all at once */
    183 	short	pc_name_max;	/* max file name length (dir entry) */
    184 	short	pc_path_max;	/* max path name length (/x/y/x/.. ) */
    185 	short	pc_pipe_buf;	/* size of a pipe (bytes) */
    186 	u_char	pc_vdisable;	/* safe char to turn off c_cc[i] */
    187 	char	pc_xxx;		/* alignment padding; cc_t == char */
    188 	short	pc_mask[2];	/* validity and boolean bits */
    189 };
    190 
    191 program MOUNTPROG {
    192 	/*
    193 	 * Version one of the mount protocol communicates with version two
    194 	 * of the NFS protocol. The only connecting point is the fhandle
    195 	 * structure, which is the same for both protocols.
    196 	 */
    197 	version MOUNTVERS {
    198 		/*
    199 		 * Does no work. It is made available in all RPC services
    200 		 * to allow server reponse testing and timing
    201 		 */
    202 		void
    203 		MOUNTPROC_NULL(void) = 0;
    204 
    205 		/*
    206 		 * If fhs_status is 0, then fhs_fhandle contains the
    207 	 	 * file handle for the directory. This file handle may
    208 		 * be used in the NFS protocol. This procedure also adds
    209 		 * a new entry to the mount list for this client mounting
    210 		 * the directory.
    211 		 * Unix authentication required.
    212 		 */
    213 		fhstatus
    214 		MOUNTPROC_MNT(dirpath) = 1;
    215 
    216 		/*
    217 		 * Returns the list of remotely mounted filesystems. The
    218 		 * mountlist contains one entry for each hostname and
    219 		 * directory pair.
    220 		 */
    221 		mountlist
    222 		MOUNTPROC_DUMP(void) = 2;
    223 
    224 		/*
    225 		 * Removes the mount list entry for the directory
    226 		 * Unix authentication required.
    227 		 */
    228 		void
    229 		MOUNTPROC_UMNT(dirpath) = 3;
    230 
    231 		/*
    232 		 * Removes all of the mount list entries for this client
    233 		 * Unix authentication required.
    234 		 */
    235 		void
    236 		MOUNTPROC_UMNTALL(void) = 4;
    237 
    238 		/*
    239 		 * Returns a list of all the exported filesystems, and which
    240 		 * machines are allowed to import it.
    241 		 */
    242 		exports
    243 		MOUNTPROC_EXPORT(void)  = 5;
    244 
    245 		/*
    246 		 * Identical to MOUNTPROC_EXPORT above
    247 		 */
    248 		exports
    249 		MOUNTPROC_EXPORTALL(void) = 6;
    250 	} = 1;
    251 
    252 	/*
    253 	 * Version two of the mount protocol communicates with version two
    254 	 * of the NFS protocol. It is identical to version one except for a
    255 	 * new procedure call for posix.
    256 	 */
    257 	version MOUNTVERS_POSIX {
    258 		/*
    259 		 * Does no work. It is made available in all RPC services
    260 		 * to allow server reponse testing and timing
    261 		 */
    262 		void
    263 		MOUNTPROC_NULL(void) = 0;
    264 
    265 		/*
    266 		 * If fhs_status is 0, then fhs_fhandle contains the
    267 	 	 * file handle for the directory. This file handle may
    268 		 * be used in the NFS protocol. This procedure also adds
    269 		 * a new entry to the mount list for this client mounting
    270 		 * the directory.
    271 		 * Unix authentication required.
    272 		 */
    273 		fhstatus
    274 		MOUNTPROC_MNT(dirpath) = 1;
    275 
    276 		/*
    277 		 * Returns the list of remotely mounted filesystems. The
    278 		 * mountlist contains one entry for each hostname and
    279 		 * directory pair.
    280 		 */
    281 		mountlist
    282 		MOUNTPROC_DUMP(void) = 2;
    283 
    284 		/*
    285 		 * Removes the mount list entry for the directory
    286 		 * Unix authentication required.
    287 		 */
    288 		void
    289 		MOUNTPROC_UMNT(dirpath) = 3;
    290 
    291 		/*
    292 		 * Removes all of the mount list entries for this client
    293 		 * Unix authentication required.
    294 		 */
    295 		void
    296 		MOUNTPROC_UMNTALL(void) = 4;
    297 
    298 		/*
    299 		 * Returns a list of all the exported filesystems, and which
    300 		 * machines are allowed to import it.
    301 		 */
    302 		exports
    303 		MOUNTPROC_EXPORT(void)  = 5;
    304 
    305 		/*
    306 		 * Identical to MOUNTPROC_EXPORT above
    307 		 */
    308 		exports
    309 		MOUNTPROC_EXPORTALL(void) = 6;
    310 
    311 		/*
    312 		 * Posix info over the wire isn't supported in NFS version 2
    313 		 * so we get it here at mount time.
    314 		 */
    315 		ppathcnf
    316 		MOUNTPROC_PATHCONF(dirpath) = 7;
    317 	} = 2;
    318 
    319 	/*
    320 	 * Version 3 of the mount protocol communicates with version 3
    321 	 * of the NFS protocol. The only connecting point is the nfs_fh3
    322 	 * structure, which is the same for both protocols.
    323 	 *
    324 	 * The only significant change over version 2 is that MOUNTPROC_MNT
    325 	 * returns a longer filehandle (64 bytes instead of 32) as well
    326 	 * as authentication information.  MOUNTPROC_PATHCONF is subsumed
    327 	 * into V3 of the NFS protocol and MOUNTPROC_EXPORTALL is eliminated.
    328 	 */
    329 	version MOUNTVERS3 {
    330 		/*
    331 		 * Does no work. It is made available in all RPC services
    332 		 * to allow server reponse testing and timing
    333 		 */
    334 		void
    335 		MOUNTPROC_NULL(void) = 0;
    336 
    337 		/*
    338 		 * Mount a file system.
    339 		 *
    340 		 * If mountres.fhs_status is NFS_OK, then mountres.mountinfo
    341 		 * contains the file handle for the directory and
    342 		 * a list of acceptable authentication flavors. This file
    343 		 * handle may only be used in version 3 of the NFS protocol.
    344 		 * This procedure also results in the server adding a new
    345 		 * entry to its mount list recording that this client has
    346 		 * mounted the directory. Unix authentication or better
    347 		 * is required.
    348 		 */
    349 		mountres3
    350 		MOUNTPROC_MNT(dirpath) = 1;
    351 
    352 		/*
    353 		 * Returns the list of remotely mounted filesystems. The
    354 		 * mountlist contains one entry for each hostname and
    355 		 * directory pair.
    356 		 */
    357 		mountlist
    358 		MOUNTPROC_DUMP(void) = 2;
    359 
    360 		/*
    361 		 * Removes the mount list entry for the directory
    362 		 * Unix authentication or better is required.
    363 		 */
    364 		void
    365 		MOUNTPROC_UMNT(dirpath) = 3;
    366 
    367 		/*
    368 		 * Removes all of the mount list entries for this client
    369 		 * Unix authentication or better is required.
    370 		 */
    371 		void
    372 		MOUNTPROC_UMNTALL(void) = 4;
    373 
    374 		/*
    375 		 * Returns a list of all the exported filesystems, and which
    376 		 * machines are allowed to import each one.
    377 		 */
    378 		exports
    379 		MOUNTPROC_EXPORT(void)  = 5;
    380 
    381 	} = 3;
    382 } = 100005;
    383