1*c10f8b50Spgoyette /* $NetBSD: nfs_nfsdsubs.c,v 1.4 2016/12/13 21:50:32 pgoyette Exp $ */
26ca35587Sdholland /*-
36ca35587Sdholland * Copyright (c) 1989, 1993
46ca35587Sdholland * The Regents of the University of California. All rights reserved.
56ca35587Sdholland *
66ca35587Sdholland * This code is derived from software contributed to Berkeley by
76ca35587Sdholland * Rick Macklem at The University of Guelph.
86ca35587Sdholland *
96ca35587Sdholland * Redistribution and use in source and binary forms, with or without
106ca35587Sdholland * modification, are permitted provided that the following conditions
116ca35587Sdholland * are met:
126ca35587Sdholland * 1. Redistributions of source code must retain the above copyright
136ca35587Sdholland * notice, this list of conditions and the following disclaimer.
146ca35587Sdholland * 2. Redistributions in binary form must reproduce the above copyright
156ca35587Sdholland * notice, this list of conditions and the following disclaimer in the
166ca35587Sdholland * documentation and/or other materials provided with the distribution.
176ca35587Sdholland * 4. Neither the name of the University nor the names of its contributors
186ca35587Sdholland * may be used to endorse or promote products derived from this software
196ca35587Sdholland * without specific prior written permission.
206ca35587Sdholland *
216ca35587Sdholland * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
226ca35587Sdholland * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
236ca35587Sdholland * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
246ca35587Sdholland * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
256ca35587Sdholland * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
266ca35587Sdholland * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
276ca35587Sdholland * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
286ca35587Sdholland * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
296ca35587Sdholland * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
306ca35587Sdholland * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
316ca35587Sdholland * SUCH DAMAGE.
326ca35587Sdholland *
336ca35587Sdholland */
346ca35587Sdholland
356ca35587Sdholland #include <sys/cdefs.h>
362d39560cSpgoyette /* __FBSDID("FreeBSD: head/sys/fs/nfsserver/nfs_nfsdsubs.c 298523 2016-04-23 21:18:45Z rmacklem "); */
37*c10f8b50Spgoyette __RCSID("$NetBSD: nfs_nfsdsubs.c,v 1.4 2016/12/13 21:50:32 pgoyette Exp $");
386ca35587Sdholland
396ca35587Sdholland #ifndef APPLEKEXT
40*c10f8b50Spgoyette
41*c10f8b50Spgoyette #ifdef _KERNEL_OPT
42*c10f8b50Spgoyette #include "opt_newnfs.h"
43*c10f8b50Spgoyette #endif
44*c10f8b50Spgoyette
456ca35587Sdholland /*
466ca35587Sdholland * These functions support the macros and help fiddle mbuf chains for
476ca35587Sdholland * the nfs op functions. They do things like create the rpc header and
486ca35587Sdholland * copy data between mbuf chains and uio lists.
496ca35587Sdholland */
50*c10f8b50Spgoyette #include <fs/nfs/common/nfsport.h>
516ca35587Sdholland
526ca35587Sdholland extern u_int32_t newnfs_true, newnfs_false;
536ca35587Sdholland extern int nfs_pubfhset;
542d39560cSpgoyette extern struct nfsclienthashhead *nfsclienthash;
552d39560cSpgoyette extern int nfsrv_clienthashsize;
562d39560cSpgoyette extern struct nfslockhashhead *nfslockhash;
572d39560cSpgoyette extern int nfsrv_lockhashsize;
582d39560cSpgoyette extern struct nfssessionhash *nfssessionhash;
592d39560cSpgoyette extern int nfsrv_sessionhashsize;
606ca35587Sdholland extern int nfsrv_useacl;
616ca35587Sdholland extern uid_t nfsrv_defaultuid;
626ca35587Sdholland extern gid_t nfsrv_defaultgid;
636ca35587Sdholland
646ca35587Sdholland char nfs_v2pubfh[NFSX_V2FH];
656ca35587Sdholland static nfstype newnfsv2_type[9] = { NFNON, NFREG, NFDIR, NFBLK, NFCHR, NFLNK,
666ca35587Sdholland NFNON, NFCHR, NFNON };
676ca35587Sdholland extern nfstype nfsv34_type[9];
686ca35587Sdholland #endif /* !APPLEKEXT */
696ca35587Sdholland
702d39560cSpgoyette static u_int32_t nfsrv_isannfserr(u_int32_t);
712d39560cSpgoyette
726ca35587Sdholland SYSCTL_DECL(_vfs_nfsd);
736ca35587Sdholland
742d39560cSpgoyette static int enable_checkutf8 = 1;
752d39560cSpgoyette SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_checkutf8, CTLFLAG_RW,
762d39560cSpgoyette &enable_checkutf8, 0,
772d39560cSpgoyette "Enable the NFSv4 check for the UTF8 compliant name required by rfc3530");
782d39560cSpgoyette
792d39560cSpgoyette static int enable_nobodycheck = 1;
802d39560cSpgoyette SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_nobodycheck, CTLFLAG_RW,
812d39560cSpgoyette &enable_nobodycheck, 0,
822d39560cSpgoyette "Enable the NFSv4 check when setting user nobody as owner");
832d39560cSpgoyette
842d39560cSpgoyette static int enable_nogroupcheck = 1;
852d39560cSpgoyette SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_nogroupcheck, CTLFLAG_RW,
862d39560cSpgoyette &enable_nogroupcheck, 0,
872d39560cSpgoyette "Enable the NFSv4 check when setting group nogroup as owner");
886ca35587Sdholland
896ca35587Sdholland static char nfsrv_hexdigit(char, int *);
906ca35587Sdholland
916ca35587Sdholland /*
926ca35587Sdholland * Maps errno values to nfs error numbers.
936ca35587Sdholland * Use NFSERR_IO as the catch all for ones not specifically defined in
942d39560cSpgoyette * RFC 1094. (It now includes the errors added for NFSv3.)
956ca35587Sdholland */
962d39560cSpgoyette static u_char nfsrv_v2errmap[NFSERR_REMOTE] = {
976ca35587Sdholland NFSERR_PERM, NFSERR_NOENT, NFSERR_IO, NFSERR_IO, NFSERR_IO,
986ca35587Sdholland NFSERR_NXIO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
996ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_ACCES, NFSERR_IO, NFSERR_IO,
1002d39560cSpgoyette NFSERR_IO, NFSERR_EXIST, NFSERR_XDEV, NFSERR_NODEV, NFSERR_NOTDIR,
1012d39560cSpgoyette NFSERR_ISDIR, NFSERR_INVAL, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1026ca35587Sdholland NFSERR_IO, NFSERR_FBIG, NFSERR_NOSPC, NFSERR_IO, NFSERR_ROFS,
1032d39560cSpgoyette NFSERR_MLINK, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1046ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1056ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1066ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1076ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1086ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO, NFSERR_IO,
1096ca35587Sdholland NFSERR_IO, NFSERR_IO, NFSERR_NAMETOL, NFSERR_IO, NFSERR_IO,
1106ca35587Sdholland NFSERR_NOTEMPTY, NFSERR_IO, NFSERR_IO, NFSERR_DQUOT, NFSERR_STALE,
1112d39560cSpgoyette NFSERR_REMOTE,
1126ca35587Sdholland };
1136ca35587Sdholland
1146ca35587Sdholland /*
1156ca35587Sdholland * Maps errno values to nfs error numbers.
1166ca35587Sdholland * Although it is not obvious whether or not NFS clients really care if
1176ca35587Sdholland * a returned error value is in the specified list for the procedure, the
1186ca35587Sdholland * safest thing to do is filter them appropriately. For Version 2, the
1196ca35587Sdholland * X/Open XNFS document is the only specification that defines error values
1206ca35587Sdholland * for each RPC (The RFC simply lists all possible error values for all RPCs),
1216ca35587Sdholland * so I have decided to not do this for Version 2.
1226ca35587Sdholland * The first entry is the default error return and the rest are the valid
1236ca35587Sdholland * errors for that RPC in increasing numeric order.
1246ca35587Sdholland */
1256ca35587Sdholland static short nfsv3err_null[] = {
1266ca35587Sdholland 0,
1276ca35587Sdholland 0,
1286ca35587Sdholland };
1296ca35587Sdholland
1306ca35587Sdholland static short nfsv3err_getattr[] = {
1316ca35587Sdholland NFSERR_IO,
1326ca35587Sdholland NFSERR_IO,
1336ca35587Sdholland NFSERR_STALE,
1346ca35587Sdholland NFSERR_BADHANDLE,
1356ca35587Sdholland NFSERR_SERVERFAULT,
1366ca35587Sdholland NFSERR_DELAY,
1376ca35587Sdholland 0,
1386ca35587Sdholland };
1396ca35587Sdholland
1406ca35587Sdholland static short nfsv3err_setattr[] = {
1416ca35587Sdholland NFSERR_IO,
1426ca35587Sdholland NFSERR_ACCES,
1436ca35587Sdholland NFSERR_PERM,
1446ca35587Sdholland NFSERR_IO,
1456ca35587Sdholland NFSERR_INVAL,
1466ca35587Sdholland NFSERR_NOSPC,
1476ca35587Sdholland NFSERR_ROFS,
1486ca35587Sdholland NFSERR_DQUOT,
1496ca35587Sdholland NFSERR_STALE,
1506ca35587Sdholland NFSERR_BADHANDLE,
1516ca35587Sdholland NFSERR_NOT_SYNC,
1526ca35587Sdholland NFSERR_SERVERFAULT,
1536ca35587Sdholland NFSERR_DELAY,
1546ca35587Sdholland 0,
1556ca35587Sdholland };
1566ca35587Sdholland
1576ca35587Sdholland static short nfsv3err_lookup[] = {
1586ca35587Sdholland NFSERR_IO,
1596ca35587Sdholland NFSERR_NOENT,
1606ca35587Sdholland NFSERR_ACCES,
1616ca35587Sdholland NFSERR_NAMETOL,
1626ca35587Sdholland NFSERR_IO,
1636ca35587Sdholland NFSERR_NOTDIR,
1646ca35587Sdholland NFSERR_STALE,
1656ca35587Sdholland NFSERR_BADHANDLE,
1666ca35587Sdholland NFSERR_SERVERFAULT,
1676ca35587Sdholland NFSERR_DELAY,
1686ca35587Sdholland 0,
1696ca35587Sdholland };
1706ca35587Sdholland
1716ca35587Sdholland static short nfsv3err_access[] = {
1726ca35587Sdholland NFSERR_IO,
1736ca35587Sdholland NFSERR_IO,
1746ca35587Sdholland NFSERR_STALE,
1756ca35587Sdholland NFSERR_BADHANDLE,
1766ca35587Sdholland NFSERR_SERVERFAULT,
1776ca35587Sdholland NFSERR_DELAY,
1786ca35587Sdholland 0,
1796ca35587Sdholland };
1806ca35587Sdholland
1816ca35587Sdholland static short nfsv3err_readlink[] = {
1826ca35587Sdholland NFSERR_IO,
1836ca35587Sdholland NFSERR_IO,
1846ca35587Sdholland NFSERR_ACCES,
1856ca35587Sdholland NFSERR_INVAL,
1866ca35587Sdholland NFSERR_STALE,
1876ca35587Sdholland NFSERR_BADHANDLE,
1886ca35587Sdholland NFSERR_NOTSUPP,
1896ca35587Sdholland NFSERR_SERVERFAULT,
1906ca35587Sdholland NFSERR_DELAY,
1916ca35587Sdholland 0,
1926ca35587Sdholland };
1936ca35587Sdholland
1946ca35587Sdholland static short nfsv3err_read[] = {
1956ca35587Sdholland NFSERR_IO,
1966ca35587Sdholland NFSERR_IO,
1976ca35587Sdholland NFSERR_NXIO,
1986ca35587Sdholland NFSERR_ACCES,
1996ca35587Sdholland NFSERR_INVAL,
2006ca35587Sdholland NFSERR_STALE,
2016ca35587Sdholland NFSERR_BADHANDLE,
2026ca35587Sdholland NFSERR_SERVERFAULT,
2036ca35587Sdholland NFSERR_DELAY,
2046ca35587Sdholland 0,
2056ca35587Sdholland };
2066ca35587Sdholland
2076ca35587Sdholland static short nfsv3err_write[] = {
2086ca35587Sdholland NFSERR_IO,
2096ca35587Sdholland NFSERR_IO,
2106ca35587Sdholland NFSERR_ACCES,
2116ca35587Sdholland NFSERR_NOSPC,
2126ca35587Sdholland NFSERR_INVAL,
2136ca35587Sdholland NFSERR_FBIG,
2146ca35587Sdholland NFSERR_ROFS,
2156ca35587Sdholland NFSERR_DQUOT,
2166ca35587Sdholland NFSERR_STALE,
2176ca35587Sdholland NFSERR_BADHANDLE,
2186ca35587Sdholland NFSERR_SERVERFAULT,
2196ca35587Sdholland NFSERR_DELAY,
2206ca35587Sdholland 0,
2216ca35587Sdholland };
2226ca35587Sdholland
2236ca35587Sdholland static short nfsv3err_create[] = {
2246ca35587Sdholland NFSERR_IO,
2256ca35587Sdholland NFSERR_EXIST,
2266ca35587Sdholland NFSERR_NAMETOL,
2276ca35587Sdholland NFSERR_ACCES,
2286ca35587Sdholland NFSERR_IO,
2296ca35587Sdholland NFSERR_NOTDIR,
2306ca35587Sdholland NFSERR_NOSPC,
2316ca35587Sdholland NFSERR_ROFS,
2326ca35587Sdholland NFSERR_DQUOT,
2336ca35587Sdholland NFSERR_STALE,
2346ca35587Sdholland NFSERR_BADHANDLE,
2356ca35587Sdholland NFSERR_NOTSUPP,
2366ca35587Sdholland NFSERR_SERVERFAULT,
2376ca35587Sdholland NFSERR_DELAY,
2386ca35587Sdholland 0,
2396ca35587Sdholland };
2406ca35587Sdholland
2416ca35587Sdholland static short nfsv3err_mkdir[] = {
2426ca35587Sdholland NFSERR_IO,
2436ca35587Sdholland NFSERR_EXIST,
2446ca35587Sdholland NFSERR_ACCES,
2456ca35587Sdholland NFSERR_NAMETOL,
2466ca35587Sdholland NFSERR_IO,
2476ca35587Sdholland NFSERR_NOTDIR,
2486ca35587Sdholland NFSERR_NOSPC,
2496ca35587Sdholland NFSERR_ROFS,
2506ca35587Sdholland NFSERR_DQUOT,
2516ca35587Sdholland NFSERR_STALE,
2526ca35587Sdholland NFSERR_BADHANDLE,
2536ca35587Sdholland NFSERR_NOTSUPP,
2546ca35587Sdholland NFSERR_SERVERFAULT,
2556ca35587Sdholland NFSERR_DELAY,
2566ca35587Sdholland 0,
2576ca35587Sdholland };
2586ca35587Sdholland
2596ca35587Sdholland static short nfsv3err_symlink[] = {
2606ca35587Sdholland NFSERR_IO,
2616ca35587Sdholland NFSERR_ACCES,
2626ca35587Sdholland NFSERR_EXIST,
2636ca35587Sdholland NFSERR_NAMETOL,
2646ca35587Sdholland NFSERR_NOSPC,
2656ca35587Sdholland NFSERR_IO,
2666ca35587Sdholland NFSERR_NOTDIR,
2676ca35587Sdholland NFSERR_ROFS,
2686ca35587Sdholland NFSERR_DQUOT,
2696ca35587Sdholland NFSERR_STALE,
2706ca35587Sdholland NFSERR_BADHANDLE,
2716ca35587Sdholland NFSERR_NOTSUPP,
2726ca35587Sdholland NFSERR_SERVERFAULT,
2736ca35587Sdholland NFSERR_DELAY,
2746ca35587Sdholland 0,
2756ca35587Sdholland };
2766ca35587Sdholland
2776ca35587Sdholland static short nfsv3err_mknod[] = {
2786ca35587Sdholland NFSERR_IO,
2796ca35587Sdholland NFSERR_ACCES,
2806ca35587Sdholland NFSERR_EXIST,
2816ca35587Sdholland NFSERR_NAMETOL,
2826ca35587Sdholland NFSERR_NOSPC,
2836ca35587Sdholland NFSERR_IO,
2846ca35587Sdholland NFSERR_NOTDIR,
2856ca35587Sdholland NFSERR_ROFS,
2866ca35587Sdholland NFSERR_DQUOT,
2876ca35587Sdholland NFSERR_STALE,
2886ca35587Sdholland NFSERR_BADHANDLE,
2896ca35587Sdholland NFSERR_NOTSUPP,
2906ca35587Sdholland NFSERR_SERVERFAULT,
2916ca35587Sdholland NFSERR_DELAY,
2926ca35587Sdholland NFSERR_BADTYPE,
2936ca35587Sdholland 0,
2946ca35587Sdholland };
2956ca35587Sdholland
2966ca35587Sdholland static short nfsv3err_remove[] = {
2976ca35587Sdholland NFSERR_IO,
2986ca35587Sdholland NFSERR_NOENT,
2996ca35587Sdholland NFSERR_ACCES,
3006ca35587Sdholland NFSERR_NAMETOL,
3016ca35587Sdholland NFSERR_IO,
3026ca35587Sdholland NFSERR_NOTDIR,
3036ca35587Sdholland NFSERR_ROFS,
3046ca35587Sdholland NFSERR_STALE,
3056ca35587Sdholland NFSERR_BADHANDLE,
3066ca35587Sdholland NFSERR_SERVERFAULT,
3076ca35587Sdholland NFSERR_DELAY,
3086ca35587Sdholland 0,
3096ca35587Sdholland };
3106ca35587Sdholland
3116ca35587Sdholland static short nfsv3err_rmdir[] = {
3126ca35587Sdholland NFSERR_IO,
3136ca35587Sdholland NFSERR_NOENT,
3146ca35587Sdholland NFSERR_ACCES,
3156ca35587Sdholland NFSERR_NOTDIR,
3166ca35587Sdholland NFSERR_NAMETOL,
3176ca35587Sdholland NFSERR_IO,
3186ca35587Sdholland NFSERR_EXIST,
3196ca35587Sdholland NFSERR_INVAL,
3206ca35587Sdholland NFSERR_ROFS,
3216ca35587Sdholland NFSERR_NOTEMPTY,
3226ca35587Sdholland NFSERR_STALE,
3236ca35587Sdholland NFSERR_BADHANDLE,
3246ca35587Sdholland NFSERR_NOTSUPP,
3256ca35587Sdholland NFSERR_SERVERFAULT,
3266ca35587Sdholland NFSERR_DELAY,
3276ca35587Sdholland 0,
3286ca35587Sdholland };
3296ca35587Sdholland
3306ca35587Sdholland static short nfsv3err_rename[] = {
3316ca35587Sdholland NFSERR_IO,
3326ca35587Sdholland NFSERR_NOENT,
3336ca35587Sdholland NFSERR_ACCES,
3346ca35587Sdholland NFSERR_EXIST,
3356ca35587Sdholland NFSERR_NAMETOL,
3366ca35587Sdholland NFSERR_XDEV,
3376ca35587Sdholland NFSERR_IO,
3386ca35587Sdholland NFSERR_NOTDIR,
3396ca35587Sdholland NFSERR_ISDIR,
3406ca35587Sdholland NFSERR_INVAL,
3416ca35587Sdholland NFSERR_NOSPC,
3426ca35587Sdholland NFSERR_ROFS,
3436ca35587Sdholland NFSERR_MLINK,
3446ca35587Sdholland NFSERR_NOTEMPTY,
3456ca35587Sdholland NFSERR_DQUOT,
3466ca35587Sdholland NFSERR_STALE,
3476ca35587Sdholland NFSERR_BADHANDLE,
3486ca35587Sdholland NFSERR_NOTSUPP,
3496ca35587Sdholland NFSERR_SERVERFAULT,
3506ca35587Sdholland NFSERR_DELAY,
3516ca35587Sdholland 0,
3526ca35587Sdholland };
3536ca35587Sdholland
3546ca35587Sdholland static short nfsv3err_link[] = {
3556ca35587Sdholland NFSERR_IO,
3566ca35587Sdholland NFSERR_ACCES,
3576ca35587Sdholland NFSERR_EXIST,
3586ca35587Sdholland NFSERR_NAMETOL,
3596ca35587Sdholland NFSERR_IO,
3606ca35587Sdholland NFSERR_XDEV,
3616ca35587Sdholland NFSERR_NOTDIR,
3626ca35587Sdholland NFSERR_INVAL,
3636ca35587Sdholland NFSERR_NOSPC,
3646ca35587Sdholland NFSERR_ROFS,
3656ca35587Sdholland NFSERR_MLINK,
3666ca35587Sdholland NFSERR_DQUOT,
3676ca35587Sdholland NFSERR_STALE,
3686ca35587Sdholland NFSERR_BADHANDLE,
3696ca35587Sdholland NFSERR_NOTSUPP,
3706ca35587Sdholland NFSERR_SERVERFAULT,
3716ca35587Sdholland NFSERR_DELAY,
3726ca35587Sdholland 0,
3736ca35587Sdholland };
3746ca35587Sdholland
3756ca35587Sdholland static short nfsv3err_readdir[] = {
3766ca35587Sdholland NFSERR_IO,
3776ca35587Sdholland NFSERR_ACCES,
3786ca35587Sdholland NFSERR_NOTDIR,
3796ca35587Sdholland NFSERR_IO,
3806ca35587Sdholland NFSERR_STALE,
3816ca35587Sdholland NFSERR_BADHANDLE,
3826ca35587Sdholland NFSERR_BAD_COOKIE,
3836ca35587Sdholland NFSERR_TOOSMALL,
3846ca35587Sdholland NFSERR_SERVERFAULT,
3856ca35587Sdholland NFSERR_DELAY,
3866ca35587Sdholland 0,
3876ca35587Sdholland };
3886ca35587Sdholland
3896ca35587Sdholland static short nfsv3err_readdirplus[] = {
3906ca35587Sdholland NFSERR_IO,
3916ca35587Sdholland NFSERR_ACCES,
3926ca35587Sdholland NFSERR_NOTDIR,
3936ca35587Sdholland NFSERR_IO,
3946ca35587Sdholland NFSERR_STALE,
3956ca35587Sdholland NFSERR_BADHANDLE,
3966ca35587Sdholland NFSERR_BAD_COOKIE,
3976ca35587Sdholland NFSERR_NOTSUPP,
3986ca35587Sdholland NFSERR_TOOSMALL,
3996ca35587Sdholland NFSERR_SERVERFAULT,
4006ca35587Sdholland NFSERR_DELAY,
4016ca35587Sdholland 0,
4026ca35587Sdholland };
4036ca35587Sdholland
4046ca35587Sdholland static short nfsv3err_fsstat[] = {
4056ca35587Sdholland NFSERR_IO,
4066ca35587Sdholland NFSERR_IO,
4076ca35587Sdholland NFSERR_STALE,
4086ca35587Sdholland NFSERR_BADHANDLE,
4096ca35587Sdholland NFSERR_SERVERFAULT,
4106ca35587Sdholland NFSERR_DELAY,
4116ca35587Sdholland 0,
4126ca35587Sdholland };
4136ca35587Sdholland
4146ca35587Sdholland static short nfsv3err_fsinfo[] = {
4156ca35587Sdholland NFSERR_STALE,
4166ca35587Sdholland NFSERR_STALE,
4176ca35587Sdholland NFSERR_BADHANDLE,
4186ca35587Sdholland NFSERR_SERVERFAULT,
4196ca35587Sdholland NFSERR_DELAY,
4206ca35587Sdholland 0,
4216ca35587Sdholland };
4226ca35587Sdholland
4236ca35587Sdholland static short nfsv3err_pathconf[] = {
4246ca35587Sdholland NFSERR_STALE,
4256ca35587Sdholland NFSERR_STALE,
4266ca35587Sdholland NFSERR_BADHANDLE,
4276ca35587Sdholland NFSERR_SERVERFAULT,
4286ca35587Sdholland NFSERR_DELAY,
4296ca35587Sdholland 0,
4306ca35587Sdholland };
4316ca35587Sdholland
4326ca35587Sdholland static short nfsv3err_commit[] = {
4336ca35587Sdholland NFSERR_IO,
4346ca35587Sdholland NFSERR_IO,
4356ca35587Sdholland NFSERR_STALE,
4366ca35587Sdholland NFSERR_BADHANDLE,
4376ca35587Sdholland NFSERR_SERVERFAULT,
4386ca35587Sdholland NFSERR_DELAY,
4396ca35587Sdholland 0,
4406ca35587Sdholland };
4416ca35587Sdholland
4426ca35587Sdholland static short *nfsrv_v3errmap[] = {
4436ca35587Sdholland nfsv3err_null,
4446ca35587Sdholland nfsv3err_getattr,
4456ca35587Sdholland nfsv3err_setattr,
4466ca35587Sdholland nfsv3err_lookup,
4476ca35587Sdholland nfsv3err_access,
4486ca35587Sdholland nfsv3err_readlink,
4496ca35587Sdholland nfsv3err_read,
4506ca35587Sdholland nfsv3err_write,
4516ca35587Sdholland nfsv3err_create,
4526ca35587Sdholland nfsv3err_mkdir,
4536ca35587Sdholland nfsv3err_symlink,
4546ca35587Sdholland nfsv3err_mknod,
4556ca35587Sdholland nfsv3err_remove,
4566ca35587Sdholland nfsv3err_rmdir,
4576ca35587Sdholland nfsv3err_rename,
4586ca35587Sdholland nfsv3err_link,
4596ca35587Sdholland nfsv3err_readdir,
4606ca35587Sdholland nfsv3err_readdirplus,
4616ca35587Sdholland nfsv3err_fsstat,
4626ca35587Sdholland nfsv3err_fsinfo,
4636ca35587Sdholland nfsv3err_pathconf,
4646ca35587Sdholland nfsv3err_commit,
4656ca35587Sdholland };
4666ca35587Sdholland
4676ca35587Sdholland /*
4686ca35587Sdholland * And the same for V4.
4696ca35587Sdholland */
4706ca35587Sdholland static short nfsv4err_null[] = {
4716ca35587Sdholland 0,
4726ca35587Sdholland 0,
4736ca35587Sdholland };
4746ca35587Sdholland
4756ca35587Sdholland static short nfsv4err_access[] = {
4766ca35587Sdholland NFSERR_IO,
4776ca35587Sdholland NFSERR_ACCES,
4786ca35587Sdholland NFSERR_BADHANDLE,
4796ca35587Sdholland NFSERR_BADXDR,
4806ca35587Sdholland NFSERR_DELAY,
4816ca35587Sdholland NFSERR_FHEXPIRED,
4826ca35587Sdholland NFSERR_INVAL,
4836ca35587Sdholland NFSERR_IO,
4846ca35587Sdholland NFSERR_MOVED,
4856ca35587Sdholland NFSERR_NOFILEHANDLE,
4866ca35587Sdholland NFSERR_RESOURCE,
4876ca35587Sdholland NFSERR_SERVERFAULT,
4886ca35587Sdholland NFSERR_STALE,
4896ca35587Sdholland 0,
4906ca35587Sdholland };
4916ca35587Sdholland
4926ca35587Sdholland static short nfsv4err_close[] = {
4936ca35587Sdholland NFSERR_EXPIRED,
4946ca35587Sdholland NFSERR_ADMINREVOKED,
4956ca35587Sdholland NFSERR_BADHANDLE,
4966ca35587Sdholland NFSERR_BADSEQID,
4976ca35587Sdholland NFSERR_BADSTATEID,
4986ca35587Sdholland NFSERR_BADXDR,
4996ca35587Sdholland NFSERR_DELAY,
5006ca35587Sdholland NFSERR_EXPIRED,
5016ca35587Sdholland NFSERR_FHEXPIRED,
5026ca35587Sdholland NFSERR_INVAL,
5036ca35587Sdholland NFSERR_ISDIR,
5046ca35587Sdholland NFSERR_LEASEMOVED,
5056ca35587Sdholland NFSERR_LOCKSHELD,
5066ca35587Sdholland NFSERR_MOVED,
5076ca35587Sdholland NFSERR_NOFILEHANDLE,
5086ca35587Sdholland NFSERR_OLDSTATEID,
5096ca35587Sdholland NFSERR_RESOURCE,
5106ca35587Sdholland NFSERR_SERVERFAULT,
5116ca35587Sdholland NFSERR_STALE,
5126ca35587Sdholland NFSERR_STALESTATEID,
5136ca35587Sdholland 0,
5146ca35587Sdholland };
5156ca35587Sdholland
5166ca35587Sdholland static short nfsv4err_commit[] = {
5176ca35587Sdholland NFSERR_IO,
5186ca35587Sdholland NFSERR_ACCES,
5196ca35587Sdholland NFSERR_BADHANDLE,
5206ca35587Sdholland NFSERR_BADXDR,
5216ca35587Sdholland NFSERR_FHEXPIRED,
5226ca35587Sdholland NFSERR_INVAL,
5236ca35587Sdholland NFSERR_IO,
5246ca35587Sdholland NFSERR_ISDIR,
5256ca35587Sdholland NFSERR_MOVED,
5266ca35587Sdholland NFSERR_NOFILEHANDLE,
5276ca35587Sdholland NFSERR_RESOURCE,
5286ca35587Sdholland NFSERR_ROFS,
5296ca35587Sdholland NFSERR_SERVERFAULT,
5306ca35587Sdholland NFSERR_STALE,
5316ca35587Sdholland 0,
5326ca35587Sdholland };
5336ca35587Sdholland
5346ca35587Sdholland static short nfsv4err_create[] = {
5356ca35587Sdholland NFSERR_IO,
5366ca35587Sdholland NFSERR_ACCES,
5376ca35587Sdholland NFSERR_ATTRNOTSUPP,
5386ca35587Sdholland NFSERR_BADCHAR,
5396ca35587Sdholland NFSERR_BADHANDLE,
5406ca35587Sdholland NFSERR_BADNAME,
5416ca35587Sdholland NFSERR_BADOWNER,
5426ca35587Sdholland NFSERR_BADTYPE,
5436ca35587Sdholland NFSERR_BADXDR,
5446ca35587Sdholland NFSERR_DELAY,
5456ca35587Sdholland NFSERR_DQUOT,
5466ca35587Sdholland NFSERR_EXIST,
5476ca35587Sdholland NFSERR_FHEXPIRED,
5486ca35587Sdholland NFSERR_INVAL,
5496ca35587Sdholland NFSERR_IO,
5506ca35587Sdholland NFSERR_MOVED,
5516ca35587Sdholland NFSERR_NAMETOL,
5526ca35587Sdholland NFSERR_NOFILEHANDLE,
5536ca35587Sdholland NFSERR_NOSPC,
5546ca35587Sdholland NFSERR_NOTDIR,
5556ca35587Sdholland NFSERR_PERM,
5566ca35587Sdholland NFSERR_RESOURCE,
5576ca35587Sdholland NFSERR_ROFS,
5586ca35587Sdholland NFSERR_SERVERFAULT,
5596ca35587Sdholland NFSERR_STALE,
5606ca35587Sdholland 0,
5616ca35587Sdholland };
5626ca35587Sdholland
5636ca35587Sdholland static short nfsv4err_delegpurge[] = {
5646ca35587Sdholland NFSERR_SERVERFAULT,
5656ca35587Sdholland NFSERR_BADXDR,
5666ca35587Sdholland NFSERR_NOTSUPP,
5676ca35587Sdholland NFSERR_LEASEMOVED,
5686ca35587Sdholland NFSERR_MOVED,
5696ca35587Sdholland NFSERR_RESOURCE,
5706ca35587Sdholland NFSERR_SERVERFAULT,
5716ca35587Sdholland NFSERR_STALECLIENTID,
5726ca35587Sdholland 0,
5736ca35587Sdholland };
5746ca35587Sdholland
5756ca35587Sdholland static short nfsv4err_delegreturn[] = {
5766ca35587Sdholland NFSERR_SERVERFAULT,
5776ca35587Sdholland NFSERR_ADMINREVOKED,
5786ca35587Sdholland NFSERR_BADSTATEID,
5796ca35587Sdholland NFSERR_BADXDR,
5806ca35587Sdholland NFSERR_EXPIRED,
5816ca35587Sdholland NFSERR_INVAL,
5826ca35587Sdholland NFSERR_LEASEMOVED,
5836ca35587Sdholland NFSERR_MOVED,
5846ca35587Sdholland NFSERR_NOFILEHANDLE,
5856ca35587Sdholland NFSERR_NOTSUPP,
5866ca35587Sdholland NFSERR_OLDSTATEID,
5876ca35587Sdholland NFSERR_RESOURCE,
5886ca35587Sdholland NFSERR_SERVERFAULT,
5896ca35587Sdholland NFSERR_STALE,
5906ca35587Sdholland NFSERR_STALESTATEID,
5916ca35587Sdholland 0,
5926ca35587Sdholland };
5936ca35587Sdholland
5946ca35587Sdholland static short nfsv4err_getattr[] = {
5956ca35587Sdholland NFSERR_IO,
5966ca35587Sdholland NFSERR_ACCES,
5976ca35587Sdholland NFSERR_BADHANDLE,
5986ca35587Sdholland NFSERR_BADXDR,
5996ca35587Sdholland NFSERR_DELAY,
6006ca35587Sdholland NFSERR_FHEXPIRED,
6016ca35587Sdholland NFSERR_INVAL,
6026ca35587Sdholland NFSERR_IO,
6036ca35587Sdholland NFSERR_MOVED,
6046ca35587Sdholland NFSERR_NOFILEHANDLE,
6056ca35587Sdholland NFSERR_RESOURCE,
6066ca35587Sdholland NFSERR_SERVERFAULT,
6076ca35587Sdholland NFSERR_STALE,
6086ca35587Sdholland 0,
6096ca35587Sdholland };
6106ca35587Sdholland
6116ca35587Sdholland static short nfsv4err_getfh[] = {
6126ca35587Sdholland NFSERR_BADHANDLE,
6136ca35587Sdholland NFSERR_BADHANDLE,
6146ca35587Sdholland NFSERR_FHEXPIRED,
6156ca35587Sdholland NFSERR_MOVED,
6166ca35587Sdholland NFSERR_NOFILEHANDLE,
6176ca35587Sdholland NFSERR_RESOURCE,
6186ca35587Sdholland NFSERR_SERVERFAULT,
6196ca35587Sdholland NFSERR_STALE,
6206ca35587Sdholland 0,
6216ca35587Sdholland };
6226ca35587Sdholland
6236ca35587Sdholland static short nfsv4err_link[] = {
6246ca35587Sdholland NFSERR_IO,
6256ca35587Sdholland NFSERR_ACCES,
6266ca35587Sdholland NFSERR_BADCHAR,
6276ca35587Sdholland NFSERR_BADHANDLE,
6286ca35587Sdholland NFSERR_BADNAME,
6296ca35587Sdholland NFSERR_BADXDR,
6306ca35587Sdholland NFSERR_DELAY,
6316ca35587Sdholland NFSERR_DQUOT,
6326ca35587Sdholland NFSERR_EXIST,
6336ca35587Sdholland NFSERR_FHEXPIRED,
6346ca35587Sdholland NFSERR_FILEOPEN,
6356ca35587Sdholland NFSERR_INVAL,
6366ca35587Sdholland NFSERR_IO,
6376ca35587Sdholland NFSERR_ISDIR,
6386ca35587Sdholland NFSERR_MLINK,
6396ca35587Sdholland NFSERR_MOVED,
6406ca35587Sdholland NFSERR_NAMETOL,
6416ca35587Sdholland NFSERR_NOENT,
6426ca35587Sdholland NFSERR_NOFILEHANDLE,
6436ca35587Sdholland NFSERR_NOSPC,
6446ca35587Sdholland NFSERR_NOTDIR,
6456ca35587Sdholland NFSERR_NOTSUPP,
6466ca35587Sdholland NFSERR_RESOURCE,
6476ca35587Sdholland NFSERR_ROFS,
6486ca35587Sdholland NFSERR_SERVERFAULT,
6496ca35587Sdholland NFSERR_STALE,
6506ca35587Sdholland NFSERR_WRONGSEC,
6516ca35587Sdholland NFSERR_XDEV,
6526ca35587Sdholland 0,
6536ca35587Sdholland };
6546ca35587Sdholland
6556ca35587Sdholland static short nfsv4err_lock[] = {
6566ca35587Sdholland NFSERR_SERVERFAULT,
6576ca35587Sdholland NFSERR_ACCES,
6586ca35587Sdholland NFSERR_ADMINREVOKED,
6596ca35587Sdholland NFSERR_BADHANDLE,
6606ca35587Sdholland NFSERR_BADRANGE,
6616ca35587Sdholland NFSERR_BADSEQID,
6626ca35587Sdholland NFSERR_BADSTATEID,
6636ca35587Sdholland NFSERR_BADXDR,
6646ca35587Sdholland NFSERR_DEADLOCK,
6656ca35587Sdholland NFSERR_DELAY,
6666ca35587Sdholland NFSERR_DENIED,
6676ca35587Sdholland NFSERR_EXPIRED,
6686ca35587Sdholland NFSERR_FHEXPIRED,
6696ca35587Sdholland NFSERR_GRACE,
6706ca35587Sdholland NFSERR_INVAL,
6716ca35587Sdholland NFSERR_ISDIR,
6726ca35587Sdholland NFSERR_LEASEMOVED,
6736ca35587Sdholland NFSERR_LOCKNOTSUPP,
6746ca35587Sdholland NFSERR_LOCKRANGE,
6756ca35587Sdholland NFSERR_MOVED,
6766ca35587Sdholland NFSERR_NOFILEHANDLE,
6776ca35587Sdholland NFSERR_NOGRACE,
6786ca35587Sdholland NFSERR_OLDSTATEID,
6796ca35587Sdholland NFSERR_OPENMODE,
6806ca35587Sdholland NFSERR_RECLAIMBAD,
6816ca35587Sdholland NFSERR_RECLAIMCONFLICT,
6826ca35587Sdholland NFSERR_RESOURCE,
6836ca35587Sdholland NFSERR_SERVERFAULT,
6846ca35587Sdholland NFSERR_STALE,
6856ca35587Sdholland NFSERR_STALECLIENTID,
6866ca35587Sdholland NFSERR_STALESTATEID,
6876ca35587Sdholland 0,
6886ca35587Sdholland };
6896ca35587Sdholland
6906ca35587Sdholland static short nfsv4err_lockt[] = {
6916ca35587Sdholland NFSERR_SERVERFAULT,
6926ca35587Sdholland NFSERR_ACCES,
6936ca35587Sdholland NFSERR_BADHANDLE,
6946ca35587Sdholland NFSERR_BADRANGE,
6956ca35587Sdholland NFSERR_BADXDR,
6966ca35587Sdholland NFSERR_DELAY,
6976ca35587Sdholland NFSERR_DENIED,
6986ca35587Sdholland NFSERR_FHEXPIRED,
6996ca35587Sdholland NFSERR_GRACE,
7006ca35587Sdholland NFSERR_INVAL,
7016ca35587Sdholland NFSERR_ISDIR,
7026ca35587Sdholland NFSERR_LEASEMOVED,
7036ca35587Sdholland NFSERR_LOCKRANGE,
7046ca35587Sdholland NFSERR_MOVED,
7056ca35587Sdholland NFSERR_NOFILEHANDLE,
7066ca35587Sdholland NFSERR_RESOURCE,
7076ca35587Sdholland NFSERR_SERVERFAULT,
7086ca35587Sdholland NFSERR_STALE,
7096ca35587Sdholland NFSERR_STALECLIENTID,
7106ca35587Sdholland 0,
7116ca35587Sdholland };
7126ca35587Sdholland
7136ca35587Sdholland static short nfsv4err_locku[] = {
7146ca35587Sdholland NFSERR_SERVERFAULT,
7156ca35587Sdholland NFSERR_ACCES,
7166ca35587Sdholland NFSERR_ADMINREVOKED,
7176ca35587Sdholland NFSERR_BADHANDLE,
7186ca35587Sdholland NFSERR_BADRANGE,
7196ca35587Sdholland NFSERR_BADSEQID,
7206ca35587Sdholland NFSERR_BADSTATEID,
7216ca35587Sdholland NFSERR_BADXDR,
7226ca35587Sdholland NFSERR_EXPIRED,
7236ca35587Sdholland NFSERR_FHEXPIRED,
7246ca35587Sdholland NFSERR_GRACE,
7256ca35587Sdholland NFSERR_INVAL,
7266ca35587Sdholland NFSERR_ISDIR,
7276ca35587Sdholland NFSERR_LEASEMOVED,
7286ca35587Sdholland NFSERR_LOCKRANGE,
7296ca35587Sdholland NFSERR_MOVED,
7306ca35587Sdholland NFSERR_NOFILEHANDLE,
7316ca35587Sdholland NFSERR_OLDSTATEID,
7326ca35587Sdholland NFSERR_RESOURCE,
7336ca35587Sdholland NFSERR_SERVERFAULT,
7346ca35587Sdholland NFSERR_STALE,
7356ca35587Sdholland NFSERR_STALESTATEID,
7366ca35587Sdholland 0,
7376ca35587Sdholland };
7386ca35587Sdholland
7396ca35587Sdholland static short nfsv4err_lookup[] = {
7406ca35587Sdholland NFSERR_IO,
7416ca35587Sdholland NFSERR_ACCES,
7426ca35587Sdholland NFSERR_BADCHAR,
7436ca35587Sdholland NFSERR_BADHANDLE,
7446ca35587Sdholland NFSERR_BADNAME,
7456ca35587Sdholland NFSERR_BADXDR,
7466ca35587Sdholland NFSERR_FHEXPIRED,
7476ca35587Sdholland NFSERR_INVAL,
7486ca35587Sdholland NFSERR_IO,
7496ca35587Sdholland NFSERR_MOVED,
7506ca35587Sdholland NFSERR_NAMETOL,
7516ca35587Sdholland NFSERR_NOENT,
7526ca35587Sdholland NFSERR_NOFILEHANDLE,
7536ca35587Sdholland NFSERR_NOTDIR,
7546ca35587Sdholland NFSERR_RESOURCE,
7556ca35587Sdholland NFSERR_SERVERFAULT,
7566ca35587Sdholland NFSERR_STALE,
7576ca35587Sdholland NFSERR_SYMLINK,
7586ca35587Sdholland NFSERR_WRONGSEC,
7596ca35587Sdholland 0,
7606ca35587Sdholland };
7616ca35587Sdholland
7626ca35587Sdholland static short nfsv4err_lookupp[] = {
7636ca35587Sdholland NFSERR_IO,
7646ca35587Sdholland NFSERR_ACCES,
7656ca35587Sdholland NFSERR_BADHANDLE,
7666ca35587Sdholland NFSERR_FHEXPIRED,
7676ca35587Sdholland NFSERR_IO,
7686ca35587Sdholland NFSERR_MOVED,
7696ca35587Sdholland NFSERR_NOENT,
7706ca35587Sdholland NFSERR_NOFILEHANDLE,
7716ca35587Sdholland NFSERR_NOTDIR,
7726ca35587Sdholland NFSERR_RESOURCE,
7736ca35587Sdholland NFSERR_SERVERFAULT,
7746ca35587Sdholland NFSERR_STALE,
7756ca35587Sdholland 0,
7766ca35587Sdholland };
7776ca35587Sdholland
7786ca35587Sdholland static short nfsv4err_nverify[] = {
7796ca35587Sdholland NFSERR_IO,
7806ca35587Sdholland NFSERR_ACCES,
7816ca35587Sdholland NFSERR_ATTRNOTSUPP,
7826ca35587Sdholland NFSERR_BADCHAR,
7836ca35587Sdholland NFSERR_BADHANDLE,
7846ca35587Sdholland NFSERR_BADXDR,
7856ca35587Sdholland NFSERR_DELAY,
7866ca35587Sdholland NFSERR_FHEXPIRED,
7876ca35587Sdholland NFSERR_INVAL,
7886ca35587Sdholland NFSERR_IO,
7896ca35587Sdholland NFSERR_MOVED,
7906ca35587Sdholland NFSERR_NOFILEHANDLE,
7916ca35587Sdholland NFSERR_RESOURCE,
7926ca35587Sdholland NFSERR_SAME,
7936ca35587Sdholland NFSERR_SERVERFAULT,
7946ca35587Sdholland NFSERR_STALE,
7956ca35587Sdholland 0,
7966ca35587Sdholland };
7976ca35587Sdholland
7986ca35587Sdholland static short nfsv4err_open[] = {
7996ca35587Sdholland NFSERR_IO,
8006ca35587Sdholland NFSERR_ACCES,
8016ca35587Sdholland NFSERR_ADMINREVOKED,
8026ca35587Sdholland NFSERR_ATTRNOTSUPP,
8036ca35587Sdholland NFSERR_BADCHAR,
8046ca35587Sdholland NFSERR_BADHANDLE,
8056ca35587Sdholland NFSERR_BADNAME,
8066ca35587Sdholland NFSERR_BADOWNER,
8076ca35587Sdholland NFSERR_BADSEQID,
8086ca35587Sdholland NFSERR_BADXDR,
8096ca35587Sdholland NFSERR_DELAY,
8106ca35587Sdholland NFSERR_DQUOT,
8116ca35587Sdholland NFSERR_EXIST,
8126ca35587Sdholland NFSERR_EXPIRED,
8136ca35587Sdholland NFSERR_FHEXPIRED,
8146ca35587Sdholland NFSERR_GRACE,
8156ca35587Sdholland NFSERR_IO,
8166ca35587Sdholland NFSERR_INVAL,
8176ca35587Sdholland NFSERR_ISDIR,
8186ca35587Sdholland NFSERR_LEASEMOVED,
8196ca35587Sdholland NFSERR_MOVED,
8206ca35587Sdholland NFSERR_NAMETOL,
8216ca35587Sdholland NFSERR_NOENT,
8226ca35587Sdholland NFSERR_NOFILEHANDLE,
8236ca35587Sdholland NFSERR_NOGRACE,
8246ca35587Sdholland NFSERR_NOSPC,
8256ca35587Sdholland NFSERR_NOTDIR,
8266ca35587Sdholland NFSERR_NOTSUPP,
8276ca35587Sdholland NFSERR_PERM,
8286ca35587Sdholland NFSERR_RECLAIMBAD,
8296ca35587Sdholland NFSERR_RECLAIMCONFLICT,
8306ca35587Sdholland NFSERR_RESOURCE,
8316ca35587Sdholland NFSERR_ROFS,
8326ca35587Sdholland NFSERR_SERVERFAULT,
8336ca35587Sdholland NFSERR_SHAREDENIED,
8346ca35587Sdholland NFSERR_STALE,
8356ca35587Sdholland NFSERR_STALECLIENTID,
8366ca35587Sdholland NFSERR_SYMLINK,
8376ca35587Sdholland NFSERR_WRONGSEC,
8386ca35587Sdholland 0,
8396ca35587Sdholland };
8406ca35587Sdholland
8416ca35587Sdholland static short nfsv4err_openattr[] = {
8426ca35587Sdholland NFSERR_IO,
8436ca35587Sdholland NFSERR_ACCES,
8446ca35587Sdholland NFSERR_BADHANDLE,
8456ca35587Sdholland NFSERR_BADXDR,
8466ca35587Sdholland NFSERR_DELAY,
8476ca35587Sdholland NFSERR_DQUOT,
8486ca35587Sdholland NFSERR_FHEXPIRED,
8496ca35587Sdholland NFSERR_IO,
8506ca35587Sdholland NFSERR_MOVED,
8516ca35587Sdholland NFSERR_NOENT,
8526ca35587Sdholland NFSERR_NOFILEHANDLE,
8536ca35587Sdholland NFSERR_NOSPC,
8546ca35587Sdholland NFSERR_NOTSUPP,
8556ca35587Sdholland NFSERR_RESOURCE,
8566ca35587Sdholland NFSERR_ROFS,
8576ca35587Sdholland NFSERR_SERVERFAULT,
8586ca35587Sdholland NFSERR_STALE,
8596ca35587Sdholland 0,
8606ca35587Sdholland };
8616ca35587Sdholland
8626ca35587Sdholland static short nfsv4err_openconfirm[] = {
8636ca35587Sdholland NFSERR_SERVERFAULT,
8646ca35587Sdholland NFSERR_ADMINREVOKED,
8656ca35587Sdholland NFSERR_BADHANDLE,
8666ca35587Sdholland NFSERR_BADSEQID,
8676ca35587Sdholland NFSERR_BADSTATEID,
8686ca35587Sdholland NFSERR_BADXDR,
8696ca35587Sdholland NFSERR_EXPIRED,
8706ca35587Sdholland NFSERR_FHEXPIRED,
8716ca35587Sdholland NFSERR_INVAL,
8726ca35587Sdholland NFSERR_ISDIR,
8736ca35587Sdholland NFSERR_MOVED,
8746ca35587Sdholland NFSERR_NOFILEHANDLE,
8756ca35587Sdholland NFSERR_OLDSTATEID,
8766ca35587Sdholland NFSERR_RESOURCE,
8776ca35587Sdholland NFSERR_SERVERFAULT,
8786ca35587Sdholland NFSERR_STALE,
8796ca35587Sdholland NFSERR_STALESTATEID,
8806ca35587Sdholland 0,
8816ca35587Sdholland };
8826ca35587Sdholland
8836ca35587Sdholland static short nfsv4err_opendowngrade[] = {
8846ca35587Sdholland NFSERR_SERVERFAULT,
8856ca35587Sdholland NFSERR_ADMINREVOKED,
8866ca35587Sdholland NFSERR_BADHANDLE,
8876ca35587Sdholland NFSERR_BADSEQID,
8886ca35587Sdholland NFSERR_BADSTATEID,
8896ca35587Sdholland NFSERR_BADXDR,
8906ca35587Sdholland NFSERR_EXPIRED,
8916ca35587Sdholland NFSERR_FHEXPIRED,
8926ca35587Sdholland NFSERR_INVAL,
8936ca35587Sdholland NFSERR_MOVED,
8946ca35587Sdholland NFSERR_NOFILEHANDLE,
8956ca35587Sdholland NFSERR_OLDSTATEID,
8966ca35587Sdholland NFSERR_RESOURCE,
8976ca35587Sdholland NFSERR_SERVERFAULT,
8986ca35587Sdholland NFSERR_STALE,
8996ca35587Sdholland NFSERR_STALESTATEID,
9006ca35587Sdholland 0,
9016ca35587Sdholland };
9026ca35587Sdholland
9036ca35587Sdholland static short nfsv4err_putfh[] = {
9046ca35587Sdholland NFSERR_SERVERFAULT,
9056ca35587Sdholland NFSERR_BADHANDLE,
9066ca35587Sdholland NFSERR_BADXDR,
9076ca35587Sdholland NFSERR_FHEXPIRED,
9086ca35587Sdholland NFSERR_MOVED,
9096ca35587Sdholland NFSERR_RESOURCE,
9106ca35587Sdholland NFSERR_SERVERFAULT,
9116ca35587Sdholland NFSERR_STALE,
9126ca35587Sdholland NFSERR_WRONGSEC,
9136ca35587Sdholland 0,
9146ca35587Sdholland };
9156ca35587Sdholland
9166ca35587Sdholland static short nfsv4err_putpubfh[] = {
9176ca35587Sdholland NFSERR_SERVERFAULT,
9186ca35587Sdholland NFSERR_RESOURCE,
9196ca35587Sdholland NFSERR_SERVERFAULT,
9206ca35587Sdholland NFSERR_WRONGSEC,
9216ca35587Sdholland 0,
9226ca35587Sdholland };
9236ca35587Sdholland
9246ca35587Sdholland static short nfsv4err_putrootfh[] = {
9256ca35587Sdholland NFSERR_SERVERFAULT,
9266ca35587Sdholland NFSERR_RESOURCE,
9276ca35587Sdholland NFSERR_SERVERFAULT,
9286ca35587Sdholland NFSERR_WRONGSEC,
9296ca35587Sdholland 0,
9306ca35587Sdholland };
9316ca35587Sdholland
9326ca35587Sdholland static short nfsv4err_read[] = {
9336ca35587Sdholland NFSERR_IO,
9346ca35587Sdholland NFSERR_ACCES,
9356ca35587Sdholland NFSERR_ADMINREVOKED,
9366ca35587Sdholland NFSERR_BADHANDLE,
9376ca35587Sdholland NFSERR_BADSTATEID,
9386ca35587Sdholland NFSERR_BADXDR,
9396ca35587Sdholland NFSERR_DELAY,
9406ca35587Sdholland NFSERR_EXPIRED,
9416ca35587Sdholland NFSERR_FHEXPIRED,
9426ca35587Sdholland NFSERR_GRACE,
9436ca35587Sdholland NFSERR_IO,
9446ca35587Sdholland NFSERR_INVAL,
9456ca35587Sdholland NFSERR_ISDIR,
9466ca35587Sdholland NFSERR_LEASEMOVED,
9476ca35587Sdholland NFSERR_LOCKED,
9486ca35587Sdholland NFSERR_MOVED,
9496ca35587Sdholland NFSERR_NOFILEHANDLE,
9506ca35587Sdholland NFSERR_NXIO,
9516ca35587Sdholland NFSERR_OLDSTATEID,
9526ca35587Sdholland NFSERR_OPENMODE,
9536ca35587Sdholland NFSERR_RESOURCE,
9546ca35587Sdholland NFSERR_SERVERFAULT,
9556ca35587Sdholland NFSERR_STALE,
9566ca35587Sdholland NFSERR_STALESTATEID,
9576ca35587Sdholland 0,
9586ca35587Sdholland };
9596ca35587Sdholland
9606ca35587Sdholland static short nfsv4err_readdir[] = {
9616ca35587Sdholland NFSERR_IO,
9626ca35587Sdholland NFSERR_ACCES,
9636ca35587Sdholland NFSERR_BADHANDLE,
9646ca35587Sdholland NFSERR_BAD_COOKIE,
9656ca35587Sdholland NFSERR_BADXDR,
9666ca35587Sdholland NFSERR_DELAY,
9676ca35587Sdholland NFSERR_FHEXPIRED,
9686ca35587Sdholland NFSERR_INVAL,
9696ca35587Sdholland NFSERR_IO,
9706ca35587Sdholland NFSERR_MOVED,
9716ca35587Sdholland NFSERR_NOFILEHANDLE,
9726ca35587Sdholland NFSERR_NOTDIR,
9736ca35587Sdholland NFSERR_NOTSAME,
9746ca35587Sdholland NFSERR_RESOURCE,
9756ca35587Sdholland NFSERR_SERVERFAULT,
9766ca35587Sdholland NFSERR_STALE,
9776ca35587Sdholland NFSERR_TOOSMALL,
9786ca35587Sdholland 0,
9796ca35587Sdholland };
9806ca35587Sdholland
9816ca35587Sdholland static short nfsv4err_readlink[] = {
9826ca35587Sdholland NFSERR_IO,
9836ca35587Sdholland NFSERR_ACCES,
9846ca35587Sdholland NFSERR_BADHANDLE,
9856ca35587Sdholland NFSERR_DELAY,
9866ca35587Sdholland NFSERR_FHEXPIRED,
9876ca35587Sdholland NFSERR_INVAL,
9886ca35587Sdholland NFSERR_IO,
9896ca35587Sdholland NFSERR_ISDIR,
9906ca35587Sdholland NFSERR_MOVED,
9916ca35587Sdholland NFSERR_NOFILEHANDLE,
9926ca35587Sdholland NFSERR_NOTSUPP,
9936ca35587Sdholland NFSERR_RESOURCE,
9946ca35587Sdholland NFSERR_SERVERFAULT,
9956ca35587Sdholland NFSERR_STALE,
9966ca35587Sdholland 0,
9976ca35587Sdholland };
9986ca35587Sdholland
9996ca35587Sdholland static short nfsv4err_remove[] = {
10006ca35587Sdholland NFSERR_IO,
10016ca35587Sdholland NFSERR_ACCES,
10026ca35587Sdholland NFSERR_BADCHAR,
10036ca35587Sdholland NFSERR_BADHANDLE,
10046ca35587Sdholland NFSERR_BADNAME,
10056ca35587Sdholland NFSERR_BADXDR,
10066ca35587Sdholland NFSERR_DELAY,
10076ca35587Sdholland NFSERR_FHEXPIRED,
10086ca35587Sdholland NFSERR_FILEOPEN,
10096ca35587Sdholland NFSERR_INVAL,
10106ca35587Sdholland NFSERR_IO,
10116ca35587Sdholland NFSERR_MOVED,
10126ca35587Sdholland NFSERR_NAMETOL,
10136ca35587Sdholland NFSERR_NOENT,
10146ca35587Sdholland NFSERR_NOFILEHANDLE,
10156ca35587Sdholland NFSERR_NOTDIR,
10166ca35587Sdholland NFSERR_NOTEMPTY,
10176ca35587Sdholland NFSERR_RESOURCE,
10186ca35587Sdholland NFSERR_ROFS,
10196ca35587Sdholland NFSERR_SERVERFAULT,
10206ca35587Sdholland NFSERR_STALE,
10216ca35587Sdholland 0,
10226ca35587Sdholland };
10236ca35587Sdholland
10246ca35587Sdholland static short nfsv4err_rename[] = {
10256ca35587Sdholland NFSERR_IO,
10266ca35587Sdholland NFSERR_ACCES,
10276ca35587Sdholland NFSERR_BADCHAR,
10286ca35587Sdholland NFSERR_BADHANDLE,
10296ca35587Sdholland NFSERR_BADNAME,
10306ca35587Sdholland NFSERR_BADXDR,
10316ca35587Sdholland NFSERR_DELAY,
10326ca35587Sdholland NFSERR_DQUOT,
10336ca35587Sdholland NFSERR_EXIST,
10346ca35587Sdholland NFSERR_FHEXPIRED,
10356ca35587Sdholland NFSERR_FILEOPEN,
10366ca35587Sdholland NFSERR_INVAL,
10376ca35587Sdholland NFSERR_IO,
10386ca35587Sdholland NFSERR_MOVED,
10396ca35587Sdholland NFSERR_NAMETOL,
10406ca35587Sdholland NFSERR_NOENT,
10416ca35587Sdholland NFSERR_NOFILEHANDLE,
10426ca35587Sdholland NFSERR_NOSPC,
10436ca35587Sdholland NFSERR_NOTDIR,
10446ca35587Sdholland NFSERR_NOTEMPTY,
10456ca35587Sdholland NFSERR_RESOURCE,
10466ca35587Sdholland NFSERR_ROFS,
10476ca35587Sdholland NFSERR_SERVERFAULT,
10486ca35587Sdholland NFSERR_STALE,
10496ca35587Sdholland NFSERR_WRONGSEC,
10506ca35587Sdholland NFSERR_XDEV,
10516ca35587Sdholland 0,
10526ca35587Sdholland };
10536ca35587Sdholland
10546ca35587Sdholland static short nfsv4err_renew[] = {
10556ca35587Sdholland NFSERR_SERVERFAULT,
10566ca35587Sdholland NFSERR_ACCES,
10576ca35587Sdholland NFSERR_ADMINREVOKED,
10586ca35587Sdholland NFSERR_BADXDR,
10596ca35587Sdholland NFSERR_CBPATHDOWN,
10606ca35587Sdholland NFSERR_EXPIRED,
10616ca35587Sdholland NFSERR_LEASEMOVED,
10626ca35587Sdholland NFSERR_RESOURCE,
10636ca35587Sdholland NFSERR_SERVERFAULT,
10646ca35587Sdholland NFSERR_STALECLIENTID,
10656ca35587Sdholland 0,
10666ca35587Sdholland };
10676ca35587Sdholland
10686ca35587Sdholland static short nfsv4err_restorefh[] = {
10696ca35587Sdholland NFSERR_SERVERFAULT,
10706ca35587Sdholland NFSERR_BADHANDLE,
10716ca35587Sdholland NFSERR_FHEXPIRED,
10726ca35587Sdholland NFSERR_MOVED,
10736ca35587Sdholland NFSERR_RESOURCE,
10746ca35587Sdholland NFSERR_RESTOREFH,
10756ca35587Sdholland NFSERR_SERVERFAULT,
10766ca35587Sdholland NFSERR_STALE,
10776ca35587Sdholland NFSERR_WRONGSEC,
10786ca35587Sdholland 0,
10796ca35587Sdholland };
10806ca35587Sdholland
10816ca35587Sdholland static short nfsv4err_savefh[] = {
10826ca35587Sdholland NFSERR_SERVERFAULT,
10836ca35587Sdholland NFSERR_BADHANDLE,
10846ca35587Sdholland NFSERR_FHEXPIRED,
10856ca35587Sdholland NFSERR_MOVED,
10866ca35587Sdholland NFSERR_NOFILEHANDLE,
10876ca35587Sdholland NFSERR_RESOURCE,
10886ca35587Sdholland NFSERR_SERVERFAULT,
10896ca35587Sdholland NFSERR_STALE,
10906ca35587Sdholland 0,
10916ca35587Sdholland };
10926ca35587Sdholland
10936ca35587Sdholland static short nfsv4err_secinfo[] = {
10946ca35587Sdholland NFSERR_SERVERFAULT,
10956ca35587Sdholland NFSERR_ACCES,
10966ca35587Sdholland NFSERR_BADCHAR,
10976ca35587Sdholland NFSERR_BADHANDLE,
10986ca35587Sdholland NFSERR_BADNAME,
10996ca35587Sdholland NFSERR_BADXDR,
11006ca35587Sdholland NFSERR_FHEXPIRED,
11016ca35587Sdholland NFSERR_INVAL,
11026ca35587Sdholland NFSERR_MOVED,
11036ca35587Sdholland NFSERR_NAMETOL,
11046ca35587Sdholland NFSERR_NOENT,
11056ca35587Sdholland NFSERR_NOFILEHANDLE,
11066ca35587Sdholland NFSERR_NOTDIR,
11076ca35587Sdholland NFSERR_RESOURCE,
11086ca35587Sdholland NFSERR_SERVERFAULT,
11096ca35587Sdholland NFSERR_STALE,
11106ca35587Sdholland 0,
11116ca35587Sdholland };
11126ca35587Sdholland
11136ca35587Sdholland static short nfsv4err_setattr[] = {
11146ca35587Sdholland NFSERR_IO,
11156ca35587Sdholland NFSERR_ACCES,
11166ca35587Sdholland NFSERR_ADMINREVOKED,
11176ca35587Sdholland NFSERR_ATTRNOTSUPP,
11186ca35587Sdholland NFSERR_BADCHAR,
11196ca35587Sdholland NFSERR_BADHANDLE,
11206ca35587Sdholland NFSERR_BADOWNER,
11216ca35587Sdholland NFSERR_BADSTATEID,
11226ca35587Sdholland NFSERR_BADXDR,
11236ca35587Sdholland NFSERR_DELAY,
11246ca35587Sdholland NFSERR_DQUOT,
11256ca35587Sdholland NFSERR_EXPIRED,
11266ca35587Sdholland NFSERR_FBIG,
11276ca35587Sdholland NFSERR_FHEXPIRED,
11286ca35587Sdholland NFSERR_GRACE,
11296ca35587Sdholland NFSERR_INVAL,
11306ca35587Sdholland NFSERR_IO,
11316ca35587Sdholland NFSERR_ISDIR,
11326ca35587Sdholland NFSERR_LOCKED,
11336ca35587Sdholland NFSERR_MOVED,
11346ca35587Sdholland NFSERR_NOFILEHANDLE,
11356ca35587Sdholland NFSERR_NOSPC,
11366ca35587Sdholland NFSERR_OLDSTATEID,
11376ca35587Sdholland NFSERR_OPENMODE,
11386ca35587Sdholland NFSERR_PERM,
11396ca35587Sdholland NFSERR_RESOURCE,
11406ca35587Sdholland NFSERR_ROFS,
11416ca35587Sdholland NFSERR_SERVERFAULT,
11426ca35587Sdholland NFSERR_STALE,
11436ca35587Sdholland NFSERR_STALESTATEID,
11446ca35587Sdholland 0,
11456ca35587Sdholland };
11466ca35587Sdholland
11476ca35587Sdholland static short nfsv4err_setclientid[] = {
11486ca35587Sdholland NFSERR_SERVERFAULT,
11496ca35587Sdholland NFSERR_BADXDR,
11506ca35587Sdholland NFSERR_CLIDINUSE,
11516ca35587Sdholland NFSERR_INVAL,
11526ca35587Sdholland NFSERR_RESOURCE,
11536ca35587Sdholland NFSERR_SERVERFAULT,
11542d39560cSpgoyette NFSERR_WRONGSEC,
11556ca35587Sdholland 0,
11566ca35587Sdholland };
11576ca35587Sdholland
11586ca35587Sdholland static short nfsv4err_setclientidconfirm[] = {
11596ca35587Sdholland NFSERR_SERVERFAULT,
11606ca35587Sdholland NFSERR_BADXDR,
11616ca35587Sdholland NFSERR_CLIDINUSE,
11626ca35587Sdholland NFSERR_RESOURCE,
11636ca35587Sdholland NFSERR_SERVERFAULT,
11646ca35587Sdholland NFSERR_STALECLIENTID,
11656ca35587Sdholland 0,
11666ca35587Sdholland };
11676ca35587Sdholland
11686ca35587Sdholland static short nfsv4err_verify[] = {
11696ca35587Sdholland NFSERR_SERVERFAULT,
11706ca35587Sdholland NFSERR_ACCES,
11716ca35587Sdholland NFSERR_ATTRNOTSUPP,
11726ca35587Sdholland NFSERR_BADCHAR,
11736ca35587Sdholland NFSERR_BADHANDLE,
11746ca35587Sdholland NFSERR_BADXDR,
11756ca35587Sdholland NFSERR_DELAY,
11766ca35587Sdholland NFSERR_FHEXPIRED,
11776ca35587Sdholland NFSERR_INVAL,
11786ca35587Sdholland NFSERR_MOVED,
11796ca35587Sdholland NFSERR_NOFILEHANDLE,
11806ca35587Sdholland NFSERR_NOTSAME,
11816ca35587Sdholland NFSERR_RESOURCE,
11826ca35587Sdholland NFSERR_SERVERFAULT,
11836ca35587Sdholland NFSERR_STALE,
11846ca35587Sdholland 0,
11856ca35587Sdholland };
11866ca35587Sdholland
11876ca35587Sdholland static short nfsv4err_write[] = {
11886ca35587Sdholland NFSERR_IO,
11896ca35587Sdholland NFSERR_ACCES,
11906ca35587Sdholland NFSERR_ADMINREVOKED,
11916ca35587Sdholland NFSERR_BADHANDLE,
11926ca35587Sdholland NFSERR_BADSTATEID,
11936ca35587Sdholland NFSERR_BADXDR,
11946ca35587Sdholland NFSERR_DELAY,
11956ca35587Sdholland NFSERR_DQUOT,
11966ca35587Sdholland NFSERR_EXPIRED,
11976ca35587Sdholland NFSERR_FBIG,
11986ca35587Sdholland NFSERR_FHEXPIRED,
11996ca35587Sdholland NFSERR_GRACE,
12006ca35587Sdholland NFSERR_INVAL,
12016ca35587Sdholland NFSERR_IO,
12026ca35587Sdholland NFSERR_ISDIR,
12036ca35587Sdholland NFSERR_LEASEMOVED,
12046ca35587Sdholland NFSERR_LOCKED,
12056ca35587Sdholland NFSERR_MOVED,
12066ca35587Sdholland NFSERR_NOFILEHANDLE,
12076ca35587Sdholland NFSERR_NOSPC,
12086ca35587Sdholland NFSERR_NXIO,
12096ca35587Sdholland NFSERR_OLDSTATEID,
12106ca35587Sdholland NFSERR_OPENMODE,
12116ca35587Sdholland NFSERR_RESOURCE,
12126ca35587Sdholland NFSERR_ROFS,
12136ca35587Sdholland NFSERR_SERVERFAULT,
12146ca35587Sdholland NFSERR_STALE,
12156ca35587Sdholland NFSERR_STALESTATEID,
12166ca35587Sdholland 0,
12176ca35587Sdholland };
12186ca35587Sdholland
12196ca35587Sdholland static short nfsv4err_releaselockowner[] = {
12206ca35587Sdholland NFSERR_SERVERFAULT,
12216ca35587Sdholland NFSERR_ADMINREVOKED,
12226ca35587Sdholland NFSERR_BADXDR,
12236ca35587Sdholland NFSERR_EXPIRED,
12246ca35587Sdholland NFSERR_LEASEMOVED,
12256ca35587Sdholland NFSERR_LOCKSHELD,
12266ca35587Sdholland NFSERR_RESOURCE,
12276ca35587Sdholland NFSERR_SERVERFAULT,
12286ca35587Sdholland NFSERR_STALECLIENTID,
12296ca35587Sdholland 0,
12306ca35587Sdholland };
12316ca35587Sdholland
12326ca35587Sdholland static short *nfsrv_v4errmap[] = {
12336ca35587Sdholland nfsv4err_null,
12346ca35587Sdholland nfsv4err_null,
12356ca35587Sdholland nfsv4err_null,
12366ca35587Sdholland nfsv4err_access,
12376ca35587Sdholland nfsv4err_close,
12386ca35587Sdholland nfsv4err_commit,
12396ca35587Sdholland nfsv4err_create,
12406ca35587Sdholland nfsv4err_delegpurge,
12416ca35587Sdholland nfsv4err_delegreturn,
12426ca35587Sdholland nfsv4err_getattr,
12436ca35587Sdholland nfsv4err_getfh,
12446ca35587Sdholland nfsv4err_link,
12456ca35587Sdholland nfsv4err_lock,
12466ca35587Sdholland nfsv4err_lockt,
12476ca35587Sdholland nfsv4err_locku,
12486ca35587Sdholland nfsv4err_lookup,
12496ca35587Sdholland nfsv4err_lookupp,
12506ca35587Sdholland nfsv4err_nverify,
12516ca35587Sdholland nfsv4err_open,
12526ca35587Sdholland nfsv4err_openattr,
12536ca35587Sdholland nfsv4err_openconfirm,
12546ca35587Sdholland nfsv4err_opendowngrade,
12556ca35587Sdholland nfsv4err_putfh,
12566ca35587Sdholland nfsv4err_putpubfh,
12576ca35587Sdholland nfsv4err_putrootfh,
12586ca35587Sdholland nfsv4err_read,
12596ca35587Sdholland nfsv4err_readdir,
12606ca35587Sdholland nfsv4err_readlink,
12616ca35587Sdholland nfsv4err_remove,
12626ca35587Sdholland nfsv4err_rename,
12636ca35587Sdholland nfsv4err_renew,
12646ca35587Sdholland nfsv4err_restorefh,
12656ca35587Sdholland nfsv4err_savefh,
12666ca35587Sdholland nfsv4err_secinfo,
12676ca35587Sdholland nfsv4err_setattr,
12686ca35587Sdholland nfsv4err_setclientid,
12696ca35587Sdholland nfsv4err_setclientidconfirm,
12706ca35587Sdholland nfsv4err_verify,
12716ca35587Sdholland nfsv4err_write,
12726ca35587Sdholland nfsv4err_releaselockowner,
12736ca35587Sdholland };
12746ca35587Sdholland
12756ca35587Sdholland /*
12766ca35587Sdholland * A fiddled version of m_adj() that ensures null fill to a long
12776ca35587Sdholland * boundary and only trims off the back end
12786ca35587Sdholland */
12796ca35587Sdholland APPLESTATIC void
nfsrv_adj(mbuf_t mp,int len,int nul)12806ca35587Sdholland nfsrv_adj(mbuf_t mp, int len, int nul)
12816ca35587Sdholland {
12826ca35587Sdholland mbuf_t m;
12836ca35587Sdholland int count, i;
12846ca35587Sdholland char *cp;
12856ca35587Sdholland
12866ca35587Sdholland /*
12876ca35587Sdholland * Trim from tail. Scan the mbuf chain,
12886ca35587Sdholland * calculating its length and finding the last mbuf.
12896ca35587Sdholland * If the adjustment only affects this mbuf, then just
12906ca35587Sdholland * adjust and return. Otherwise, rescan and truncate
12916ca35587Sdholland * after the remaining size.
12926ca35587Sdholland */
12936ca35587Sdholland count = 0;
12946ca35587Sdholland m = mp;
12956ca35587Sdholland for (;;) {
12966ca35587Sdholland count += mbuf_len(m);
12976ca35587Sdholland if (mbuf_next(m) == NULL)
12986ca35587Sdholland break;
12996ca35587Sdholland m = mbuf_next(m);
13006ca35587Sdholland }
13016ca35587Sdholland if (mbuf_len(m) > len) {
13026ca35587Sdholland mbuf_setlen(m, mbuf_len(m) - len);
13036ca35587Sdholland if (nul > 0) {
13046ca35587Sdholland cp = NFSMTOD(m, caddr_t) + mbuf_len(m) - nul;
13056ca35587Sdholland for (i = 0; i < nul; i++)
13066ca35587Sdholland *cp++ = '\0';
13076ca35587Sdholland }
13086ca35587Sdholland return;
13096ca35587Sdholland }
13106ca35587Sdholland count -= len;
13116ca35587Sdholland if (count < 0)
13126ca35587Sdholland count = 0;
13136ca35587Sdholland /*
13146ca35587Sdholland * Correct length for chain is "count".
13156ca35587Sdholland * Find the mbuf with last data, adjust its length,
13166ca35587Sdholland * and toss data from remaining mbufs on chain.
13176ca35587Sdholland */
13186ca35587Sdholland for (m = mp; m; m = mbuf_next(m)) {
13196ca35587Sdholland if (mbuf_len(m) >= count) {
13206ca35587Sdholland mbuf_setlen(m, count);
13216ca35587Sdholland if (nul > 0) {
13226ca35587Sdholland cp = NFSMTOD(m, caddr_t) + mbuf_len(m) - nul;
13236ca35587Sdholland for (i = 0; i < nul; i++)
13246ca35587Sdholland *cp++ = '\0';
13256ca35587Sdholland }
13266ca35587Sdholland break;
13276ca35587Sdholland }
13286ca35587Sdholland count -= mbuf_len(m);
13296ca35587Sdholland }
13306ca35587Sdholland for (m = mbuf_next(m); m; m = mbuf_next(m))
13316ca35587Sdholland mbuf_setlen(m, 0);
13326ca35587Sdholland }
13336ca35587Sdholland
13346ca35587Sdholland /*
13356ca35587Sdholland * Make these functions instead of macros, so that the kernel text size
13366ca35587Sdholland * doesn't get too big...
13376ca35587Sdholland */
13386ca35587Sdholland APPLESTATIC void
nfsrv_wcc(struct nfsrv_descript * nd,int before_ret,struct nfsvattr * before_nvap,int after_ret,struct nfsvattr * after_nvap)13396ca35587Sdholland nfsrv_wcc(struct nfsrv_descript *nd, int before_ret,
13406ca35587Sdholland struct nfsvattr *before_nvap, int after_ret, struct nfsvattr *after_nvap)
13416ca35587Sdholland {
13426ca35587Sdholland u_int32_t *tl;
13436ca35587Sdholland
13446ca35587Sdholland if (before_ret) {
13456ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
13466ca35587Sdholland *tl = newnfs_false;
13476ca35587Sdholland } else {
13486ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
13496ca35587Sdholland *tl++ = newnfs_true;
13506ca35587Sdholland txdr_hyper(before_nvap->na_size, tl);
13516ca35587Sdholland tl += 2;
13526ca35587Sdholland txdr_nfsv3time(&(before_nvap->na_mtime), tl);
13536ca35587Sdholland tl += 2;
13546ca35587Sdholland txdr_nfsv3time(&(before_nvap->na_ctime), tl);
13556ca35587Sdholland }
13566ca35587Sdholland nfsrv_postopattr(nd, after_ret, after_nvap);
13576ca35587Sdholland }
13586ca35587Sdholland
13596ca35587Sdholland APPLESTATIC void
nfsrv_postopattr(struct nfsrv_descript * nd,int after_ret,struct nfsvattr * after_nvap)13606ca35587Sdholland nfsrv_postopattr(struct nfsrv_descript *nd, int after_ret,
13616ca35587Sdholland struct nfsvattr *after_nvap)
13626ca35587Sdholland {
13636ca35587Sdholland u_int32_t *tl;
13646ca35587Sdholland
13656ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
13666ca35587Sdholland if (after_ret)
13676ca35587Sdholland *tl = newnfs_false;
13686ca35587Sdholland else {
13696ca35587Sdholland *tl = newnfs_true;
13706ca35587Sdholland nfsrv_fillattr(nd, after_nvap);
13716ca35587Sdholland }
13726ca35587Sdholland }
13736ca35587Sdholland
13746ca35587Sdholland /*
13756ca35587Sdholland * Fill in file attributes for V2 and 3. For V4, call a separate
13766ca35587Sdholland * routine that sifts through all the attribute bits.
13776ca35587Sdholland */
13786ca35587Sdholland APPLESTATIC void
nfsrv_fillattr(struct nfsrv_descript * nd,struct nfsvattr * nvap)13796ca35587Sdholland nfsrv_fillattr(struct nfsrv_descript *nd, struct nfsvattr *nvap)
13806ca35587Sdholland {
13816ca35587Sdholland struct nfs_fattr *fp;
13826ca35587Sdholland int fattr_size;
13836ca35587Sdholland
13846ca35587Sdholland /*
13856ca35587Sdholland * Build space for the attribute structure.
13866ca35587Sdholland */
13876ca35587Sdholland if (nd->nd_flag & ND_NFSV3)
13886ca35587Sdholland fattr_size = NFSX_V3FATTR;
13896ca35587Sdholland else
13906ca35587Sdholland fattr_size = NFSX_V2FATTR;
13916ca35587Sdholland NFSM_BUILD(fp, struct nfs_fattr *, fattr_size);
13926ca35587Sdholland
13936ca35587Sdholland /*
13946ca35587Sdholland * Now just fill it all in.
13956ca35587Sdholland */
13966ca35587Sdholland fp->fa_nlink = txdr_unsigned(nvap->na_nlink);
13976ca35587Sdholland fp->fa_uid = txdr_unsigned(nvap->na_uid);
13986ca35587Sdholland fp->fa_gid = txdr_unsigned(nvap->na_gid);
13996ca35587Sdholland if (nd->nd_flag & ND_NFSV3) {
14006ca35587Sdholland fp->fa_type = vtonfsv34_type(nvap->na_type);
14016ca35587Sdholland fp->fa_mode = vtonfsv34_mode(nvap->na_mode);
14026ca35587Sdholland txdr_hyper(nvap->na_size, &fp->fa3_size);
14036ca35587Sdholland txdr_hyper(nvap->na_bytes, &fp->fa3_used);
14046ca35587Sdholland fp->fa3_rdev.specdata1 = txdr_unsigned(NFSMAJOR(nvap->na_rdev));
14056ca35587Sdholland fp->fa3_rdev.specdata2 = txdr_unsigned(NFSMINOR(nvap->na_rdev));
14066ca35587Sdholland fp->fa3_fsid.nfsuquad[0] = 0;
14076ca35587Sdholland fp->fa3_fsid.nfsuquad[1] = txdr_unsigned(nvap->na_fsid);
14086ca35587Sdholland fp->fa3_fileid.nfsuquad[0] = 0;
14096ca35587Sdholland fp->fa3_fileid.nfsuquad[1] = txdr_unsigned(nvap->na_fileid);
14106ca35587Sdholland txdr_nfsv3time(&nvap->na_atime, &fp->fa3_atime);
14116ca35587Sdholland txdr_nfsv3time(&nvap->na_mtime, &fp->fa3_mtime);
14126ca35587Sdholland txdr_nfsv3time(&nvap->na_ctime, &fp->fa3_ctime);
14136ca35587Sdholland } else {
14146ca35587Sdholland fp->fa_type = vtonfsv2_type(nvap->na_type);
14156ca35587Sdholland fp->fa_mode = vtonfsv2_mode(nvap->na_type, nvap->na_mode);
14166ca35587Sdholland fp->fa2_size = txdr_unsigned(nvap->na_size);
14176ca35587Sdholland fp->fa2_blocksize = txdr_unsigned(nvap->na_blocksize);
14186ca35587Sdholland if (nvap->na_type == VFIFO)
14196ca35587Sdholland fp->fa2_rdev = 0xffffffff;
14206ca35587Sdholland else
14216ca35587Sdholland fp->fa2_rdev = txdr_unsigned(nvap->na_rdev);
14226ca35587Sdholland fp->fa2_blocks = txdr_unsigned(nvap->na_bytes / NFS_FABLKSIZE);
14236ca35587Sdholland fp->fa2_fsid = txdr_unsigned(nvap->na_fsid);
14246ca35587Sdholland fp->fa2_fileid = txdr_unsigned(nvap->na_fileid);
14256ca35587Sdholland txdr_nfsv2time(&nvap->na_atime, &fp->fa2_atime);
14266ca35587Sdholland txdr_nfsv2time(&nvap->na_mtime, &fp->fa2_mtime);
14276ca35587Sdholland txdr_nfsv2time(&nvap->na_ctime, &fp->fa2_ctime);
14286ca35587Sdholland }
14296ca35587Sdholland }
14306ca35587Sdholland
14316ca35587Sdholland /*
14326ca35587Sdholland * This function gets a file handle out of an mbuf list.
14336ca35587Sdholland * It returns 0 for success, EBADRPC otherwise.
14346ca35587Sdholland * If sets the third flagp argument to 1 if the file handle is
14356ca35587Sdholland * the public file handle.
14366ca35587Sdholland * For NFSv4, if the length is incorrect, set nd_repstat == NFSERR_BADHANDLE
14376ca35587Sdholland */
14386ca35587Sdholland APPLESTATIC int
nfsrv_mtofh(struct nfsrv_descript * nd,struct nfsrvfh * fhp)14396ca35587Sdholland nfsrv_mtofh(struct nfsrv_descript *nd, struct nfsrvfh *fhp)
14406ca35587Sdholland {
14416ca35587Sdholland u_int32_t *tl;
14426ca35587Sdholland int error = 0, len, copylen;
14436ca35587Sdholland
14446ca35587Sdholland if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
14456ca35587Sdholland NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
14466ca35587Sdholland len = fxdr_unsigned(int, *tl);
14476ca35587Sdholland if (len == 0 && nfs_pubfhset && (nd->nd_flag & ND_NFSV3) &&
14486ca35587Sdholland nd->nd_procnum == NFSPROC_LOOKUP) {
14496ca35587Sdholland nd->nd_flag |= ND_PUBLOOKUP;
14506ca35587Sdholland goto nfsmout;
14516ca35587Sdholland }
14526ca35587Sdholland if (len < NFSRV_MINFH || len > NFSRV_MAXFH) {
14536ca35587Sdholland if (nd->nd_flag & ND_NFSV4) {
14546ca35587Sdholland if (len > 0 && len <= NFSX_V4FHMAX) {
14556ca35587Sdholland error = nfsm_advance(nd, NFSM_RNDUP(len), -1);
14566ca35587Sdholland if (error)
14576ca35587Sdholland goto nfsmout;
14586ca35587Sdholland nd->nd_repstat = NFSERR_BADHANDLE;
14596ca35587Sdholland goto nfsmout;
14606ca35587Sdholland } else {
14616ca35587Sdholland error = EBADRPC;
14626ca35587Sdholland goto nfsmout;
14636ca35587Sdholland }
14646ca35587Sdholland } else {
14656ca35587Sdholland error = EBADRPC;
14666ca35587Sdholland goto nfsmout;
14676ca35587Sdholland }
14686ca35587Sdholland }
14696ca35587Sdholland copylen = len;
14706ca35587Sdholland } else {
14716ca35587Sdholland /*
14726ca35587Sdholland * For NFSv2, the file handle is always 32 bytes on the
14736ca35587Sdholland * wire, but this server only cares about the first
14746ca35587Sdholland * NFSRV_MAXFH bytes.
14756ca35587Sdholland */
14766ca35587Sdholland len = NFSX_V2FH;
14776ca35587Sdholland copylen = NFSRV_MAXFH;
14786ca35587Sdholland }
14796ca35587Sdholland NFSM_DISSECT(tl, u_int32_t *, len);
14806ca35587Sdholland if ((nd->nd_flag & ND_NFSV2) && nfs_pubfhset &&
14816ca35587Sdholland nd->nd_procnum == NFSPROC_LOOKUP &&
14826ca35587Sdholland !NFSBCMP((caddr_t)tl, nfs_v2pubfh, NFSX_V2FH)) {
14836ca35587Sdholland nd->nd_flag |= ND_PUBLOOKUP;
14846ca35587Sdholland goto nfsmout;
14856ca35587Sdholland }
14866ca35587Sdholland NFSBCOPY(tl, (caddr_t)fhp->nfsrvfh_data, copylen);
14876ca35587Sdholland fhp->nfsrvfh_len = copylen;
14886ca35587Sdholland nfsmout:
14896ca35587Sdholland NFSEXITCODE2(error, nd);
14906ca35587Sdholland return (error);
14916ca35587Sdholland }
14926ca35587Sdholland
14936ca35587Sdholland /*
14946ca35587Sdholland * Map errnos to NFS error numbers. For Version 3 and 4 also filter out error
14956ca35587Sdholland * numbers not specified for the associated procedure.
14966ca35587Sdholland * NFSPROC_NOOP is a special case, where the high order bits of nd_repstat
14976ca35587Sdholland * should be cleared. NFSPROC_NOOP is used to return errors when a valid
14986ca35587Sdholland * RPC procedure is not involved.
14996ca35587Sdholland * Returns the error number in XDR.
15006ca35587Sdholland */
15016ca35587Sdholland APPLESTATIC int
nfsd_errmap(struct nfsrv_descript * nd)15026ca35587Sdholland nfsd_errmap(struct nfsrv_descript *nd)
15036ca35587Sdholland {
15046ca35587Sdholland short *defaulterrp, *errp;
15056ca35587Sdholland
15066ca35587Sdholland if (!nd->nd_repstat)
15076ca35587Sdholland return (0);
15086ca35587Sdholland if (nd->nd_flag & (ND_NFSV3 | ND_NFSV4)) {
15096ca35587Sdholland if (nd->nd_procnum == NFSPROC_NOOP)
15106ca35587Sdholland return (txdr_unsigned(nd->nd_repstat & 0xffff));
15116ca35587Sdholland if (nd->nd_flag & ND_NFSV3)
15126ca35587Sdholland errp = defaulterrp = nfsrv_v3errmap[nd->nd_procnum];
15136ca35587Sdholland else if (nd->nd_repstat == EBADRPC)
15146ca35587Sdholland return (txdr_unsigned(NFSERR_BADXDR));
15156ca35587Sdholland else if (nd->nd_repstat == NFSERR_MINORVERMISMATCH ||
15166ca35587Sdholland nd->nd_repstat == NFSERR_OPILLEGAL)
15176ca35587Sdholland return (txdr_unsigned(nd->nd_repstat));
15182d39560cSpgoyette else if ((nd->nd_flag & ND_NFSV41) != 0) {
15192d39560cSpgoyette if (nd->nd_repstat == EOPNOTSUPP)
15202d39560cSpgoyette nd->nd_repstat = NFSERR_NOTSUPP;
15212d39560cSpgoyette nd->nd_repstat = nfsrv_isannfserr(nd->nd_repstat);
15222d39560cSpgoyette return (txdr_unsigned(nd->nd_repstat));
15232d39560cSpgoyette } else
15246ca35587Sdholland errp = defaulterrp = nfsrv_v4errmap[nd->nd_procnum];
15256ca35587Sdholland while (*++errp)
15266ca35587Sdholland if (*errp == nd->nd_repstat)
15276ca35587Sdholland return (txdr_unsigned(nd->nd_repstat));
15286ca35587Sdholland return (txdr_unsigned(*defaulterrp));
15296ca35587Sdholland }
15302d39560cSpgoyette if (nd->nd_repstat <= NFSERR_REMOTE)
15316ca35587Sdholland return (txdr_unsigned(nfsrv_v2errmap[nd->nd_repstat - 1]));
15326ca35587Sdholland return (txdr_unsigned(NFSERR_IO));
15336ca35587Sdholland }
15346ca35587Sdholland
15356ca35587Sdholland /*
15362d39560cSpgoyette * Check to see if the error is a valid NFS one. If not, replace it with
15372d39560cSpgoyette * NFSERR_IO.
15382d39560cSpgoyette */
15392d39560cSpgoyette static u_int32_t
nfsrv_isannfserr(u_int32_t errval)15402d39560cSpgoyette nfsrv_isannfserr(u_int32_t errval)
15412d39560cSpgoyette {
15422d39560cSpgoyette
15432d39560cSpgoyette if (errval == NFSERR_OK)
15442d39560cSpgoyette return (errval);
15452d39560cSpgoyette if (errval >= NFSERR_BADHANDLE && errval <= NFSERR_DELEGREVOKED)
15462d39560cSpgoyette return (errval);
15472d39560cSpgoyette if (errval > 0 && errval <= NFSERR_REMOTE)
15482d39560cSpgoyette return (nfsrv_v2errmap[errval - 1]);
15492d39560cSpgoyette return (NFSERR_IO);
15502d39560cSpgoyette }
15512d39560cSpgoyette
15522d39560cSpgoyette /*
15536ca35587Sdholland * Check to see if setting a uid/gid is permitted when creating a new
15546ca35587Sdholland * file object. (Called when uid and/or gid is specified in the
15556ca35587Sdholland * settable attributes for V4.
15566ca35587Sdholland */
15576ca35587Sdholland APPLESTATIC int
nfsrv_checkuidgid(struct nfsrv_descript * nd,struct nfsvattr * nvap)15586ca35587Sdholland nfsrv_checkuidgid(struct nfsrv_descript *nd, struct nfsvattr *nvap)
15596ca35587Sdholland {
15606ca35587Sdholland int error = 0;
15616ca35587Sdholland
15626ca35587Sdholland /*
15636ca35587Sdholland * If not setting either uid nor gid, it's OK.
15646ca35587Sdholland */
15656ca35587Sdholland if (NFSVNO_NOTSETUID(nvap) && NFSVNO_NOTSETGID(nvap))
15666ca35587Sdholland goto out;
15672d39560cSpgoyette if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid == nfsrv_defaultuid &&
15682d39560cSpgoyette enable_nobodycheck == 1)
15692d39560cSpgoyette || (NFSVNO_ISSETGID(nvap) && nvap->na_gid == nfsrv_defaultgid &&
15702d39560cSpgoyette enable_nogroupcheck == 1)) {
15716ca35587Sdholland error = NFSERR_BADOWNER;
15726ca35587Sdholland goto out;
15736ca35587Sdholland }
15746ca35587Sdholland if (nd->nd_cred->cr_uid == 0)
15756ca35587Sdholland goto out;
15766ca35587Sdholland if ((NFSVNO_ISSETUID(nvap) && nvap->na_uid != nd->nd_cred->cr_uid) ||
15776ca35587Sdholland (NFSVNO_ISSETGID(nvap) && nvap->na_gid != nd->nd_cred->cr_gid &&
15786ca35587Sdholland !groupmember(nvap->na_gid, nd->nd_cred)))
15796ca35587Sdholland error = NFSERR_PERM;
15806ca35587Sdholland
15816ca35587Sdholland out:
15826ca35587Sdholland NFSEXITCODE2(error, nd);
15836ca35587Sdholland return (error);
15846ca35587Sdholland }
15856ca35587Sdholland
15866ca35587Sdholland /*
15876ca35587Sdholland * and this routine fixes up the settable attributes for V4 if allowed
15886ca35587Sdholland * by nfsrv_checkuidgid().
15896ca35587Sdholland */
15906ca35587Sdholland APPLESTATIC void
nfsrv_fixattr(struct nfsrv_descript * nd,vnode_t vp,struct nfsvattr * nvap,NFSACL_T * aclp,NFSPROC_T * p,nfsattrbit_t * attrbitp,struct nfsexstuff * exp)15916ca35587Sdholland nfsrv_fixattr(struct nfsrv_descript *nd, vnode_t vp,
15926ca35587Sdholland struct nfsvattr *nvap, NFSACL_T *aclp, NFSPROC_T *p, nfsattrbit_t *attrbitp,
15936ca35587Sdholland struct nfsexstuff *exp)
15946ca35587Sdholland {
15956ca35587Sdholland int change = 0;
15966ca35587Sdholland struct nfsvattr nva;
15976ca35587Sdholland uid_t tuid;
15986ca35587Sdholland int error;
15996ca35587Sdholland nfsattrbit_t nattrbits;
16006ca35587Sdholland
16016ca35587Sdholland /*
16026ca35587Sdholland * Maybe this should be done for V2 and 3 but it never has been
16036ca35587Sdholland * and nobody seems to be upset, so I think it's best not to change
16046ca35587Sdholland * the V2 and 3 semantics.
16056ca35587Sdholland */
16066ca35587Sdholland if ((nd->nd_flag & ND_NFSV4) == 0)
16076ca35587Sdholland goto out;
16086ca35587Sdholland NFSVNO_ATTRINIT(&nva);
16096ca35587Sdholland NFSZERO_ATTRBIT(&nattrbits);
16106ca35587Sdholland tuid = nd->nd_cred->cr_uid;
16116ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_OWNER) &&
16126ca35587Sdholland NFSVNO_ISSETUID(nvap) &&
16136ca35587Sdholland nvap->na_uid != nd->nd_cred->cr_uid) {
16146ca35587Sdholland if (nd->nd_cred->cr_uid == 0) {
16156ca35587Sdholland nva.na_uid = nvap->na_uid;
16166ca35587Sdholland change++;
16176ca35587Sdholland NFSSETBIT_ATTRBIT(&nattrbits, NFSATTRBIT_OWNER);
16186ca35587Sdholland } else {
16196ca35587Sdholland NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_OWNER);
16206ca35587Sdholland }
16216ca35587Sdholland }
16226ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEACCESSSET) &&
16236ca35587Sdholland NFSVNO_ISSETATIME(nvap)) {
16246ca35587Sdholland nva.na_atime = nvap->na_atime;
16256ca35587Sdholland change++;
16266ca35587Sdholland NFSSETBIT_ATTRBIT(&nattrbits, NFSATTRBIT_TIMEACCESSSET);
16276ca35587Sdholland }
16286ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_TIMEMODIFYSET) &&
16296ca35587Sdholland NFSVNO_ISSETMTIME(nvap)) {
16306ca35587Sdholland nva.na_mtime = nvap->na_mtime;
16316ca35587Sdholland change++;
16326ca35587Sdholland NFSSETBIT_ATTRBIT(&nattrbits, NFSATTRBIT_TIMEMODIFYSET);
16336ca35587Sdholland }
16346ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_OWNERGROUP) &&
16356ca35587Sdholland NFSVNO_ISSETGID(nvap)) {
16366ca35587Sdholland if (nvap->na_gid == nd->nd_cred->cr_gid ||
16376ca35587Sdholland groupmember(nvap->na_gid, nd->nd_cred)) {
16386ca35587Sdholland nd->nd_cred->cr_uid = 0;
16396ca35587Sdholland nva.na_gid = nvap->na_gid;
16406ca35587Sdholland change++;
16416ca35587Sdholland NFSSETBIT_ATTRBIT(&nattrbits, NFSATTRBIT_OWNERGROUP);
16426ca35587Sdholland } else {
16436ca35587Sdholland NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_OWNERGROUP);
16446ca35587Sdholland }
16456ca35587Sdholland }
16466ca35587Sdholland if (change) {
16476ca35587Sdholland error = nfsvno_setattr(vp, &nva, nd->nd_cred, p, exp);
16486ca35587Sdholland if (error) {
16496ca35587Sdholland NFSCLRALL_ATTRBIT(attrbitp, &nattrbits);
16506ca35587Sdholland }
16516ca35587Sdholland }
16526ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_SIZE) &&
16536ca35587Sdholland NFSVNO_ISSETSIZE(nvap) && nvap->na_size != (u_quad_t)0) {
16546ca35587Sdholland NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_SIZE);
16556ca35587Sdholland }
16566ca35587Sdholland #ifdef NFS4_ACL_EXTATTR_NAME
16576ca35587Sdholland if (NFSISSET_ATTRBIT(attrbitp, NFSATTRBIT_ACL) &&
16586ca35587Sdholland nfsrv_useacl != 0 && aclp != NULL) {
16596ca35587Sdholland if (aclp->acl_cnt > 0) {
16606ca35587Sdholland error = nfsrv_setacl(vp, aclp, nd->nd_cred, p);
16616ca35587Sdholland if (error) {
16626ca35587Sdholland NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_ACL);
16636ca35587Sdholland }
16646ca35587Sdholland }
16656ca35587Sdholland } else
16666ca35587Sdholland #endif
16676ca35587Sdholland NFSCLRBIT_ATTRBIT(attrbitp, NFSATTRBIT_ACL);
16686ca35587Sdholland nd->nd_cred->cr_uid = tuid;
16696ca35587Sdholland
16706ca35587Sdholland out:
16716ca35587Sdholland NFSEXITCODE2(0, nd);
16726ca35587Sdholland }
16736ca35587Sdholland
16746ca35587Sdholland /*
1675f0a7346dSsnj * Translate an ASCII hex digit to its binary value. Return -1 if the
16766ca35587Sdholland * char isn't a hex digit.
16776ca35587Sdholland */
16786ca35587Sdholland static char
nfsrv_hexdigit(char c,int * err)16796ca35587Sdholland nfsrv_hexdigit(char c, int *err)
16806ca35587Sdholland {
16816ca35587Sdholland
16826ca35587Sdholland *err = 0;
16836ca35587Sdholland if (c >= '0' && c <= '9')
16846ca35587Sdholland return (c - '0');
16856ca35587Sdholland if (c >= 'a' && c <= 'f')
16866ca35587Sdholland return (c - 'a' + ((char)10));
16876ca35587Sdholland if (c >= 'A' && c <= 'F')
16886ca35587Sdholland return (c - 'A' + ((char)10));
16896ca35587Sdholland /* Not valid ! */
16906ca35587Sdholland *err = 1;
16916ca35587Sdholland return (1); /* BOGUS */
16926ca35587Sdholland }
16936ca35587Sdholland
16946ca35587Sdholland /*
16956ca35587Sdholland * Check to see if NFSERR_MOVED can be returned for this op. Return 1 iff
16966ca35587Sdholland * it can be.
16976ca35587Sdholland */
16986ca35587Sdholland APPLESTATIC int
nfsrv_errmoved(int op)16996ca35587Sdholland nfsrv_errmoved(int op)
17006ca35587Sdholland {
17016ca35587Sdholland short *errp;
17026ca35587Sdholland
17036ca35587Sdholland errp = nfsrv_v4errmap[op];
17046ca35587Sdholland while (*errp != 0) {
17056ca35587Sdholland if (*errp == NFSERR_MOVED)
17066ca35587Sdholland return (1);
17076ca35587Sdholland errp++;
17086ca35587Sdholland }
17096ca35587Sdholland return (0);
17106ca35587Sdholland }
17116ca35587Sdholland
17126ca35587Sdholland /*
17136ca35587Sdholland * Fill in attributes for a Referral.
17146ca35587Sdholland * (Return the number of bytes of XDR created.)
17156ca35587Sdholland */
17166ca35587Sdholland APPLESTATIC int
nfsrv_putreferralattr(struct nfsrv_descript * nd,nfsattrbit_t * retbitp,struct nfsreferral * refp,int getattr,int * reterrp)17176ca35587Sdholland nfsrv_putreferralattr(struct nfsrv_descript *nd, nfsattrbit_t *retbitp,
17186ca35587Sdholland struct nfsreferral *refp, int getattr, int *reterrp)
17196ca35587Sdholland {
17206ca35587Sdholland u_int32_t *tl, *retnump;
17216ca35587Sdholland u_char *cp, *cp2;
17226ca35587Sdholland int prefixnum, retnum = 0, i, len, bitpos, rderrbit = 0, nonrefbit = 0;
17236ca35587Sdholland int fslocationsbit = 0;
17246ca35587Sdholland nfsattrbit_t tmpbits, refbits;
17256ca35587Sdholland
17266ca35587Sdholland NFSREFERRAL_ATTRBIT(&refbits);
17276ca35587Sdholland if (getattr)
17286ca35587Sdholland NFSCLRBIT_ATTRBIT(&refbits, NFSATTRBIT_RDATTRERROR);
17296ca35587Sdholland else if (NFSISSET_ATTRBIT(retbitp, NFSATTRBIT_RDATTRERROR))
17306ca35587Sdholland rderrbit = 1;
17316ca35587Sdholland if (NFSISSET_ATTRBIT(retbitp, NFSATTRBIT_FSLOCATIONS))
17326ca35587Sdholland fslocationsbit = 1;
17336ca35587Sdholland
17346ca35587Sdholland /*
17356ca35587Sdholland * Check for the case where unsupported referral attributes are
17366ca35587Sdholland * requested.
17376ca35587Sdholland */
17386ca35587Sdholland NFSSET_ATTRBIT(&tmpbits, retbitp);
17396ca35587Sdholland NFSCLRALL_ATTRBIT(&tmpbits, &refbits);
17406ca35587Sdholland if (NFSNONZERO_ATTRBIT(&tmpbits))
17416ca35587Sdholland nonrefbit = 1;
17426ca35587Sdholland
17436ca35587Sdholland if (nonrefbit && !fslocationsbit && (getattr || !rderrbit)) {
17446ca35587Sdholland *reterrp = NFSERR_MOVED;
17456ca35587Sdholland return (0);
17466ca35587Sdholland }
17476ca35587Sdholland
17486ca35587Sdholland /*
17496ca35587Sdholland * Now we can fill in the attributes.
17506ca35587Sdholland */
17516ca35587Sdholland NFSSET_ATTRBIT(&tmpbits, retbitp);
17526ca35587Sdholland NFSCLRNOT_ATTRBIT(&tmpbits, &refbits);
17536ca35587Sdholland
17546ca35587Sdholland /*
17556ca35587Sdholland * Put out the attribute bitmap for the ones being filled in
17566ca35587Sdholland * and get the field for the number of attributes returned.
17576ca35587Sdholland */
17586ca35587Sdholland prefixnum = nfsrv_putattrbit(nd, &tmpbits);
17596ca35587Sdholland NFSM_BUILD(retnump, u_int32_t *, NFSX_UNSIGNED);
17606ca35587Sdholland prefixnum += NFSX_UNSIGNED;
17616ca35587Sdholland
17626ca35587Sdholland /*
17636ca35587Sdholland * Now, loop around filling in the attributes for each bit set.
17646ca35587Sdholland */
17656ca35587Sdholland for (bitpos = 0; bitpos < NFSATTRBIT_MAX; bitpos++) {
17666ca35587Sdholland if (NFSISSET_ATTRBIT(&tmpbits, bitpos)) {
17676ca35587Sdholland switch (bitpos) {
17686ca35587Sdholland case NFSATTRBIT_TYPE:
17696ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
17706ca35587Sdholland *tl = txdr_unsigned(NFDIR);
17716ca35587Sdholland retnum += NFSX_UNSIGNED;
17726ca35587Sdholland break;
17736ca35587Sdholland case NFSATTRBIT_FSID:
17746ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_V4FSID);
17756ca35587Sdholland *tl++ = 0;
17766ca35587Sdholland *tl++ = txdr_unsigned(NFSV4ROOT_FSID0);
17776ca35587Sdholland *tl++ = 0;
17786ca35587Sdholland *tl = txdr_unsigned(NFSV4ROOT_REFERRAL);
17796ca35587Sdholland retnum += NFSX_V4FSID;
17806ca35587Sdholland break;
17816ca35587Sdholland case NFSATTRBIT_RDATTRERROR:
17826ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
17836ca35587Sdholland if (nonrefbit)
17846ca35587Sdholland *tl = txdr_unsigned(NFSERR_MOVED);
17856ca35587Sdholland else
17866ca35587Sdholland *tl = 0;
17876ca35587Sdholland retnum += NFSX_UNSIGNED;
17886ca35587Sdholland break;
17896ca35587Sdholland case NFSATTRBIT_FSLOCATIONS:
17906ca35587Sdholland retnum += nfsm_strtom(nd, "/", 1);
17916ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
17926ca35587Sdholland *tl = txdr_unsigned(refp->nfr_srvcnt);
17936ca35587Sdholland retnum += NFSX_UNSIGNED;
17946ca35587Sdholland cp = refp->nfr_srvlist;
17956ca35587Sdholland for (i = 0; i < refp->nfr_srvcnt; i++) {
17966ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
17976ca35587Sdholland *tl = txdr_unsigned(1);
17986ca35587Sdholland retnum += NFSX_UNSIGNED;
17996ca35587Sdholland cp2 = STRCHR(cp, ':');
18006ca35587Sdholland if (cp2 != NULL)
18016ca35587Sdholland len = cp2 - cp;
18026ca35587Sdholland else
18036ca35587Sdholland len = 1;
18046ca35587Sdholland retnum += nfsm_strtom(nd, cp, len);
18056ca35587Sdholland if (cp2 != NULL)
18066ca35587Sdholland cp = cp2 + 1;
18076ca35587Sdholland cp2 = STRCHR(cp, ',');
18086ca35587Sdholland if (cp2 != NULL)
18096ca35587Sdholland len = cp2 - cp;
18106ca35587Sdholland else
18116ca35587Sdholland len = strlen(cp);
18126ca35587Sdholland retnum += nfsm_strtom(nd, cp, len);
18136ca35587Sdholland if (cp2 != NULL)
18146ca35587Sdholland cp = cp2 + 1;
18156ca35587Sdholland }
18166ca35587Sdholland break;
18176ca35587Sdholland case NFSATTRBIT_MOUNTEDONFILEID:
18186ca35587Sdholland NFSM_BUILD(tl, u_int32_t *, NFSX_HYPER);
18196ca35587Sdholland *tl++ = 0;
18206ca35587Sdholland *tl = txdr_unsigned(refp->nfr_dfileno);
18216ca35587Sdholland retnum += NFSX_HYPER;
18226ca35587Sdholland break;
18236ca35587Sdholland default:
18246ca35587Sdholland printf("EEK! Bad V4 refattr bitpos=%d\n", bitpos);
18252d39560cSpgoyette }
18266ca35587Sdholland }
18276ca35587Sdholland }
18286ca35587Sdholland *retnump = txdr_unsigned(retnum);
18296ca35587Sdholland return (retnum + prefixnum);
18306ca35587Sdholland }
18316ca35587Sdholland
18326ca35587Sdholland /*
18336ca35587Sdholland * Parse a file name out of a request.
18346ca35587Sdholland */
18356ca35587Sdholland APPLESTATIC int
nfsrv_parsename(struct nfsrv_descript * nd,char * bufp,u_long * hashp,NFSPATHLEN_T * outlenp)18366ca35587Sdholland nfsrv_parsename(struct nfsrv_descript *nd, char *bufp, u_long *hashp,
18376ca35587Sdholland NFSPATHLEN_T *outlenp)
18386ca35587Sdholland {
18396ca35587Sdholland char *fromcp, *tocp, val = '\0';
18406ca35587Sdholland mbuf_t md;
18416ca35587Sdholland int i;
18426ca35587Sdholland int rem, len, error = 0, pubtype = 0, outlen = 0, percent = 0;
18436ca35587Sdholland char digit;
18446ca35587Sdholland u_int32_t *tl;
18456ca35587Sdholland u_long hash = 0;
18466ca35587Sdholland
18476ca35587Sdholland if (hashp != NULL)
18486ca35587Sdholland *hashp = 0;
18496ca35587Sdholland tocp = bufp;
18506ca35587Sdholland /*
18516ca35587Sdholland * For V4, check for lookup parent.
18526ca35587Sdholland * Otherwise, get the component name.
18536ca35587Sdholland */
18546ca35587Sdholland if ((nd->nd_flag & ND_NFSV4) && nd->nd_procnum == NFSV4OP_LOOKUPP) {
18556ca35587Sdholland *tocp++ = '.';
18566ca35587Sdholland hash += ((u_char)'.');
18576ca35587Sdholland *tocp++ = '.';
18586ca35587Sdholland hash += ((u_char)'.');
18596ca35587Sdholland outlen = 2;
18606ca35587Sdholland } else {
18616ca35587Sdholland /*
18626ca35587Sdholland * First, get the name length.
18636ca35587Sdholland */
18646ca35587Sdholland NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
18656ca35587Sdholland len = fxdr_unsigned(int, *tl);
18666ca35587Sdholland if (len > NFS_MAXNAMLEN) {
18676ca35587Sdholland nd->nd_repstat = NFSERR_NAMETOL;
18686ca35587Sdholland error = 0;
18696ca35587Sdholland goto nfsmout;
18706ca35587Sdholland } else if (len <= 0) {
18716ca35587Sdholland nd->nd_repstat = NFSERR_INVAL;
18726ca35587Sdholland error = 0;
18736ca35587Sdholland goto nfsmout;
18746ca35587Sdholland }
18756ca35587Sdholland
18766ca35587Sdholland /*
18776ca35587Sdholland * Now, copy the component name into the buffer.
18786ca35587Sdholland */
18796ca35587Sdholland fromcp = nd->nd_dpos;
18806ca35587Sdholland md = nd->nd_md;
18816ca35587Sdholland rem = NFSMTOD(md, caddr_t) + mbuf_len(md) - fromcp;
18826ca35587Sdholland for (i = 0; i < len; i++) {
18836ca35587Sdholland while (rem == 0) {
18846ca35587Sdholland md = mbuf_next(md);
18856ca35587Sdholland if (md == NULL) {
18866ca35587Sdholland error = EBADRPC;
18876ca35587Sdholland goto nfsmout;
18886ca35587Sdholland }
18896ca35587Sdholland fromcp = NFSMTOD(md, caddr_t);
18906ca35587Sdholland rem = mbuf_len(md);
18916ca35587Sdholland }
18926ca35587Sdholland if (*fromcp == '\0') {
18936ca35587Sdholland nd->nd_repstat = EACCES;
18946ca35587Sdholland error = 0;
18956ca35587Sdholland goto nfsmout;
18966ca35587Sdholland }
18976ca35587Sdholland /*
18986ca35587Sdholland * For lookups on the public filehandle, do some special
18996ca35587Sdholland * processing on the name. (The public file handle is the
19006ca35587Sdholland * root of the public file system for this server.)
19016ca35587Sdholland */
19026ca35587Sdholland if (nd->nd_flag & ND_PUBLOOKUP) {
19036ca35587Sdholland /*
19046ca35587Sdholland * If the first char is ASCII, it is a canonical
19056ca35587Sdholland * path, otherwise it is a native path. (RFC2054
19066ca35587Sdholland * doesn't actually state what it is if the first
19076ca35587Sdholland * char isn't ASCII or 0x80, so I assume native.)
19086ca35587Sdholland * pubtype == 1 -> native path
19096ca35587Sdholland * pubtype == 2 -> canonical path
19106ca35587Sdholland */
19116ca35587Sdholland if (i == 0) {
19126ca35587Sdholland if (*fromcp & 0x80) {
19136ca35587Sdholland /*
19146ca35587Sdholland * Since RFC2054 doesn't indicate
19156ca35587Sdholland * that a native path of just 0x80
19166ca35587Sdholland * isn't allowed, I'll replace the
19176ca35587Sdholland * 0x80 with '/' instead of just
19186ca35587Sdholland * throwing it away.
19196ca35587Sdholland */
19206ca35587Sdholland *fromcp = '/';
19216ca35587Sdholland pubtype = 1;
19226ca35587Sdholland } else {
19236ca35587Sdholland pubtype = 2;
19246ca35587Sdholland }
19256ca35587Sdholland }
19266ca35587Sdholland /*
19276ca35587Sdholland * '/' only allowed in a native path
19286ca35587Sdholland */
19296ca35587Sdholland if (*fromcp == '/' && pubtype != 1) {
19306ca35587Sdholland nd->nd_repstat = EACCES;
19316ca35587Sdholland error = 0;
19326ca35587Sdholland goto nfsmout;
19336ca35587Sdholland }
19346ca35587Sdholland
19356ca35587Sdholland /*
19366ca35587Sdholland * For the special case of 2 hex digits after a
19376ca35587Sdholland * '%' in an absolute path, calculate the value.
19386ca35587Sdholland * percent == 1 -> indicates "get first hex digit"
19396ca35587Sdholland * percent == 2 -> indicates "get second hex digit"
19406ca35587Sdholland */
19416ca35587Sdholland if (percent > 0) {
19426ca35587Sdholland digit = nfsrv_hexdigit(*fromcp, &error);
19436ca35587Sdholland if (error) {
19446ca35587Sdholland nd->nd_repstat = EACCES;
19456ca35587Sdholland error = 0;
19466ca35587Sdholland goto nfsmout;
19476ca35587Sdholland }
19486ca35587Sdholland if (percent == 1) {
19496ca35587Sdholland val = (digit << 4);
19506ca35587Sdholland percent = 2;
19516ca35587Sdholland } else {
19526ca35587Sdholland val += digit;
19536ca35587Sdholland percent = 0;
19546ca35587Sdholland *tocp++ = val;
19556ca35587Sdholland hash += ((u_char)val);
19566ca35587Sdholland outlen++;
19576ca35587Sdholland }
19586ca35587Sdholland } else {
19596ca35587Sdholland if (*fromcp == '%' && pubtype == 2) {
19606ca35587Sdholland /*
19616ca35587Sdholland * Must be followed by 2 hex digits
19626ca35587Sdholland */
19636ca35587Sdholland if ((len - i) < 3) {
19646ca35587Sdholland nd->nd_repstat = EACCES;
19656ca35587Sdholland error = 0;
19666ca35587Sdholland goto nfsmout;
19676ca35587Sdholland }
19686ca35587Sdholland percent = 1;
19696ca35587Sdholland } else {
19706ca35587Sdholland *tocp++ = *fromcp;
19716ca35587Sdholland hash += ((u_char)*fromcp);
19726ca35587Sdholland outlen++;
19736ca35587Sdholland }
19746ca35587Sdholland }
19756ca35587Sdholland } else {
19766ca35587Sdholland /*
19776ca35587Sdholland * Normal, non lookup on public, name.
19786ca35587Sdholland */
19796ca35587Sdholland if (*fromcp == '/') {
19806ca35587Sdholland if (nd->nd_flag & ND_NFSV4)
19816ca35587Sdholland nd->nd_repstat = NFSERR_BADNAME;
19826ca35587Sdholland else
19836ca35587Sdholland nd->nd_repstat = EACCES;
19846ca35587Sdholland error = 0;
19856ca35587Sdholland goto nfsmout;
19866ca35587Sdholland }
19876ca35587Sdholland hash += ((u_char)*fromcp);
19886ca35587Sdholland *tocp++ = *fromcp;
19896ca35587Sdholland outlen++;
19906ca35587Sdholland }
19916ca35587Sdholland fromcp++;
19926ca35587Sdholland rem--;
19936ca35587Sdholland }
19946ca35587Sdholland nd->nd_md = md;
19956ca35587Sdholland nd->nd_dpos = fromcp;
19966ca35587Sdholland i = NFSM_RNDUP(len) - len;
19976ca35587Sdholland if (i > 0) {
19986ca35587Sdholland if (rem >= i) {
19996ca35587Sdholland nd->nd_dpos += i;
20006ca35587Sdholland } else {
20016ca35587Sdholland error = nfsm_advance(nd, i, rem);
20026ca35587Sdholland if (error)
20036ca35587Sdholland goto nfsmout;
20046ca35587Sdholland }
20056ca35587Sdholland }
20066ca35587Sdholland
20076ca35587Sdholland /*
20086ca35587Sdholland * For v4, don't allow lookups of '.' or '..' and
20096ca35587Sdholland * also check for non-utf8 strings.
20106ca35587Sdholland */
20116ca35587Sdholland if (nd->nd_flag & ND_NFSV4) {
20126ca35587Sdholland if ((outlen == 1 && bufp[0] == '.') ||
20136ca35587Sdholland (outlen == 2 && bufp[0] == '.' &&
20146ca35587Sdholland bufp[1] == '.')) {
20156ca35587Sdholland nd->nd_repstat = NFSERR_BADNAME;
20166ca35587Sdholland error = 0;
20176ca35587Sdholland goto nfsmout;
20186ca35587Sdholland }
20192d39560cSpgoyette if (enable_checkutf8 == 1 &&
20206ca35587Sdholland nfsrv_checkutf8((u_int8_t *)bufp, outlen)) {
20216ca35587Sdholland nd->nd_repstat = NFSERR_INVAL;
20226ca35587Sdholland error = 0;
20236ca35587Sdholland goto nfsmout;
20246ca35587Sdholland }
20256ca35587Sdholland }
20266ca35587Sdholland }
20276ca35587Sdholland *tocp = '\0';
20286ca35587Sdholland *outlenp = (size_t)outlen;
20296ca35587Sdholland if (hashp != NULL)
20306ca35587Sdholland *hashp = hash;
20316ca35587Sdholland nfsmout:
20326ca35587Sdholland NFSEXITCODE2(error, nd);
20336ca35587Sdholland return (error);
20346ca35587Sdholland }
20356ca35587Sdholland
20366ca35587Sdholland void
nfsd_init(void)20376ca35587Sdholland nfsd_init(void)
20386ca35587Sdholland {
20396ca35587Sdholland int i;
20406ca35587Sdholland static int inited = 0;
20416ca35587Sdholland
20426ca35587Sdholland if (inited)
20436ca35587Sdholland return;
20446ca35587Sdholland inited = 1;
20456ca35587Sdholland
20466ca35587Sdholland /*
20476ca35587Sdholland * Initialize client queues. Don't free/reinitialize
20486ca35587Sdholland * them when nfsds are restarted.
20496ca35587Sdholland */
20502d39560cSpgoyette nfsclienthash = malloc(sizeof(struct nfsclienthashhead) *
20512d39560cSpgoyette nfsrv_clienthashsize, M_NFSDCLIENT, M_WAITOK | M_ZERO);
20522d39560cSpgoyette for (i = 0; i < nfsrv_clienthashsize; i++)
20536ca35587Sdholland LIST_INIT(&nfsclienthash[i]);
20542d39560cSpgoyette nfslockhash = malloc(sizeof(struct nfslockhashhead) *
20552d39560cSpgoyette nfsrv_lockhashsize, M_NFSDLOCKFILE, M_WAITOK | M_ZERO);
20562d39560cSpgoyette for (i = 0; i < nfsrv_lockhashsize; i++)
20576ca35587Sdholland LIST_INIT(&nfslockhash[i]);
20582d39560cSpgoyette nfssessionhash = malloc(sizeof(struct nfssessionhash) *
20592d39560cSpgoyette nfsrv_sessionhashsize, M_NFSDSESSION, M_WAITOK | M_ZERO);
20602d39560cSpgoyette for (i = 0; i < nfsrv_sessionhashsize; i++) {
20612d39560cSpgoyette mtx_init(&nfssessionhash[i].mtx, "nfssm", NULL, MTX_DEF);
20622d39560cSpgoyette LIST_INIT(&nfssessionhash[i].list);
20632d39560cSpgoyette }
20646ca35587Sdholland
20656ca35587Sdholland /* and the v2 pubfh should be all zeros */
20666ca35587Sdholland NFSBZERO(nfs_v2pubfh, NFSX_V2FH);
20676ca35587Sdholland }
20686ca35587Sdholland
20696ca35587Sdholland /*
20706ca35587Sdholland * Check the v4 root exports.
20716ca35587Sdholland * Return 0 if ok, 1 otherwise.
20726ca35587Sdholland */
20736ca35587Sdholland int
nfsd_checkrootexp(struct nfsrv_descript * nd)20746ca35587Sdholland nfsd_checkrootexp(struct nfsrv_descript *nd)
20756ca35587Sdholland {
20766ca35587Sdholland
20776ca35587Sdholland if ((nd->nd_flag & (ND_GSS | ND_EXAUTHSYS)) == ND_EXAUTHSYS)
20786ca35587Sdholland return (0);
20796ca35587Sdholland if ((nd->nd_flag & (ND_GSSINTEGRITY | ND_EXGSSINTEGRITY)) ==
20806ca35587Sdholland (ND_GSSINTEGRITY | ND_EXGSSINTEGRITY))
20816ca35587Sdholland return (0);
20826ca35587Sdholland if ((nd->nd_flag & (ND_GSSPRIVACY | ND_EXGSSPRIVACY)) ==
20836ca35587Sdholland (ND_GSSPRIVACY | ND_EXGSSPRIVACY))
20846ca35587Sdholland return (0);
20856ca35587Sdholland if ((nd->nd_flag & (ND_GSS | ND_GSSINTEGRITY | ND_GSSPRIVACY |
20866ca35587Sdholland ND_EXGSS)) == (ND_GSS | ND_EXGSS))
20876ca35587Sdholland return (0);
20886ca35587Sdholland return (1);
20896ca35587Sdholland }
20906ca35587Sdholland
20912d39560cSpgoyette /*
20922d39560cSpgoyette * Parse the first part of an NFSv4 compound to find out what the minor
20932d39560cSpgoyette * version# is.
20942d39560cSpgoyette */
20952d39560cSpgoyette void
nfsd_getminorvers(struct nfsrv_descript * nd,u_char * tag,u_char ** tagstrp,int * taglenp,u_int32_t * minversp)20962d39560cSpgoyette nfsd_getminorvers(struct nfsrv_descript *nd, u_char *tag, u_char **tagstrp,
20972d39560cSpgoyette int *taglenp, u_int32_t *minversp)
20982d39560cSpgoyette {
20992d39560cSpgoyette uint32_t *tl;
21002d39560cSpgoyette int error = 0, taglen = -1;
21012d39560cSpgoyette u_char *tagstr = NULL;
21022d39560cSpgoyette
21032d39560cSpgoyette NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED);
21042d39560cSpgoyette taglen = fxdr_unsigned(int, *tl);
21052d39560cSpgoyette if (taglen < 0 || taglen > NFSV4_OPAQUELIMIT) {
21062d39560cSpgoyette error = EBADRPC;
21072d39560cSpgoyette goto nfsmout;
21082d39560cSpgoyette }
21092d39560cSpgoyette if (taglen <= NFSV4_SMALLSTR)
21102d39560cSpgoyette tagstr = tag;
21112d39560cSpgoyette else
21122d39560cSpgoyette tagstr = malloc(taglen + 1, M_TEMP, M_WAITOK);
21132d39560cSpgoyette error = nfsrv_mtostr(nd, tagstr, taglen);
21142d39560cSpgoyette if (error != 0)
21152d39560cSpgoyette goto nfsmout;
21162d39560cSpgoyette NFSM_DISSECT(tl, uint32_t *, NFSX_UNSIGNED);
21172d39560cSpgoyette *minversp = fxdr_unsigned(u_int32_t, *tl);
21182d39560cSpgoyette *tagstrp = tagstr;
21192d39560cSpgoyette if (*minversp == NFSV41_MINORVERSION)
21202d39560cSpgoyette nd->nd_flag |= ND_NFSV41;
21212d39560cSpgoyette nfsmout:
21222d39560cSpgoyette if (error != 0) {
21232d39560cSpgoyette if (tagstr != NULL && taglen > NFSV4_SMALLSTR)
21242d39560cSpgoyette free(tagstr, M_TEMP);
21252d39560cSpgoyette taglen = -1;
21262d39560cSpgoyette }
21272d39560cSpgoyette *taglenp = taglen;
21282d39560cSpgoyette }
21292d39560cSpgoyette
2130