added my responsibility for the `cpm' port
[unix-history] / sys / nfs / nfsm_subs.h
CommitLineData
15637ed4
RG
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 *
a8599e88 36 * From: @(#)nfsm_subs.h 7.11 (Berkeley) 4/16/91
fde1aeb2 37 * $Id: nfsm_subs.h,v 1.2 1993/09/09 22:06:21 rgrimes Exp $
15637ed4
RG
38 */
39
a8599e88
RG
40#ifndef __h_nfsm_subs
41#define __h_nfsm_subs 1
42
15637ed4
RG
43/*
44 * These macros do strange and peculiar things to mbuf chains for
45 * the assistance of the nfs code. To attempt to use them for any
46 * other purpose will be dangerous. (they make weird assumptions)
47 */
48
49/*
50 * First define what the actual subs. return
51 */
52extern struct mbuf *nfsm_reqh();
53
54#define M_HASCL(m) ((m)->m_flags & M_EXT)
55#define NFSMGETHDR(m) \
56 MGETHDR(m, M_WAIT, MT_DATA); \
57 (m)->m_pkthdr.len = 0; \
58 (m)->m_pkthdr.rcvif = (struct ifnet *)0
59#define NFSMINOFF(m) \
60 if (M_HASCL(m)) \
61 (m)->m_data = (m)->m_ext.ext_buf; \
62 else \
63 (m)->m_data = (m)->m_dat
64#define NFSMADV(m, s) (m)->m_data += (s)
65#define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \
66 (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN))
67
68/*
69 * Now for the macros that do the simple stuff and call the functions
70 * for the hard stuff.
71 * These macros use several vars. declared in nfsm_reqhead and these
72 * vars. must not be used elsewhere unless you are careful not to corrupt
73 * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries
74 * that may be used so long as the value is not expected to retained
75 * after a macro.
76 * I know, this is kind of dorkey, but it makes the actual op functions
77 * fairly clean and deals with the mess caused by the xdr discriminating
78 * unions.
79 */
80
81#ifndef lint
82#define nfsm_build(a,c,s) \
83 t1 = NFSMSIZ(mb); \
84 if ((s) > (t1-mb->m_len)) { \
85 MGET(mb2, M_WAIT, MT_DATA); \
86 if ((s) > MLEN) \
87 panic("build > MLEN"); \
88 mb->m_next = mb2; \
89 mb = mb2; \
90 mb->m_len = 0; \
91 bpos = mtod(mb, caddr_t); \
92 } \
93 (a) = (c)(bpos); \
94 mb->m_len += (s); \
95 bpos += (s)
96#else /* lint */
97#define nfsm_build(a,c,s) \
98 t1 = NFSMSIZ(mb); \
99 if ((s) > (t1-mb->m_len)) { \
100 MGET(mb2, M_WAIT, MT_DATA); \
101 mb->m_next = mb2; \
102 mb = mb2; \
103 mb->m_len = 0; \
104 bpos = mtod(mb, caddr_t); \
105 } \
106 (a) = (c)(bpos); \
107 mb->m_len += (s); \
108 bpos += (s)
109#endif /* lint */
110
111#define nfsm_disect(a,c,s) \
112 t1 = mtod(md, caddr_t)+md->m_len-dpos; \
113 if (t1 >= (s)) { \
114 (a) = (c)(dpos); \
115 dpos += (s); \
116 } else if (error = nfsm_disct(&md, &dpos, (s), t1, TRUE, &cp2)) { \
117 m_freem(mrep); \
118 goto nfsmout; \
119 } else { \
120 (a) = (c)cp2; \
121 }
122
123#define nfsm_disecton(a,c,s) \
124 t1 = mtod(md, caddr_t)+md->m_len-dpos; \
125 if (t1 >= (s)) { \
126 (a) = (c)(dpos); \
127 dpos += (s); \
128 } else if (error = nfsm_disct(&md, &dpos, (s), t1, FALSE, &cp2)) { \
129 m_freem(mrep); \
130 goto nfsmout; \
131 } else { \
132 (a) = (c)cp2; \
133 }
134
135#define nfsm_fhtom(v) \
136 nfsm_build(cp,caddr_t,NFSX_FH); \
137 bcopy((caddr_t)&(VTONFS(v)->n_fh), cp, NFSX_FH)
138
139#define nfsm_srvfhtom(f) \
140 nfsm_build(cp,caddr_t,NFSX_FH); \
141 bcopy((caddr_t)(f), cp, NFSX_FH)
142
143#define nfsm_mtofh(d,v) \
144 { struct nfsnode *np; nfsv2fh_t *fhp; \
145 nfsm_disect(fhp,nfsv2fh_t *,NFSX_FH); \
146 if (error = nfs_nget((d)->v_mount, fhp, &np)) { \
147 m_freem(mrep); \
148 goto nfsmout; \
149 } \
150 (v) = NFSTOV(np); \
151 nfsm_loadattr(v, (struct vattr *)0); \
152 }
153
154#define nfsm_loadattr(v,a) \
155 { struct vnode *tvp = (v); \
156 if (error = nfs_loadattrcache(&tvp, &md, &dpos, (a))) { \
157 m_freem(mrep); \
158 goto nfsmout; \
159 } \
160 (v) = tvp; }
161
162#define nfsm_strsiz(s,m) \
163 nfsm_disect(tl,u_long *,NFSX_UNSIGNED); \
164 if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \
165 m_freem(mrep); \
166 error = EBADRPC; \
167 goto nfsmout; \
168 }
169
170#define nfsm_srvstrsiz(s,m) \
171 nfsm_disect(tl,u_long *,NFSX_UNSIGNED); \
172 if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \
173 error = EBADRPC; \
174 nfsm_reply(0); \
175 }
176
177#define nfsm_mtouio(p,s) \
178 if ((s) > 0 && \
179 (error = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \
180 m_freem(mrep); \
181 goto nfsmout; \
182 }
183
184#define nfsm_uiotom(p,s) \
185 if (error = nfsm_uiotombuf((p),&mb,(s),&bpos)) { \
186 m_freem(mreq); \
187 goto nfsmout; \
188 }
189
190#define nfsm_reqhead(a,c,s) \
191 if ((mreq = nfsm_reqh(nfs_prog,nfs_vers,(a),(c),(s),&bpos,&mb,&xid)) == NULL) { \
192 error = ENOBUFS; \
193 goto nfsmout; \
194 }
195
196#define nfsm_reqdone m_freem(mrep); \
197 nfsmout:
198
199#define nfsm_rndup(a) (((a)+3)&(~0x3))
200
201#define nfsm_request(v, t, p, h) \
202 if (error = nfs_request((v), mreq, xid, (t), (p), (h), \
203 (v)->v_mount, &mrep, &md, &dpos)) \
204 goto nfsmout
205
206#define nfsm_strtom(a,s,m) \
207 if ((s) > (m)) { \
208 m_freem(mreq); \
209 error = ENAMETOOLONG; \
210 goto nfsmout; \
211 } \
212 t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \
213 if(t2<=(NFSMSIZ(mb)-mb->m_len)){ \
214 nfsm_build(tl,u_long *,t2); \
215 *tl++ = txdr_unsigned(s); \
216 *(tl+((t2>>2)-2)) = 0; \
217 bcopy((caddr_t)(a), (caddr_t)tl, (s)); \
218 } else if (error = nfsm_strtmbuf(&mb, &bpos, (a), (s))) { \
219 m_freem(mreq); \
220 goto nfsmout; \
221 }
222
223#define nfsm_srvdone \
224 nfsmout: \
225 return(error)
226
227#ifndef lint
228#define nfsm_reply(s) \
229 { \
230 *repstat = error; \
231 if (error) \
232 nfs_rephead(0, xid, error, mrq, &mb, &bpos); \
233 else \
234 nfs_rephead((s), xid, error, mrq, &mb, &bpos); \
235 m_freem(mrep); \
236 mreq = *mrq; \
237 if (error) \
238 return(0); \
239 }
240#else /* lint */
241#define nfsm_reply(s) \
242 { \
243 *repstat = error; \
244 if (error) \
245 nfs_rephead(0, xid, error, mrq, &mb, &bpos); \
246 else \
247 nfs_rephead((s), xid, error, mrq, &mb, &bpos); \
248 m_freem(mrep); \
249 mreq = *mrq; \
250 mrep = mreq; \
251 if (error) \
252 return(0); \
253 }
254#endif /* lint */
255
256#define nfsm_adv(s) \
257 t1 = mtod(md, caddr_t)+md->m_len-dpos; \
258 if (t1 >= (s)) { \
259 dpos += (s); \
260 } else if (error = nfs_adv(&md, &dpos, (s), t1)) { \
261 m_freem(mrep); \
262 goto nfsmout; \
263 }
264
265#define nfsm_srvmtofh(f) \
266 nfsm_disecton(tl, u_long *, NFSX_FH); \
267 bcopy((caddr_t)tl, (caddr_t)f, NFSX_FH)
268
269#define nfsm_clget \
270 if (bp >= be) { \
271 MGET(mp, M_WAIT, MT_DATA); \
272 MCLGET(mp, M_WAIT); \
273 mp->m_len = NFSMSIZ(mp); \
274 if (mp3 == NULL) \
275 mp3 = mp2 = mp; \
276 else { \
277 mp2->m_next = mp; \
278 mp2 = mp; \
279 } \
280 bp = mtod(mp, caddr_t); \
281 be = bp+mp->m_len; \
282 } \
283 tl = (u_long *)bp
284
285#define nfsm_srvfillattr \
286 fp->fa_type = vtonfs_type(vap->va_type); \
287 fp->fa_mode = vtonfs_mode(vap->va_type, vap->va_mode); \
288 fp->fa_nlink = txdr_unsigned(vap->va_nlink); \
289 fp->fa_uid = txdr_unsigned(vap->va_uid); \
290 fp->fa_gid = txdr_unsigned(vap->va_gid); \
291 fp->fa_size = txdr_unsigned(vap->va_size); \
292 fp->fa_blocksize = txdr_unsigned(vap->va_blocksize); \
293 if (vap->va_type == VFIFO) \
fde1aeb2 294 fp->fa_rdev = 0xffffffffUL; \
15637ed4
RG
295 else \
296 fp->fa_rdev = txdr_unsigned(vap->va_rdev); \
297 fp->fa_blocks = txdr_unsigned(vap->va_bytes / NFS_FABLKSIZE); \
298 fp->fa_fsid = txdr_unsigned(vap->va_fsid); \
299 fp->fa_fileid = txdr_unsigned(vap->va_fileid); \
300 fp->fa_atime.tv_sec = txdr_unsigned(vap->va_atime.tv_sec); \
301 fp->fa_atime.tv_usec = txdr_unsigned(vap->va_flags); \
302 txdr_time(&vap->va_mtime, &fp->fa_mtime); \
303 fp->fa_ctime.tv_sec = txdr_unsigned(vap->va_ctime.tv_sec); \
304 fp->fa_ctime.tv_usec = txdr_unsigned(vap->va_gen)
305
fde1aeb2 306#ifdef KERNEL
a8599e88
RG
307struct nfsmount;
308
309void nfs_updatetimer __P((struct nfsmount *));
310void nfs_backofftimer __P((struct nfsmount *));
311int nfs_sigintr __P((struct proc *));
312void nfs_msg __P((struct proc *, const char *, const char *));
313void nfs_solock __P((int *));
314void nfs_sounlock __P((int *));
315int nfs_netaddr_match __P((struct mbuf *, struct mbuf *));
316int nfs_badnam __P((struct mbuf *, struct mbuf *, struct mbuf *));
317
fde1aeb2
GW
318extern int nfs_rephead(int, u_long, int, struct mbuf **, struct mbuf **,
319 caddr_t *);
320extern struct mbuf *nfsm_reqh(u_long, u_long, u_long, struct ucred *, int,
321 caddr_t *, struct mbuf **, u_long *);
322extern int nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *);
323extern int nfsm_uiotombuf(struct uio *, struct mbuf **, int, caddr_t *);
324extern int nfsm_disct(struct mbuf **, caddr_t *, int, int, int, caddr_t *);
325extern int nfs_adv(struct mbuf **, caddr_t *, int, int);
326extern int nfsm_strtmbuf(struct mbuf **, char **, char *, long);
327extern void nfs_init(void);
328extern void nfsm_adj(struct mbuf *, int, int);
329extern struct mbuf *nfs_compress(struct mbuf *);
330extern struct mbuf *nfs_uncompress(struct mbuf *);
a8599e88 331
fde1aeb2
GW
332extern int nfs_request(struct vnode *, struct mbuf *, u_long, int,
333 struct proc *, int, struct mount *, struct mbuf **,
334 struct mbuf **, caddr_t *);
335struct nfsreq;
336extern int nfs_receive(struct socket *, struct mbuf **, struct mbuf **,
337 struct nfsreq *);
338extern int nfs_send(struct socket *, struct mbuf *, struct mbuf *,
339 struct nfsreq *);
340extern int nfs_getreq(struct socket *so, u_long, u_long, int, struct mbuf **,
341 struct mbuf **, struct mbuf **, caddr_t *, u_long *,
342 u_long *, struct ucred *, struct mbuf *, struct mbuf *,
343 int *, int *);
344extern int nfs_netaddr_match(struct mbuf *, struct mbuf *);
345extern int nfs_badnam(struct mbuf *, struct mbuf *, struct mbuf *);
346
347#endif /* KERNEL */
a8599e88 348#endif /* __h_nfsm_subs */