138414Smckusick /* 238414Smckusick * Copyright (c) 1989 The Regents of the University of California. 338414Smckusick * All rights reserved. 438414Smckusick * 538414Smckusick * This code is derived from software contributed to Berkeley by 638414Smckusick * Rick Macklem at The University of Guelph. 738414Smckusick * 844515Sbostic * %sccs.include.redist.c% 938414Smckusick * 10*63487Smckusick * @(#)nfsm_subs.h 7.17 (Berkeley) 06/16/93 1138414Smckusick */ 1238414Smckusick 1338414Smckusick /* 1438414Smckusick * These macros do strange and peculiar things to mbuf chains for 1538414Smckusick * the assistance of the nfs code. To attempt to use them for any 1638414Smckusick * other purpose will be dangerous. (they make weird assumptions) 1738414Smckusick */ 1838414Smckusick 1938414Smckusick /* 2038414Smckusick * First define what the actual subs. return 2138414Smckusick */ 2239494Smckusick extern struct mbuf *nfsm_reqh(); 2338414Smckusick 2438414Smckusick #define M_HASCL(m) ((m)->m_flags & M_EXT) 2538414Smckusick #define NFSMINOFF(m) \ 2638414Smckusick if (M_HASCL(m)) \ 2738414Smckusick (m)->m_data = (m)->m_ext.ext_buf; \ 2852196Smckusick else if ((m)->m_flags & M_PKTHDR) \ 2952196Smckusick (m)->m_data = (m)->m_pktdat; \ 3038414Smckusick else \ 3138414Smckusick (m)->m_data = (m)->m_dat 3238414Smckusick #define NFSMADV(m, s) (m)->m_data += (s) 3338425Smckusick #define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \ 3438414Smckusick (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN)) 3538414Smckusick 3638414Smckusick /* 3738414Smckusick * Now for the macros that do the simple stuff and call the functions 3838414Smckusick * for the hard stuff. 3938414Smckusick * These macros use several vars. declared in nfsm_reqhead and these 4038414Smckusick * vars. must not be used elsewhere unless you are careful not to corrupt 4138414Smckusick * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries 4238414Smckusick * that may be used so long as the value is not expected to retained 4338414Smckusick * after a macro. 4438414Smckusick * I know, this is kind of dorkey, but it makes the actual op functions 4538414Smckusick * fairly clean and deals with the mess caused by the xdr discriminating 4638414Smckusick * unions. 4738414Smckusick */ 4838414Smckusick 4938414Smckusick #define nfsm_build(a,c,s) \ 5052196Smckusick { if ((s) > M_TRAILINGSPACE(mb)) { \ 5138414Smckusick MGET(mb2, M_WAIT, MT_DATA); \ 5238414Smckusick if ((s) > MLEN) \ 5338414Smckusick panic("build > MLEN"); \ 5438414Smckusick mb->m_next = mb2; \ 5538414Smckusick mb = mb2; \ 5638414Smckusick mb->m_len = 0; \ 5738414Smckusick bpos = mtod(mb, caddr_t); \ 5838414Smckusick } \ 5938414Smckusick (a) = (c)(bpos); \ 6038414Smckusick mb->m_len += (s); \ 6152196Smckusick bpos += (s); } 6238414Smckusick 6352196Smckusick #define nfsm_dissect(a,c,s) \ 6452196Smckusick { t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 6538414Smckusick if (t1 >= (s)) { \ 6638414Smckusick (a) = (c)(dpos); \ 6738414Smckusick dpos += (s); \ 6863480Smckusick } else if (error = nfsm_disct(&md, &dpos, (s), t1, &cp2)) { \ 6938414Smckusick m_freem(mrep); \ 7038414Smckusick goto nfsmout; \ 7138414Smckusick } else { \ 7238414Smckusick (a) = (c)cp2; \ 7352196Smckusick } } 7438414Smckusick 7538414Smckusick #define nfsm_fhtom(v) \ 7638414Smckusick nfsm_build(cp,caddr_t,NFSX_FH); \ 7738414Smckusick bcopy((caddr_t)&(VTONFS(v)->n_fh), cp, NFSX_FH) 7838414Smckusick 7938414Smckusick #define nfsm_srvfhtom(f) \ 8038414Smckusick nfsm_build(cp,caddr_t,NFSX_FH); \ 8138414Smckusick bcopy((caddr_t)(f), cp, NFSX_FH) 8238414Smckusick 8338414Smckusick #define nfsm_mtofh(d,v) \ 8438414Smckusick { struct nfsnode *np; nfsv2fh_t *fhp; \ 8552196Smckusick nfsm_dissect(fhp,nfsv2fh_t *,NFSX_FH); \ 8638414Smckusick if (error = nfs_nget((d)->v_mount, fhp, &np)) { \ 8738414Smckusick m_freem(mrep); \ 8838414Smckusick goto nfsmout; \ 8938414Smckusick } \ 9038414Smckusick (v) = NFSTOV(np); \ 9138414Smckusick nfsm_loadattr(v, (struct vattr *)0); \ 9238414Smckusick } 9338414Smckusick 9438414Smckusick #define nfsm_loadattr(v,a) \ 9539494Smckusick { struct vnode *tvp = (v); \ 9639494Smckusick if (error = nfs_loadattrcache(&tvp, &md, &dpos, (a))) { \ 9738414Smckusick m_freem(mrep); \ 9838414Smckusick goto nfsmout; \ 9939494Smckusick } \ 10039494Smckusick (v) = tvp; } 10138414Smckusick 10238414Smckusick #define nfsm_strsiz(s,m) \ 10352196Smckusick { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 10448046Smckusick if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \ 10538414Smckusick m_freem(mrep); \ 10638414Smckusick error = EBADRPC; \ 10738414Smckusick goto nfsmout; \ 10852196Smckusick } } 10938414Smckusick 11038414Smckusick #define nfsm_srvstrsiz(s,m) \ 11152196Smckusick { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 11248046Smckusick if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \ 11338414Smckusick error = EBADRPC; \ 11438414Smckusick nfsm_reply(0); \ 11552196Smckusick } } 11638414Smckusick 11738414Smckusick #define nfsm_mtouio(p,s) \ 11838414Smckusick if ((s) > 0 && \ 11938414Smckusick (error = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \ 12038414Smckusick m_freem(mrep); \ 12138414Smckusick goto nfsmout; \ 12238414Smckusick } 12338414Smckusick 12438414Smckusick #define nfsm_uiotom(p,s) \ 12538414Smckusick if (error = nfsm_uiotombuf((p),&mb,(s),&bpos)) { \ 12638414Smckusick m_freem(mreq); \ 12738414Smckusick goto nfsmout; \ 12838414Smckusick } 12938414Smckusick 13052196Smckusick #define nfsm_reqhead(v,a,s) \ 13152196Smckusick mb = mreq = nfsm_reqh((v),(a),(s),&bpos) 13238414Smckusick 13338414Smckusick #define nfsm_reqdone m_freem(mrep); \ 13438414Smckusick nfsmout: 13538414Smckusick 13638414Smckusick #define nfsm_rndup(a) (((a)+3)&(~0x3)) 13738414Smckusick 13852196Smckusick #define nfsm_request(v, t, p, c) \ 13952196Smckusick if (error = nfs_request((v), mreq, (t), (p), \ 14052196Smckusick (c), &mrep, &md, &dpos)) \ 14138414Smckusick goto nfsmout 14238414Smckusick 14338414Smckusick #define nfsm_strtom(a,s,m) \ 14438414Smckusick if ((s) > (m)) { \ 14538414Smckusick m_freem(mreq); \ 14638414Smckusick error = ENAMETOOLONG; \ 14738414Smckusick goto nfsmout; \ 14838414Smckusick } \ 14938414Smckusick t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \ 15052196Smckusick if (t2 <= M_TRAILINGSPACE(mb)) { \ 15148046Smckusick nfsm_build(tl,u_long *,t2); \ 15248046Smckusick *tl++ = txdr_unsigned(s); \ 15348046Smckusick *(tl+((t2>>2)-2)) = 0; \ 15448046Smckusick bcopy((caddr_t)(a), (caddr_t)tl, (s)); \ 15538414Smckusick } else if (error = nfsm_strtmbuf(&mb, &bpos, (a), (s))) { \ 15638414Smckusick m_freem(mreq); \ 15738414Smckusick goto nfsmout; \ 15838414Smckusick } 15938414Smckusick 16038414Smckusick #define nfsm_srvdone \ 16138414Smckusick nfsmout: \ 16238414Smckusick return(error) 16338414Smckusick 16438414Smckusick #define nfsm_reply(s) \ 16538414Smckusick { \ 16652196Smckusick nfsd->nd_repstat = error; \ 16738414Smckusick if (error) \ 16852196Smckusick (void) nfs_rephead(0, nfsd, error, cache, &frev, \ 16952196Smckusick mrq, &mb, &bpos); \ 17038414Smckusick else \ 17152196Smckusick (void) nfs_rephead((s), nfsd, error, cache, &frev, \ 17252196Smckusick mrq, &mb, &bpos); \ 17338414Smckusick m_freem(mrep); \ 17439745Smckusick mreq = *mrq; \ 17538414Smckusick if (error) \ 17638414Smckusick return(0); \ 17738414Smckusick } 17838414Smckusick 17938414Smckusick #define nfsm_adv(s) \ 18038414Smckusick t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 18138414Smckusick if (t1 >= (s)) { \ 18238414Smckusick dpos += (s); \ 18338414Smckusick } else if (error = nfs_adv(&md, &dpos, (s), t1)) { \ 18438414Smckusick m_freem(mrep); \ 18538414Smckusick goto nfsmout; \ 18638414Smckusick } 18738414Smckusick 18838414Smckusick #define nfsm_srvmtofh(f) \ 189*63487Smckusick nfsm_dissect(tl, u_long *, NFSX_FH); \ 19048046Smckusick bcopy((caddr_t)tl, (caddr_t)f, NFSX_FH) 19138414Smckusick 19238414Smckusick #define nfsm_clget \ 19338414Smckusick if (bp >= be) { \ 19452196Smckusick if (mp == mb) \ 19552196Smckusick mp->m_len += bp-bpos; \ 19638414Smckusick MGET(mp, M_WAIT, MT_DATA); \ 19741894Smckusick MCLGET(mp, M_WAIT); \ 19838414Smckusick mp->m_len = NFSMSIZ(mp); \ 19952196Smckusick mp2->m_next = mp; \ 20052196Smckusick mp2 = mp; \ 20138414Smckusick bp = mtod(mp, caddr_t); \ 20238414Smckusick be = bp+mp->m_len; \ 20338414Smckusick } \ 20448046Smckusick tl = (u_long *)bp 20538414Smckusick 20639745Smckusick #define nfsm_srvfillattr \ 20739745Smckusick fp->fa_type = vtonfs_type(vap->va_type); \ 20839745Smckusick fp->fa_mode = vtonfs_mode(vap->va_type, vap->va_mode); \ 20939745Smckusick fp->fa_nlink = txdr_unsigned(vap->va_nlink); \ 21039745Smckusick fp->fa_uid = txdr_unsigned(vap->va_uid); \ 21139745Smckusick fp->fa_gid = txdr_unsigned(vap->va_gid); \ 21256277Smckusick if (nfsd->nd_nqlflag == NQL_NOVAL) { \ 21356277Smckusick fp->fa_nfsblocksize = txdr_unsigned(vap->va_blocksize); \ 21456277Smckusick if (vap->va_type == VFIFO) \ 21556277Smckusick fp->fa_nfsrdev = 0xffffffff; \ 21656277Smckusick else \ 21756277Smckusick fp->fa_nfsrdev = txdr_unsigned(vap->va_rdev); \ 21856277Smckusick fp->fa_nfsfsid = txdr_unsigned(vap->va_fsid); \ 21956277Smckusick fp->fa_nfsfileid = txdr_unsigned(vap->va_fileid); \ 22056277Smckusick fp->fa_nfssize = txdr_unsigned(vap->va_size); \ 22156277Smckusick fp->fa_nfsblocks = txdr_unsigned(vap->va_bytes / NFS_FABLKSIZE); \ 22258879Smckusick txdr_nfstime(&vap->va_atime, &fp->fa_nfsatime); \ 22356277Smckusick txdr_nfstime(&vap->va_mtime, &fp->fa_nfsmtime); \ 22456277Smckusick fp->fa_nfsctime.nfs_sec = txdr_unsigned(vap->va_ctime.ts_sec); \ 22556277Smckusick fp->fa_nfsctime.nfs_usec = txdr_unsigned(vap->va_gen); \ 22656277Smckusick } else { \ 22756277Smckusick fp->fa_nqblocksize = txdr_unsigned(vap->va_blocksize); \ 22856277Smckusick if (vap->va_type == VFIFO) \ 22956277Smckusick fp->fa_nqrdev = 0xffffffff; \ 23056277Smckusick else \ 23156277Smckusick fp->fa_nqrdev = txdr_unsigned(vap->va_rdev); \ 23256277Smckusick fp->fa_nqfsid = txdr_unsigned(vap->va_fsid); \ 23356277Smckusick fp->fa_nqfileid = txdr_unsigned(vap->va_fileid); \ 23456277Smckusick txdr_hyper(&vap->va_size, &fp->fa_nqsize); \ 23556277Smckusick txdr_hyper(&vap->va_bytes, &fp->fa_nqbytes); \ 23656277Smckusick txdr_nqtime(&vap->va_atime, &fp->fa_nqatime); \ 23756277Smckusick txdr_nqtime(&vap->va_mtime, &fp->fa_nqmtime); \ 23856277Smckusick txdr_nqtime(&vap->va_ctime, &fp->fa_nqctime); \ 23956277Smckusick fp->fa_nqflags = txdr_unsigned(vap->va_flags); \ 24056277Smckusick fp->fa_nqgen = txdr_unsigned(vap->va_gen); \ 24156277Smckusick txdr_hyper(&vap->va_filerev, &fp->fa_nqfilerev); \ 24256277Smckusick } 24339745Smckusick 244