|
|
1.1 root 1: /*
2: * Copyright (c) 1989 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Rick Macklem at The University of Guelph.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by the University of
19: * California, Berkeley and its contributors.
20: * 4. Neither the name of the University nor the names of its contributors
21: * may be used to endorse or promote products derived from this software
22: * without specific prior written permission.
23: *
24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34: * SUCH DAMAGE.
35: *
36: * @(#)nfsm_subs.h 7.11 (Berkeley) 4/16/91
37: */
38:
39: /*
40: * These macros do strange and peculiar things to mbuf chains for
41: * the assistance of the nfs code. To attempt to use them for any
42: * other purpose will be dangerous. (they make weird assumptions)
43: */
44:
45: /*
46: * First define what the actual subs. return
47: */
48: extern struct mbuf *nfsm_reqh();
49:
50: #define M_HASCL(m) ((m)->m_flags & M_EXT)
51: #define NFSMGETHDR(m) \
52: MGETHDR(m, M_WAIT, MT_DATA); \
53: (m)->m_pkthdr.len = 0; \
54: (m)->m_pkthdr.rcvif = (struct ifnet *)0
55: #define NFSMINOFF(m) \
56: if (M_HASCL(m)) \
57: (m)->m_data = (m)->m_ext.ext_buf; \
58: else \
59: (m)->m_data = (m)->m_dat
60: #define NFSMADV(m, s) (m)->m_data += (s)
61: #define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \
62: (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN))
63:
64: /*
65: * Now for the macros that do the simple stuff and call the functions
66: * for the hard stuff.
67: * These macros use several vars. declared in nfsm_reqhead and these
68: * vars. must not be used elsewhere unless you are careful not to corrupt
69: * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries
70: * that may be used so long as the value is not expected to retained
71: * after a macro.
72: * I know, this is kind of dorkey, but it makes the actual op functions
73: * fairly clean and deals with the mess caused by the xdr discriminating
74: * unions.
75: */
76:
77: #ifndef lint
78: #define nfsm_build(a,c,s) \
79: t1 = NFSMSIZ(mb); \
80: if ((s) > (t1-mb->m_len)) { \
81: MGET(mb2, M_WAIT, MT_DATA); \
82: if ((s) > MLEN) \
83: panic("build > MLEN"); \
84: mb->m_next = mb2; \
85: mb = mb2; \
86: mb->m_len = 0; \
87: bpos = mtod(mb, caddr_t); \
88: } \
89: (a) = (c)(bpos); \
90: mb->m_len += (s); \
91: bpos += (s)
92: #else /* lint */
93: #define nfsm_build(a,c,s) \
94: t1 = NFSMSIZ(mb); \
95: if ((s) > (t1-mb->m_len)) { \
96: MGET(mb2, M_WAIT, MT_DATA); \
97: mb->m_next = mb2; \
98: mb = mb2; \
99: mb->m_len = 0; \
100: bpos = mtod(mb, caddr_t); \
101: } \
102: (a) = (c)(bpos); \
103: mb->m_len += (s); \
104: bpos += (s)
105: #endif /* lint */
106:
107: #define nfsm_disect(a,c,s) \
108: t1 = mtod(md, caddr_t)+md->m_len-dpos; \
109: if (t1 >= (s)) { \
110: (a) = (c)(dpos); \
111: dpos += (s); \
112: } else if (error = nfsm_disct(&md, &dpos, (s), t1, TRUE, &cp2)) { \
113: m_freem(mrep); \
114: goto nfsmout; \
115: } else { \
116: (a) = (c)cp2; \
117: }
118:
119: #define nfsm_disecton(a,c,s) \
120: t1 = mtod(md, caddr_t)+md->m_len-dpos; \
121: if (t1 >= (s)) { \
122: (a) = (c)(dpos); \
123: dpos += (s); \
124: } else if (error = nfsm_disct(&md, &dpos, (s), t1, FALSE, &cp2)) { \
125: m_freem(mrep); \
126: goto nfsmout; \
127: } else { \
128: (a) = (c)cp2; \
129: }
130:
131: #define nfsm_fhtom(v) \
132: nfsm_build(cp,caddr_t,NFSX_FH); \
133: bcopy((caddr_t)&(VTONFS(v)->n_fh), cp, NFSX_FH)
134:
135: #define nfsm_srvfhtom(f) \
136: nfsm_build(cp,caddr_t,NFSX_FH); \
137: bcopy((caddr_t)(f), cp, NFSX_FH)
138:
139: #define nfsm_mtofh(d,v) \
140: { struct nfsnode *np; nfsv2fh_t *fhp; \
141: nfsm_disect(fhp,nfsv2fh_t *,NFSX_FH); \
142: if (error = nfs_nget((d)->v_mount, fhp, &np)) { \
143: m_freem(mrep); \
144: goto nfsmout; \
145: } \
146: (v) = NFSTOV(np); \
147: nfsm_loadattr(v, (struct vattr *)0); \
148: }
149:
150: #define nfsm_loadattr(v,a) \
151: { struct vnode *tvp = (v); \
152: if (error = nfs_loadattrcache(&tvp, &md, &dpos, (a))) { \
153: m_freem(mrep); \
154: goto nfsmout; \
155: } \
156: (v) = tvp; }
157:
158: #define nfsm_strsiz(s,m) \
159: nfsm_disect(tl,u_long *,NFSX_UNSIGNED); \
160: if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \
161: m_freem(mrep); \
162: error = EBADRPC; \
163: goto nfsmout; \
164: }
165:
166: #define nfsm_srvstrsiz(s,m) \
167: nfsm_disect(tl,u_long *,NFSX_UNSIGNED); \
168: if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \
169: error = EBADRPC; \
170: nfsm_reply(0); \
171: }
172:
173: #define nfsm_mtouio(p,s) \
174: if ((s) > 0 && \
175: (error = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \
176: m_freem(mrep); \
177: goto nfsmout; \
178: }
179:
180: #define nfsm_uiotom(p,s) \
181: if (error = nfsm_uiotombuf((p),&mb,(s),&bpos)) { \
182: m_freem(mreq); \
183: goto nfsmout; \
184: }
185:
186: #define nfsm_reqhead(a,c,s) \
187: if ((mreq = nfsm_reqh(nfs_prog,nfs_vers,(a),(c),(s),&bpos,&mb,&xid)) == NULL) { \
188: error = ENOBUFS; \
189: goto nfsmout; \
190: }
191:
192: #define nfsm_reqdone m_freem(mrep); \
193: nfsmout:
194:
195: #define nfsm_rndup(a) (((a)+3)&(~0x3))
196:
197: #define nfsm_request(v, t, p, h) \
198: if (error = nfs_request((v), mreq, xid, (t), (p), (h), \
199: (v)->v_mount, &mrep, &md, &dpos)) \
200: goto nfsmout
201:
202: #define nfsm_strtom(a,s,m) \
203: if ((s) > (m)) { \
204: m_freem(mreq); \
205: error = ENAMETOOLONG; \
206: goto nfsmout; \
207: } \
208: t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \
209: if(t2<=(NFSMSIZ(mb)-mb->m_len)){ \
210: nfsm_build(tl,u_long *,t2); \
211: *tl++ = txdr_unsigned(s); \
212: *(tl+((t2>>2)-2)) = 0; \
213: bcopy((caddr_t)(a), (caddr_t)tl, (s)); \
214: } else if (error = nfsm_strtmbuf(&mb, &bpos, (a), (s))) { \
215: m_freem(mreq); \
216: goto nfsmout; \
217: }
218:
219: #define nfsm_srvdone \
220: nfsmout: \
221: return(error)
222:
223: #ifndef lint
224: #define nfsm_reply(s) \
225: { \
226: *repstat = error; \
227: if (error) \
228: nfs_rephead(0, xid, error, mrq, &mb, &bpos); \
229: else \
230: nfs_rephead((s), xid, error, mrq, &mb, &bpos); \
231: m_freem(mrep); \
232: mreq = *mrq; \
233: if (error) \
234: return(0); \
235: }
236: #else /* lint */
237: #define nfsm_reply(s) \
238: { \
239: *repstat = error; \
240: if (error) \
241: nfs_rephead(0, xid, error, mrq, &mb, &bpos); \
242: else \
243: nfs_rephead((s), xid, error, mrq, &mb, &bpos); \
244: m_freem(mrep); \
245: mreq = *mrq; \
246: mrep = mreq; \
247: if (error) \
248: return(0); \
249: }
250: #endif /* lint */
251:
252: #define nfsm_adv(s) \
253: t1 = mtod(md, caddr_t)+md->m_len-dpos; \
254: if (t1 >= (s)) { \
255: dpos += (s); \
256: } else if (error = nfs_adv(&md, &dpos, (s), t1)) { \
257: m_freem(mrep); \
258: goto nfsmout; \
259: }
260:
261: #define nfsm_srvmtofh(f) \
262: nfsm_disecton(tl, u_long *, NFSX_FH); \
263: bcopy((caddr_t)tl, (caddr_t)f, NFSX_FH)
264:
265: #define nfsm_clget \
266: if (bp >= be) { \
267: MGET(mp, M_WAIT, MT_DATA); \
268: MCLGET(mp, M_WAIT); \
269: mp->m_len = NFSMSIZ(mp); \
270: if (mp3 == NULL) \
271: mp3 = mp2 = mp; \
272: else { \
273: mp2->m_next = mp; \
274: mp2 = mp; \
275: } \
276: bp = mtod(mp, caddr_t); \
277: be = bp+mp->m_len; \
278: } \
279: tl = (u_long *)bp
280:
281: #define nfsm_srvfillattr \
282: fp->fa_type = vtonfs_type(vap->va_type); \
283: fp->fa_mode = vtonfs_mode(vap->va_type, vap->va_mode); \
284: fp->fa_nlink = txdr_unsigned(vap->va_nlink); \
285: fp->fa_uid = txdr_unsigned(vap->va_uid); \
286: fp->fa_gid = txdr_unsigned(vap->va_gid); \
287: fp->fa_size = txdr_unsigned(vap->va_size); \
288: fp->fa_blocksize = txdr_unsigned(vap->va_blocksize); \
289: if (vap->va_type == VFIFO) \
290: fp->fa_rdev = 0xffffffff; \
291: else \
292: fp->fa_rdev = txdr_unsigned(vap->va_rdev); \
293: fp->fa_blocks = txdr_unsigned(vap->va_bytes / NFS_FABLKSIZE); \
294: fp->fa_fsid = txdr_unsigned(vap->va_fsid); \
295: fp->fa_fileid = txdr_unsigned(vap->va_fileid); \
296: fp->fa_atime.tv_sec = txdr_unsigned(vap->va_atime.tv_sec); \
297: fp->fa_atime.tv_usec = txdr_unsigned(vap->va_flags); \
298: txdr_time(&vap->va_mtime, &fp->fa_mtime); \
299: fp->fa_ctime.tv_sec = txdr_unsigned(vap->va_ctime.tv_sec); \
300: fp->fa_ctime.tv_usec = txdr_unsigned(vap->va_gen)
301:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.