nfsm_subs.h revision 36097
160484Sobrien/* 260484Sobrien * Copyright (c) 1989, 1993 360484Sobrien * The Regents of the University of California. All rights reserved. 460484Sobrien * 560484Sobrien * This code is derived from software contributed to Berkeley by 660484Sobrien * Rick Macklem at The University of Guelph. 760484Sobrien * 860484Sobrien * Redistribution and use in source and binary forms, with or without 9218822Sdim * modification, are permitted provided that the following conditions 1060484Sobrien * are met: 1160484Sobrien * 1. Redistributions of source code must retain the above copyright 1260484Sobrien * notice, this list of conditions and the following disclaimer. 1360484Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1460484Sobrien * notice, this list of conditions and the following disclaimer in the 1560484Sobrien * documentation and/or other materials provided with the distribution. 1660484Sobrien * 3. All advertising materials mentioning features or use of this software 1760484Sobrien * must display the following acknowledgement: 1860484Sobrien * This product includes software developed by the University of 1960484Sobrien * California, Berkeley and its contributors. 2060484Sobrien * 4. Neither the name of the University nor the names of its contributors 2160484Sobrien * may be used to endorse or promote products derived from this software 2260484Sobrien * without specific prior written permission. 2360484Sobrien * 2460484Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2560484Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2660484Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2760484Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2860484Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2960484Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3060484Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3160484Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3260484Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3360484Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3460484Sobrien * SUCH DAMAGE. 3560484Sobrien * 3660484Sobrien * @(#)nfsm_subs.h 8.2 (Berkeley) 3/30/95 3760484Sobrien * $Id: nfsm_subs.h,v 1.15 1998/03/30 09:54:41 phk Exp $ 38218822Sdim */ 3960484Sobrien 4060484Sobrien 4160484Sobrien#ifndef _NFS_NFSM_SUBS_H_ 4260484Sobrien#define _NFS_NFSM_SUBS_H_ 4360484Sobrien 4460484Sobrienstruct ucred; 4560484Sobrienstruct vnode; 4660484Sobrien 4760484Sobrien/* 4860484Sobrien * These macros do strange and peculiar things to mbuf chains for 4960484Sobrien * the assistance of the nfs code. To attempt to use them for any 5060484Sobrien * other purpose will be dangerous. (they make weird assumptions) 5160484Sobrien */ 5260484Sobrien 5360484Sobrien/* 5460484Sobrien * First define what the actual subs. return 5560484Sobrien */ 5660484Sobrienstruct mbuf *nfsm_reqh __P((struct vnode *vp, u_long procid, int hsiz, 5760484Sobrien caddr_t *bposp)); 5860484Sobrienstruct mbuf *nfsm_rpchead __P((struct ucred *cr, int nmflag, int procid, 5960484Sobrien int auth_type, int auth_len, char *auth_str, 6060484Sobrien int verf_len, char *verf_str, 6160484Sobrien struct mbuf *mrest, int mrest_len, 6260484Sobrien struct mbuf **mbp, u_long *xidp)); 6360484Sobrien 6460484Sobrien#define M_HASCL(m) ((m)->m_flags & M_EXT) 6560484Sobrien#define NFSMINOFF(m) \ 6660484Sobrien if (M_HASCL(m)) \ 6760484Sobrien (m)->m_data = (m)->m_ext.ext_buf; \ 6860484Sobrien else if ((m)->m_flags & M_PKTHDR) \ 6960484Sobrien (m)->m_data = (m)->m_pktdat; \ 7060484Sobrien else \ 7160484Sobrien (m)->m_data = (m)->m_dat 7260484Sobrien#define NFSMADV(m, s) (m)->m_data += (s) 7360484Sobrien#define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \ 7460484Sobrien (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN)) 7560484Sobrien 7660484Sobrien/* 7760484Sobrien * Now for the macros that do the simple stuff and call the functions 7860484Sobrien * for the hard stuff. 7960484Sobrien * These macros use several vars. declared in nfsm_reqhead and these 8060484Sobrien * vars. must not be used elsewhere unless you are careful not to corrupt 8160484Sobrien * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries 8260484Sobrien * that may be used so long as the value is not expected to retained 8360484Sobrien * after a macro. 8460484Sobrien * I know, this is kind of dorkey, but it makes the actual op functions 8560484Sobrien * fairly clean and deals with the mess caused by the xdr discriminating 8660484Sobrien * unions. 8760484Sobrien */ 8860484Sobrien 8960484Sobrien#define nfsm_build(a,c,s) \ 9060484Sobrien { if ((s) > M_TRAILINGSPACE(mb)) { \ 9160484Sobrien MGET(mb2, M_WAIT, MT_DATA); \ 9260484Sobrien if ((s) > MLEN) \ 9360484Sobrien panic("build > MLEN"); \ 9460484Sobrien mb->m_next = mb2; \ 9560484Sobrien mb = mb2; \ 9660484Sobrien mb->m_len = 0; \ 9760484Sobrien bpos = mtod(mb, caddr_t); \ 9860484Sobrien } \ 9960484Sobrien (a) = (c)(bpos); \ 10060484Sobrien mb->m_len += (s); \ 10160484Sobrien bpos += (s); } 10260484Sobrien 10360484Sobrien#define nfsm_dissect(a, c, s) \ 10460484Sobrien { t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 10560484Sobrien if (t1 >= (s)) { \ 106218822Sdim (a) = (c)(dpos); \ 10760484Sobrien dpos += (s); \ 10860484Sobrien } else if (t1 = nfsm_disct(&md, &dpos, (s), t1, &cp2)) { \ 10960484Sobrien error = t1; \ 11060484Sobrien m_freem(mrep); \ 11160484Sobrien goto nfsmout; \ 11260484Sobrien } else { \ 11360484Sobrien (a) = (c)cp2; \ 11460484Sobrien } } 11560484Sobrien 11660484Sobrien#define nfsm_fhtom(v, v3) \ 11760484Sobrien { if (v3) { \ 11860484Sobrien t2 = nfsm_rndup(VTONFS(v)->n_fhsize) + NFSX_UNSIGNED; \ 11960484Sobrien if (t2 <= M_TRAILINGSPACE(mb)) { \ 12060484Sobrien nfsm_build(tl, u_long *, t2); \ 12160484Sobrien *tl++ = txdr_unsigned(VTONFS(v)->n_fhsize); \ 12260484Sobrien *(tl + ((t2>>2) - 2)) = 0; \ 12360484Sobrien bcopy((caddr_t)VTONFS(v)->n_fhp,(caddr_t)tl, \ 12460484Sobrien VTONFS(v)->n_fhsize); \ 12560484Sobrien } else if (t2 = nfsm_strtmbuf(&mb, &bpos, \ 12660484Sobrien (caddr_t)VTONFS(v)->n_fhp, VTONFS(v)->n_fhsize)) { \ 12760484Sobrien error = t2; \ 12860484Sobrien m_freem(mreq); \ 12960484Sobrien goto nfsmout; \ 13060484Sobrien } \ 13160484Sobrien } else { \ 13260484Sobrien nfsm_build(cp, caddr_t, NFSX_V2FH); \ 13360484Sobrien bcopy((caddr_t)VTONFS(v)->n_fhp, cp, NFSX_V2FH); \ 13460484Sobrien } } 135218822Sdim 13660484Sobrien#define nfsm_srvfhtom(f, v3) \ 13760484Sobrien { if (v3) { \ 13860484Sobrien nfsm_build(tl, u_long *, NFSX_UNSIGNED + NFSX_V3FH); \ 13960484Sobrien *tl++ = txdr_unsigned(NFSX_V3FH); \ 14060484Sobrien bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \ 14160484Sobrien } else { \ 14260484Sobrien nfsm_build(cp, caddr_t, NFSX_V2FH); \ 14360484Sobrien bcopy((caddr_t)(f), cp, NFSX_V2FH); \ 14460484Sobrien } } 14560484Sobrien 14660484Sobrien#define nfsm_srvpostop_fh(f) \ 14760484Sobrien { nfsm_build(tl, u_long *, 2 * NFSX_UNSIGNED + NFSX_V3FH); \ 14860484Sobrien *tl++ = nfs_true; \ 14960484Sobrien *tl++ = txdr_unsigned(NFSX_V3FH); \ 15060484Sobrien bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \ 15160484Sobrien } 15260484Sobrien 15360484Sobrien#define nfsm_mtofh(d, v, v3, f) \ 15460484Sobrien { struct nfsnode *ttnp; nfsfh_t *ttfhp; int ttfhsize; \ 15560484Sobrien if (v3) { \ 15660484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 15760484Sobrien (f) = fxdr_unsigned(int, *tl); \ 15860484Sobrien } else \ 15960484Sobrien (f) = 1; \ 16060484Sobrien if (f) { \ 16160484Sobrien nfsm_getfh(ttfhp, ttfhsize, (v3)); \ 16260484Sobrien if (t1 = nfs_nget((d)->v_mount, ttfhp, ttfhsize, \ 16360484Sobrien &ttnp)) { \ 16460484Sobrien error = t1; \ 16560484Sobrien m_freem(mrep); \ 16660484Sobrien goto nfsmout; \ 16760484Sobrien } \ 16860484Sobrien (v) = NFSTOV(ttnp); \ 16960484Sobrien } \ 17060484Sobrien if (v3) { \ 17160484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 17260484Sobrien if (f) \ 17360484Sobrien (f) = fxdr_unsigned(int, *tl); \ 17460484Sobrien else if (fxdr_unsigned(int, *tl)) \ 17560484Sobrien nfsm_adv(NFSX_V3FATTR); \ 17660484Sobrien } \ 17760484Sobrien if (f) \ 17860484Sobrien nfsm_loadattr((v), (struct vattr *)0); \ 17960484Sobrien } 18060484Sobrien 18160484Sobrien#define nfsm_getfh(f, s, v3) \ 18260484Sobrien { if (v3) { \ 18360484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 18460484Sobrien if (((s) = fxdr_unsigned(int, *tl)) <= 0 || \ 18560484Sobrien (s) > NFSX_V3FHMAX) { \ 18660484Sobrien m_freem(mrep); \ 18760484Sobrien error = EBADRPC; \ 18860484Sobrien goto nfsmout; \ 18960484Sobrien } \ 19060484Sobrien } else \ 19160484Sobrien (s) = NFSX_V2FH; \ 19260484Sobrien nfsm_dissect((f), nfsfh_t *, nfsm_rndup(s)); } 19360484Sobrien 19460484Sobrien#define nfsm_loadattr(v, a) \ 19560484Sobrien { struct vnode *ttvp = (v); \ 19660484Sobrien if (t1 = nfs_loadattrcache(&ttvp, &md, &dpos, (a))) { \ 19760484Sobrien error = t1; \ 19860484Sobrien m_freem(mrep); \ 19960484Sobrien goto nfsmout; \ 20060484Sobrien } \ 20160484Sobrien (v) = ttvp; } 202218822Sdim 20360484Sobrien#define nfsm_postop_attr(v, f) \ 20460484Sobrien { struct vnode *ttvp = (v); \ 20560484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 20660484Sobrien if ((f) = fxdr_unsigned(int, *tl)) { \ 20760484Sobrien if (t1 = nfs_loadattrcache(&ttvp, &md, &dpos, \ 20860484Sobrien (struct vattr *)0)) { \ 209104834Sobrien error = t1; \ 21060484Sobrien (f) = 0; \ 21160484Sobrien m_freem(mrep); \ 21260484Sobrien goto nfsmout; \ 21360484Sobrien } \ 21460484Sobrien (v) = ttvp; \ 21560484Sobrien } } 21660484Sobrien 21760484Sobrien/* Used as (f) for nfsm_wcc_data() */ 21860484Sobrien#define NFSV3_WCCRATTR 0 21960484Sobrien#define NFSV3_WCCCHK 1 22060484Sobrien 22160484Sobrien#define nfsm_wcc_data(v, f) \ 22260484Sobrien { int ttattrf, ttretf = 0; \ 22360484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 22460484Sobrien if (*tl == nfs_true) { \ 22560484Sobrien nfsm_dissect(tl, u_long *, 6 * NFSX_UNSIGNED); \ 22660484Sobrien if (f) \ 227104834Sobrien ttretf = (VTONFS(v)->n_mtime == \ 22860484Sobrien fxdr_unsigned(u_long, *(tl + 2))); \ 22960484Sobrien } \ 23060484Sobrien nfsm_postop_attr((v), ttattrf); \ 23160484Sobrien if (f) { \ 23260484Sobrien (f) = ttretf; \ 23360484Sobrien } else { \ 23460484Sobrien (f) = ttattrf; \ 23560484Sobrien } } 23660484Sobrien 23760484Sobrien#define nfsm_v3sattr(s, a, u, g) \ 23860484Sobrien { (s)->sa_modetrue = nfs_true; \ 23960484Sobrien (s)->sa_mode = vtonfsv3_mode((a)->va_mode); \ 24060484Sobrien (s)->sa_uidtrue = nfs_true; \ 24160484Sobrien (s)->sa_uid = txdr_unsigned(u); \ 24260484Sobrien (s)->sa_gidtrue = nfs_true; \ 24360484Sobrien (s)->sa_gid = txdr_unsigned(g); \ 244218822Sdim (s)->sa_sizefalse = nfs_false; \ 24560484Sobrien (s)->sa_atimetype = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \ 24660484Sobrien txdr_nfsv3time(&(a)->va_atime, &(s)->sa_atime); \ 24760484Sobrien (s)->sa_mtimetype = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \ 24860484Sobrien txdr_nfsv3time(&(a)->va_mtime, &(s)->sa_mtime); \ 24960484Sobrien } 250104834Sobrien 25160484Sobrien#define nfsm_strsiz(s,m) \ 25260484Sobrien { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 25360484Sobrien if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \ 25460484Sobrien m_freem(mrep); \ 25560484Sobrien error = EBADRPC; \ 25660484Sobrien goto nfsmout; \ 25760484Sobrien } } 25860484Sobrien 25960484Sobrien#define nfsm_srvstrsiz(s,m) \ 26060484Sobrien { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 26160484Sobrien if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \ 26260484Sobrien error = EBADRPC; \ 26360484Sobrien nfsm_reply(0); \ 26460484Sobrien } } 265218822Sdim 26660484Sobrien#define nfsm_srvnamesiz(s) \ 26760484Sobrien { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 26860484Sobrien if (((s) = fxdr_unsigned(long,*tl)) > NFS_MAXNAMLEN) \ 26960484Sobrien error = NFSERR_NAMETOL; \ 27060484Sobrien if ((s) <= 0) \ 271104834Sobrien error = EBADRPC; \ 27260484Sobrien if (error) \ 27360484Sobrien nfsm_reply(0); \ 27460484Sobrien } 27560484Sobrien 27660484Sobrien#define nfsm_mtouio(p,s) \ 27760484Sobrien if ((s) > 0 && \ 27860484Sobrien (t1 = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \ 27960484Sobrien error = t1; \ 28060484Sobrien m_freem(mrep); \ 28160484Sobrien goto nfsmout; \ 28260484Sobrien } 28360484Sobrien 28460484Sobrien#define nfsm_uiotom(p,s) \ 28560484Sobrien if (t1 = nfsm_uiotombuf((p),&mb,(s),&bpos)) { \ 28660484Sobrien error = t1; \ 287218822Sdim m_freem(mreq); \ 28860484Sobrien goto nfsmout; \ 28960484Sobrien } 29060484Sobrien 29160484Sobrien#define nfsm_reqhead(v,a,s) \ 29260484Sobrien mb = mreq = nfsm_reqh((v),(a),(s),&bpos) 293104834Sobrien 29460484Sobrien#define nfsm_reqdone m_freem(mrep); \ 29560484Sobrien nfsmout: 29660484Sobrien 29760484Sobrien#define nfsm_rndup(a) (((a)+3)&(~0x3)) 29860484Sobrien 29960484Sobrien#define nfsm_request(v, t, p, c) \ 30060484Sobrien if (error = nfs_request((v), mreq, (t), (p), \ 30160484Sobrien (c), &mrep, &md, &dpos)) { \ 30260484Sobrien if (error & NFSERR_RETERR) \ 30360484Sobrien error &= ~NFSERR_RETERR; \ 30460484Sobrien else \ 30560484Sobrien goto nfsmout; \ 306104834Sobrien } 30760484Sobrien 30860484Sobrien#define nfsm_strtom(a,s,m) \ 30960484Sobrien if ((s) > (m)) { \ 31060484Sobrien m_freem(mreq); \ 31160484Sobrien error = ENAMETOOLONG; \ 31260484Sobrien goto nfsmout; \ 31360484Sobrien } \ 31460484Sobrien t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \ 31560484Sobrien if (t2 <= M_TRAILINGSPACE(mb)) { \ 31660484Sobrien nfsm_build(tl,u_long *,t2); \ 31760484Sobrien *tl++ = txdr_unsigned(s); \ 31860484Sobrien *(tl+((t2>>2)-2)) = 0; \ 319104834Sobrien bcopy((caddr_t)(a), (caddr_t)tl, (s)); \ 32060484Sobrien } else if (t2 = nfsm_strtmbuf(&mb, &bpos, (a), (s))) { \ 32160484Sobrien error = t2; \ 32260484Sobrien m_freem(mreq); \ 32360484Sobrien goto nfsmout; \ 32460484Sobrien } 32560484Sobrien 32660484Sobrien#define nfsm_srvdone \ 32760484Sobrien nfsmout: \ 32860484Sobrien return(error) 32960484Sobrien 33060484Sobrien#define nfsm_reply(s) \ 33160484Sobrien { \ 33260484Sobrien nfsd->nd_repstat = error; \ 33360484Sobrien if (error && !(nfsd->nd_flag & ND_NFSV3)) \ 33460484Sobrien (void) nfs_rephead(0, nfsd, slp, error, cache, &frev, \ 33560484Sobrien mrq, &mb, &bpos); \ 33660484Sobrien else \ 33760484Sobrien (void) nfs_rephead((s), nfsd, slp, error, cache, &frev, \ 338218822Sdim mrq, &mb, &bpos); \ 33960484Sobrien m_freem(mrep); \ 34060484Sobrien mreq = *mrq; \ 34160484Sobrien if (error && (!(nfsd->nd_flag & ND_NFSV3) || \ 34260484Sobrien error == EBADRPC)) \ 34360484Sobrien return(0); \ 34460484Sobrien } 345104834Sobrien 34660484Sobrien#define nfsm_writereply(s, v3) \ 34760484Sobrien { \ 34860484Sobrien nfsd->nd_repstat = error; \ 34960484Sobrien if (error && !(v3)) \ 35060484Sobrien (void) nfs_rephead(0, nfsd, slp, error, cache, &frev, \ 35160484Sobrien &mreq, &mb, &bpos); \ 35260484Sobrien else \ 35360484Sobrien (void) nfs_rephead((s), nfsd, slp, error, cache, &frev, \ 35460484Sobrien &mreq, &mb, &bpos); \ 35560484Sobrien } 35660484Sobrien 35760484Sobrien#define nfsm_adv(s) \ 35860484Sobrien { t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 35960484Sobrien if (t1 >= (s)) { \ 36060484Sobrien dpos += (s); \ 36160484Sobrien } else if (t1 = nfs_adv(&md, &dpos, (s), t1)) { \ 36260484Sobrien error = t1; \ 363104834Sobrien m_freem(mrep); \ 36460484Sobrien goto nfsmout; \ 36560484Sobrien } } 36660484Sobrien 36760484Sobrien#define nfsm_srvmtofh(f) \ 36860484Sobrien { int fhlen = NFSX_V3FH; \ 36960484Sobrien if (nfsd->nd_flag & ND_NFSV3) { \ 37060484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 37160484Sobrien fhlen = fxdr_unsigned(int, *tl); \ 37260484Sobrien if (fhlen == 0) { \ 37360484Sobrien bzero((caddr_t)(f), NFSX_V3FH); \ 37460484Sobrien } else if (fhlen != NFSX_V3FH) { \ 37560484Sobrien error = EBADRPC; \ 37660484Sobrien nfsm_reply(0); \ 37760484Sobrien } \ 378218822Sdim } \ 37960484Sobrien if (fhlen != 0) { \ 38060484Sobrien nfsm_dissect(tl, u_long *, NFSX_V3FH); \ 38160484Sobrien bcopy((caddr_t)tl, (caddr_t)(f), NFSX_V3FH); \ 38260484Sobrien if ((nfsd->nd_flag & ND_NFSV3) == 0) \ 38360484Sobrien nfsm_adv(NFSX_V2FH - NFSX_V3FH); \ 38460484Sobrien } \ 38560484Sobrien } 38660484Sobrien 38760484Sobrien#define nfsm_clget \ 38860484Sobrien if (bp >= be) { \ 38960484Sobrien if (mp == mb) \ 39060484Sobrien mp->m_len += bp-bpos; \ 391104834Sobrien MGET(mp, M_WAIT, MT_DATA); \ 39260484Sobrien MCLGET(mp, M_WAIT); \ 39360484Sobrien mp->m_len = NFSMSIZ(mp); \ 39460484Sobrien mp2->m_next = mp; \ 39560484Sobrien mp2 = mp; \ 39660484Sobrien bp = mtod(mp, caddr_t); \ 39760484Sobrien be = bp+mp->m_len; \ 39860484Sobrien } \ 39960484Sobrien tl = (u_long *)bp 40060484Sobrien 40160484Sobrien#define nfsm_srvfillattr(a, f) \ 40260484Sobrien nfsm_srvfattr(nfsd, (a), (f)) 40360484Sobrien 40460484Sobrien#define nfsm_srvwcc_data(br, b, ar, a) \ 40560484Sobrien nfsm_srvwcc(nfsd, (br), (b), (ar), (a), &mb, &bpos) 40660484Sobrien 40760484Sobrien#define nfsm_srvpostop_attr(r, a) \ 40860484Sobrien nfsm_srvpostopattr(nfsd, (r), (a), &mb, &bpos) 40960484Sobrien 41060484Sobrien#define nfsm_srvsattr(a) \ 41160484Sobrien { nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 41260484Sobrien if (*tl == nfs_true) { \ 41360484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 41460484Sobrien (a)->va_mode = nfstov_mode(*tl); \ 41560484Sobrien } \ 41660484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 41760484Sobrien if (*tl == nfs_true) { \ 41860484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 41960484Sobrien (a)->va_uid = fxdr_unsigned(uid_t, *tl); \ 42060484Sobrien } \ 42160484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 42260484Sobrien if (*tl == nfs_true) { \ 423104834Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 42460484Sobrien (a)->va_gid = fxdr_unsigned(gid_t, *tl); \ 42560484Sobrien } \ 42660484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 42760484Sobrien if (*tl == nfs_true) { \ 42860484Sobrien nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \ 42960484Sobrien fxdr_hyper(tl, &(a)->va_size); \ 43060484Sobrien } \ 43160484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 43260484Sobrien switch (fxdr_unsigned(int, *tl)) { \ 43360484Sobrien case NFSV3SATTRTIME_TOCLIENT: \ 43460484Sobrien nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \ 43560484Sobrien fxdr_nfsv3time(tl, &(a)->va_atime); \ 43660484Sobrien break; \ 43760484Sobrien case NFSV3SATTRTIME_TOSERVER: \ 43860484Sobrien getnanotime(&(a)->va_atime); \ 43960484Sobrien break; \ 44060484Sobrien }; \ 44160484Sobrien nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \ 44260484Sobrien switch (fxdr_unsigned(int, *tl)) { \ 44360484Sobrien case NFSV3SATTRTIME_TOCLIENT: \ 44460484Sobrien nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \ 44560484Sobrien fxdr_nfsv3time(tl, &(a)->va_mtime); \ 44660484Sobrien break; \ 44760484Sobrien case NFSV3SATTRTIME_TOSERVER: \ 44860484Sobrien getnanotime(&(a)->va_mtime); \ 44960484Sobrien break; \ 45060484Sobrien }; } 45160484Sobrien 45260484Sobrien#endif 45360484Sobrien