nfsm_subs.h revision 3664
1254930Sjmg/* 223020Smpp * Copyright (c) 1989, 1993 323020Smpp * The Regents of the University of California. All rights reserved. 423020Smpp * 523020Smpp * This code is derived from software contributed to Berkeley by 623020Smpp * Rick Macklem at The University of Guelph. 723020Smpp * 823020Smpp * Redistribution and use in source and binary forms, with or without 923020Smpp * modification, are permitted provided that the following conditions 1023020Smpp * are met: 1123020Smpp * 1. Redistributions of source code must retain the above copyright 1223020Smpp * notice, this list of conditions and the following disclaimer. 1323020Smpp * 2. Redistributions in binary form must reproduce the above copyright 1423020Smpp * notice, this list of conditions and the following disclaimer in the 1523020Smpp * documentation and/or other materials provided with the distribution. 1623020Smpp * 3. All advertising materials mentioning features or use of this software 1723020Smpp * must display the following acknowledgement: 1823020Smpp * This product includes software developed by the University of 1923020Smpp * California, Berkeley and its contributors. 2023020Smpp * 4. Neither the name of the University nor the names of its contributors 2123020Smpp * may be used to endorse or promote products derived from this software 2223020Smpp * without specific prior written permission. 2323020Smpp * 2423020Smpp * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2523020Smpp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2623020Smpp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2750476Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2823020Smpp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29202445Sgavin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3053200Sphantom * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3179538Sru * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3223020Smpp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3323020Smpp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3431606Syokota * SUCH DAMAGE. 3531606Syokota * 3623020Smpp * @(#)nfsm_subs.h 8.1 (Berkeley) 6/16/93 3784306Sru * $Id: nfsm_subs.h,v 1.4 1994/10/02 17:27:05 phk Exp $ 3884306Sru */ 3923020Smpp 4031606Syokota#ifndef _NFS_NFSM_SUBS_H_ 4131606Syokota#define _NFS_NFSM_SUBS_H_ 4231606Syokota 4331606Syokota/* 4431606Syokota * These macros do strange and peculiar things to mbuf chains for 4531606Syokota * the assistance of the nfs code. To attempt to use them for any 4681251Sru * other purpose will be dangerous. (they make weird assumptions) 4781251Sru */ 4831606Syokota 4931606Syokota/* 5079727Sschweikh * First define what the actual subs. return 5131606Syokota */ 5231606Syokotaextern struct mbuf *nfsm_reqh(); 5331606Syokota 5431606Syokota#define M_HASCL(m) ((m)->m_flags & M_EXT) 5531606Syokota#define NFSMINOFF(m) \ 5631606Syokota if (M_HASCL(m)) \ 5731606Syokota (m)->m_data = (m)->m_ext.ext_buf; \ 5831606Syokota else if ((m)->m_flags & M_PKTHDR) \ 59141846Sru (m)->m_data = (m)->m_pktdat; \ 6031606Syokota else \ 6131606Syokota (m)->m_data = (m)->m_dat 6231606Syokota#define NFSMADV(m, s) (m)->m_data += (s) 6323020Smpp#define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \ 6431606Syokota (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN)) 6579727Sschweikh 6631606Syokota/* 6731606Syokota * Now for the macros that do the simple stuff and call the functions 6879727Sschweikh * for the hard stuff. 6979727Sschweikh * These macros use several vars. declared in nfsm_reqhead and these 7031606Syokota * vars. must not be used elsewhere unless you are careful not to corrupt 7131606Syokota * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries 7231606Syokota * that may be used so long as the value is not expected to retained 7331606Syokota * after a macro. 7479727Sschweikh * I know, this is kind of dorkey, but it makes the actual op functions 7579727Sschweikh * fairly clean and deals with the mess caused by the xdr discriminating 7631606Syokota * unions. 7731606Syokota */ 7831606Syokota 7979727Sschweikh#define nfsm_build(a,c,s) \ 8031606Syokota { if ((s) > M_TRAILINGSPACE(mb)) { \ 8131606Syokota MGET(mb2, M_WAIT, MT_DATA); \ 8231606Syokota if ((s) > MLEN) \ 8331606Syokota panic("build > MLEN"); \ 8431606Syokota mb->m_next = mb2; \ 8531606Syokota mb = mb2; \ 8631606Syokota mb->m_len = 0; \ 8731606Syokota bpos = mtod(mb, caddr_t); \ 8857676Ssheldonh } \ 8957676Ssheldonh (a) = (c)(bpos); \ 9031606Syokota mb->m_len += (s); \ 9131606Syokota bpos += (s); } 9231606Syokota 9331606Syokota#define nfsm_dissect(a,c,s) \ 9431606Syokota { t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 9579727Sschweikh if (t1 >= (s)) { \ 96205208Suqs (a) = (c)(dpos); \ 9731606Syokota dpos += (s); \ 9879727Sschweikh } else { \ 99205208Suqs error = nfsm_disct(&md, &dpos, (s), t1, &cp2); \ 10031606Syokota if (error) { \ 10179727Sschweikh m_freem(mrep); \ 102205208Suqs goto nfsmout; \ 103131530Sru } else { \ 10431606Syokota (a) = (c)cp2; \ 10531606Syokota } \ 10679727Sschweikh } } 107205208Suqs 108131530Sru#define nfsm_fhtom(v) \ 10931606Syokota nfsm_build(cp,caddr_t,NFSX_FH); \ 11031606Syokota bcopy((caddr_t)&(VTONFS(v)->n_fh), cp, NFSX_FH) 11131606Syokota 11231606Syokota#define nfsm_srvfhtom(f) \ 11331606Syokota nfsm_build(cp,caddr_t,NFSX_FH); \ 11431606Syokota bcopy((caddr_t)(f), cp, NFSX_FH) 11579727Sschweikh 11631606Syokota#define nfsm_mtofh(d,v) \ 11731606Syokota { struct nfsnode *np; nfsv2fh_t *fhp; \ 11831606Syokota nfsm_dissect(fhp,nfsv2fh_t *,NFSX_FH); \ 11931606Syokota error = nfs_nget((d)->v_mount, fhp, &np); \ 12031606Syokota if (error) { \ 12179727Sschweikh m_freem(mrep); \ 12279727Sschweikh goto nfsmout; \ 12379727Sschweikh } \ 12479727Sschweikh (v) = NFSTOV(np); \ 12531606Syokota nfsm_loadattr(v, (struct vattr *)0); \ 12631606Syokota } 12779727Sschweikh 12831606Syokota#define nfsm_loadattr(v,a) \ 12979727Sschweikh { struct vnode *tvp = (v); \ 13031606Syokota error = nfs_loadattrcache(&tvp, &md, &dpos, (a)); \ 13131606Syokota if (error) { \ 13231606Syokota m_freem(mrep); \ 13331606Syokota goto nfsmout; \ 13431606Syokota } \ 13531606Syokota (v) = tvp; } 13631606Syokota 13760748Shoek#define nfsm_strsiz(s,m) \ 13831606Syokota { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 13931606Syokota if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \ 14031606Syokota m_freem(mrep); \ 14131606Syokota error = EBADRPC; \ 14231606Syokota goto nfsmout; \ 14331606Syokota } } 14431606Syokota 14531606Syokota#define nfsm_srvstrsiz(s,m) \ 14631606Syokota { nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \ 14779727Sschweikh if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \ 148117011Sru error = EBADRPC; \ 149117011Sru nfsm_reply(0); \ 150205208Suqs } } 15131606Syokota 15231606Syokota#define nfsm_mtouio(p,s) \ 15331606Syokota if ((s) > 0 && \ 15431606Syokota (error = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \ 15531606Syokota m_freem(mrep); \ 15631606Syokota goto nfsmout; \ 15731606Syokota } 15831606Syokota 15931606Syokota#define nfsm_uiotom(p,s) \ 16031606Syokota error = nfsm_uiotombuf((p),&mb,(s),&bpos); \ 16131606Syokota if (error) { \ 16231606Syokota m_freem(mreq); \ 16331606Syokota goto nfsmout; \ 16431606Syokota } 16531606Syokota 166205208Suqs#define nfsm_reqhead(v,a,s) \ 16731606Syokota mb = mreq = nfsm_reqh((v),(a),(s),&bpos) 16831606Syokota 16931606Syokota#define nfsm_reqdone m_freem(mrep); \ 170205208Suqs nfsmout: 17131606Syokota 17271895Sru#define nfsm_rndup(a) (((a)+3)&(~0x3)) 17331606Syokota 17431606Syokota#define nfsm_request(v, t, p, c) \ 175205208Suqs error = nfs_request((v), mreq, (t), (p), \ 17631606Syokota (c), &mrep, &md, &dpos); \ 17731606Syokota if (error) \ 17831606Syokota goto nfsmout 17931606Syokota 18031606Syokota#define nfsm_strtom(a,s,m) \ 18131606Syokota if ((s) > (m)) { \ 18231606Syokota m_freem(mreq); \ 18331606Syokota error = ENAMETOOLONG; \ 18431606Syokota goto nfsmout; \ 185205208Suqs } \ 18679727Sschweikh t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \ 18731606Syokota if (t2 <= M_TRAILINGSPACE(mb)) { \ 18831606Syokota nfsm_build(tl,u_long *,t2); \ 18979727Sschweikh *tl++ = txdr_unsigned(s); \ 19031606Syokota *(tl+((t2>>2)-2)) = 0; \ 19179727Sschweikh bcopy((caddr_t)(a), (caddr_t)tl, (s)); \ 19231606Syokota } else { \ 19331606Syokota error = nfsm_strtmbuf(&mb, &bpos, (a), (s)); \ 19431606Syokota if (error) { \ 19531606Syokota m_freem(mreq); \ 196205208Suqs goto nfsmout; \ 19731606Syokota } \ 19831606Syokota } 19931606Syokota 20031606Syokota#define nfsm_srvdone \ 20131606Syokota nfsmout: \ 20231606Syokota return(error) 20331606Syokota 20431606Syokota#define nfsm_reply(s) \ 20531606Syokota { \ 20631606Syokota nfsd->nd_repstat = error; \ 20731606Syokota if (error) \ 20831606Syokota (void) nfs_rephead(0, nfsd, error, cache, &frev, \ 20931606Syokota mrq, &mb, &bpos); \ 21031606Syokota else \ 21131606Syokota (void) nfs_rephead((s), nfsd, error, cache, &frev, \ 21231606Syokota mrq, &mb, &bpos); \ 21331606Syokota m_freem(mrep); \ 21431606Syokota mreq = *mrq; \ 215205208Suqs if (error) \ 21679727Sschweikh return(0); \ 21731606Syokota } 21831606Syokota 21931606Syokota#define nfsm_adv(s) \ 22031606Syokota t1 = mtod(md, caddr_t)+md->m_len-dpos; \ 22131606Syokota if (t1 >= (s)) { \ 22231606Syokota dpos += (s); \ 22331606Syokota } else { \ 22431606Syokota error = nfs_adv(&md, &dpos, (s), t1); \ 225205208Suqs if (error) { \ 226205208Suqs m_freem(mrep); \ 22731606Syokota goto nfsmout; \ 22831606Syokota } \ 229205208Suqs } 230205208Suqs 23131606Syokota#define nfsm_srvmtofh(f) \ 23231606Syokota nfsm_dissect(tl, u_long *, NFSX_FH); \ 233205208Suqs bcopy((caddr_t)tl, (caddr_t)f, NFSX_FH) 23431606Syokota 23531606Syokota#define nfsm_clget \ 23631606Syokota if (bp >= be) { \ 237205208Suqs if (mp == mb) \ 23857676Ssheldonh mp->m_len += bp-bpos; \ 23957676Ssheldonh MGET(mp, M_WAIT, MT_DATA); \ 24031606Syokota MCLGET(mp, M_WAIT); \ 24131606Syokota mp->m_len = NFSMSIZ(mp); \ 24231606Syokota mp2->m_next = mp; \ 24331606Syokota mp2 = mp; \ 24431606Syokota bp = mtod(mp, caddr_t); \ 24531606Syokota be = bp+mp->m_len; \ 24631606Syokota } \ 24731606Syokota tl = (u_long *)bp 24831606Syokota 24931606Syokota#define nfsm_srvfillattr \ 250205208Suqs fp->fa_type = vtonfs_type(vap->va_type); \ 25131606Syokota fp->fa_mode = vtonfs_mode(vap->va_type, vap->va_mode); \ 25231606Syokota fp->fa_nlink = txdr_unsigned(vap->va_nlink); \ 253205208Suqs fp->fa_uid = txdr_unsigned(vap->va_uid); \ 25457676Ssheldonh fp->fa_gid = txdr_unsigned(vap->va_gid); \ 25557676Ssheldonh if (nfsd->nd_nqlflag == NQL_NOVAL) { \ 256205208Suqs fp->fa_nfsblocksize = txdr_unsigned(vap->va_blocksize); \ 25731606Syokota if (vap->va_type == VFIFO) \ 25860748Shoek fp->fa_nfsrdev = 0xffffffff; \ 25960748Shoek else \ 26031606Syokota fp->fa_nfsrdev = txdr_unsigned(vap->va_rdev); \ 26131606Syokota fp->fa_nfsfsid = txdr_unsigned(vap->va_fsid); \ 26231606Syokota fp->fa_nfsfileid = txdr_unsigned(vap->va_fileid); \ 26331606Syokota fp->fa_nfssize = txdr_unsigned(vap->va_size); \ 26431606Syokota fp->fa_nfsblocks = txdr_unsigned(vap->va_bytes / NFS_FABLKSIZE); \ 26531606Syokota txdr_nfstime(&vap->va_atime, &fp->fa_nfsatime); \ 266205208Suqs txdr_nfstime(&vap->va_mtime, &fp->fa_nfsmtime); \ 26757676Ssheldonh txdr_nfstime(&vap->va_ctime, &fp->fa_nfsctime); \ 26857676Ssheldonh } else { \ 26931606Syokota fp->fa_nqblocksize = txdr_unsigned(vap->va_blocksize); \ 27031606Syokota if (vap->va_type == VFIFO) \ 27131606Syokota fp->fa_nqrdev = 0xffffffff; \ 27231606Syokota else \ 27331606Syokota fp->fa_nqrdev = txdr_unsigned(vap->va_rdev); \ 27431606Syokota fp->fa_nqfsid = txdr_unsigned(vap->va_fsid); \ 27531606Syokota fp->fa_nqfileid = txdr_unsigned(vap->va_fileid); \ 27631606Syokota txdr_hyper(&vap->va_size, &fp->fa_nqsize); \ 27731606Syokota txdr_hyper(&vap->va_bytes, &fp->fa_nqbytes); \ 27831606Syokota txdr_nqtime(&vap->va_atime, &fp->fa_nqatime); \ 27931606Syokota txdr_nqtime(&vap->va_mtime, &fp->fa_nqmtime); \ 28031606Syokota txdr_nqtime(&vap->va_ctime, &fp->fa_nqctime); \ 28131606Syokota fp->fa_nqflags = txdr_unsigned(vap->va_flags); \ 28231606Syokota fp->fa_nqgen = txdr_unsigned(vap->va_gen); \ 28353054Syokota txdr_hyper(&vap->va_filerev, &fp->fa_nqfilerev); \ 28479727Sschweikh } 28531606Syokota 28631606Syokota#endif 28731606Syokota