Annotation of sys/compat/hpux/m68k/hpux_net.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: hpux_net.c,v 1.1 2004/07/09 21:33:45 mickey Exp $ */
2: /* $NetBSD: hpux_net.c,v 1.14 1997/04/01 19:59:02 scottr Exp $ */
3:
4: /*
5: * Copyright (c) 1988 University of Utah.
6: * Copyright (c) 1990, 1993
7: * The Regents of the University of California. All rights reserved.
8: *
9: * This code is derived from software contributed to Berkeley by
10: * the Systems Programming Group of the University of Utah Computer
11: * Science Department.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. Neither the name of the University nor the names of its contributors
22: * may be used to endorse or promote products derived from this software
23: * without specific prior written permission.
24: *
25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35: * SUCH DAMAGE.
36: *
37: * from: Utah $Hdr: hpux_net.c 1.8 93/08/02$
38: *
39: * @(#)hpux_net.c 8.2 (Berkeley) 9/9/93
40: */
41:
42: /*
43: * Network related HP-UX compatibility routines
44: */
45:
46: #include <sys/param.h>
47: #include <sys/systm.h>
48: #include <sys/kernel.h>
49: #include <sys/time.h>
50: #include <sys/errno.h>
51: #include <sys/proc.h>
52: #include <sys/file.h>
53: #include <sys/filedesc.h>
54: #include <sys/mbuf.h>
55: #include <sys/mount.h>
56: #include <sys/socket.h>
57: #include <sys/socketvar.h>
58: #include <sys/uio.h>
59: #include <sys/ktrace.h>
60: #include <sys/syscallargs.h>
61:
62: #include <compat/hpux/hpux.h>
63: #include <compat/hpux/hpux_util.h>
64: #include <compat/hpux/m68k/hpux_syscallargs.h>
65:
66: struct hpux_sys_getsockopt_args {
67: syscallarg(int) s;
68: syscallarg(int) level;
69: syscallarg(int) name;
70: syscallarg(caddr_t) val;
71: syscallarg(int *) avalsize;
72: };
73:
74: int hpux_sys_setsockopt2(struct proc *, void *, register_t *);
75: int hpux_sys_getsockopt(struct proc *, void *, register_t *);
76:
77: void socksetsize(int, struct mbuf *);
78:
79:
80: #define MINBSDIPCCODE 0x3EE
81: #define NUMBSDIPC 32
82:
83: /*
84: * HPUX netioctl() to BSD syscall map.
85: * Indexed by callno - MINBSDIPCCODE
86: */
87:
88: struct hpuxtobsdipc {
89: int (*rout)(struct proc *, void *, register_t *);
90: int nargs;
91: } hpuxtobsdipc[NUMBSDIPC] = {
92: { sys_socket, 3 }, /* 3ee */
93: { sys_listen, 2 }, /* 3ef */
94: { sys_bind, 3 }, /* 3f0 */
95: { compat_43_sys_accept, 3 }, /* 3f1 */
96: { sys_connect, 3 }, /* 3f2 */
97: { compat_43_sys_recv, 4 }, /* 3f3 */
98: { compat_43_sys_send, 4 }, /* 3f4 */
99: { sys_shutdown, 2 }, /* 3f5 */
100: { compat_43_sys_getsockname, 3 }, /* 3f6 */
101: { hpux_sys_setsockopt2, 5 }, /* 3f7 */
102: { sys_sendto, 6 }, /* 3f8 */
103: { compat_43_sys_recvfrom, 6 }, /* 3f9 */
104: { compat_43_sys_getpeername, 3 }, /* 3fa */
105: { NULL, 0 }, /* 3fb */
106: { NULL, 0 }, /* 3fc */
107: { NULL, 0 }, /* 3fd */
108: { NULL, 0 }, /* 3fe */
109: { NULL, 0 }, /* 3ff */
110: { NULL, 0 }, /* 400 */
111: { NULL, 0 }, /* 401 */
112: { NULL, 0 }, /* 402 */
113: { NULL, 0 }, /* 403 */
114: { NULL, 0 }, /* 404 */
115: { NULL, 0 }, /* 405 */
116: { NULL, 0 }, /* 406 */
117: { NULL, 0 }, /* 407 */
118: { NULL, 0 }, /* 408 */
119: { NULL, 0 }, /* 409 */
120: { NULL, 0 }, /* 40a */
121: { hpux_sys_getsockopt, 5 }, /* 40b */
122: { NULL, 0 }, /* 40c */
123: { NULL, 0 }, /* 40d */
124: };
125:
126: /*
127: * Single system call entry to BSD style IPC.
128: * Gleened from disassembled libbsdipc.a syscall entries.
129: */
130: int
131: hpux_sys_netioctl(p, v, retval)
132: struct proc *p;
133: void *v;
134: register_t *retval;
135: {
136: struct hpux_sys_netioctl_args *uap = v;
137: int *args, i;
138: int code;
139: int error;
140:
141: args = SCARG(uap, args);
142: code = SCARG(uap, call) - MINBSDIPCCODE;
143: if (code < 0 || code >= NUMBSDIPC || hpuxtobsdipc[code].rout == NULL)
144: return (EINVAL);
145: if ((i = hpuxtobsdipc[code].nargs * sizeof (int)) &&
146: (error = copyin((caddr_t)args, (caddr_t)uap, (u_int)i))) {
147: #ifdef KTRACE
148: if (KTRPOINT(p, KTR_SYSCALL))
149: ktrsyscall(p, code + MINBSDIPCCODE,
150: hpuxtobsdipc[code].nargs,
151: (register_t *)uap);
152: #endif
153: return (error);
154: }
155: #ifdef KTRACE
156: if (KTRPOINT(p, KTR_SYSCALL))
157: ktrsyscall(p, code + MINBSDIPCCODE,
158: hpuxtobsdipc[code].nargs,
159: (register_t *)uap);
160: #endif
161: return ((*hpuxtobsdipc[code].rout)(p, uap, retval));
162: }
163:
164: void
165: socksetsize(size, m)
166: int size;
167: struct mbuf *m;
168: {
169: int tmp;
170:
171: if (size < sizeof(int)) {
172: switch(size) {
173: case 1:
174: tmp = (int) *mtod(m, char *);
175: break;
176: case 2:
177: tmp = (int) *mtod(m, short *);
178: break;
179: case 3:
180: default: /* XXX uh, what if sizeof(int) > 4? */
181: tmp = (((int) *mtod(m, int *)) >> 8) & 0xffffff;
182: break;
183: }
184: *mtod(m, int *) = tmp;
185: m->m_len = sizeof(int);
186: } else {
187: m->m_len = size;
188: }
189: }
190:
191: /* ARGSUSED */
192: int
193: hpux_sys_setsockopt2(p, v, retval)
194: struct proc *p;
195: void *v;
196: register_t *retval;
197: {
198: struct hpux_sys_setsockopt_args *uap = v;
199: struct file *fp;
200: struct mbuf *m = NULL;
201: int tmp, error;
202:
203: if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
204: return (error);
205: if (SCARG(uap, valsize) > MLEN) {
206: error = EINVAL;
207: goto bad;
208: }
209: if (SCARG(uap, val)) {
210: m = m_get(M_WAIT, MT_SOOPTS);
211: if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
212: (u_int)SCARG(uap, valsize)))) {
213: (void) m_free(m);
214: goto bad;
215: }
216: if (SCARG(uap, name) == SO_LINGER) {
217: tmp = *mtod(m, int *);
218: mtod(m, struct linger *)->l_onoff = 1;
219: mtod(m, struct linger *)->l_linger = tmp;
220: m->m_len = sizeof(struct linger);
221: } else
222: socksetsize(SCARG(uap, valsize), m);
223: } else if (SCARG(uap, name) == ~SO_LINGER) {
224: m = m_get(M_WAIT, MT_SOOPTS);
225: SCARG(uap, name) = SO_LINGER;
226: mtod(m, struct linger *)->l_onoff = 0;
227: m->m_len = sizeof(struct linger);
228: }
229: error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
230: SCARG(uap, name), m);
231: bad:
232: FRELE(fp);
233: return (error);
234: }
235:
236: /* ARGSUSED */
237: int
238: hpux_sys_setsockopt(p, v, retval)
239: struct proc *p;
240: void *v;
241: register_t *retval;
242: {
243: struct hpux_sys_setsockopt_args *uap = v;
244: struct file *fp;
245: struct mbuf *m = NULL;
246: int error;
247:
248: if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
249: return (error);
250: if (SCARG(uap, valsize) > MLEN) {
251: error = EINVAL;
252: goto bad;
253: }
254: if (SCARG(uap, val)) {
255: m = m_get(M_WAIT, MT_SOOPTS);
256: if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
257: (u_int)SCARG(uap, valsize)))) {
258: m_free(m);
259: goto bad;
260: }
261: socksetsize(SCARG(uap, valsize), m);
262: }
263: error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
264: SCARG(uap, name), m);
265: bad:
266: FRELE(fp);
267: return (error);
268: }
269:
270: int
271: hpux_sys_getsockopt(p, v, retval)
272: struct proc *p;
273: void *v;
274: register_t *retval;
275: {
276: struct hpux_sys_getsockopt_args *uap = v;
277: struct file *fp;
278: struct mbuf *m = NULL;
279: int valsize, error;
280:
281: if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
282: return (error);
283: if (SCARG(uap, val)) {
284: if ((error = copyin((caddr_t)SCARG(uap, avalsize),
285: (caddr_t)&valsize, sizeof (valsize)))) {
286: goto bad;
287: }
288: } else
289: valsize = 0;
290: if ((error = sogetopt((struct socket *)fp->f_data, SCARG(uap, level),
291: SCARG(uap, name), &m)))
292: goto bad;
293: if (SCARG(uap, val) && valsize && m != NULL) {
294: if (SCARG(uap, name) == SO_LINGER) {
295: if (mtod(m, struct linger *)->l_onoff)
296: *mtod(m, int *) = mtod(m, struct linger *)->l_linger;
297: else
298: *mtod(m, int *) = 0;
299: m->m_len = sizeof(int);
300: }
301: if (valsize > m->m_len)
302: valsize = m->m_len;
303: error = copyout(mtod(m, caddr_t), SCARG(uap, val),
304: (u_int)valsize);
305: if (error == 0)
306: error = copyout((caddr_t)&valsize,
307: (caddr_t)SCARG(uap, avalsize), sizeof (valsize));
308: }
309: bad:
310: FRELE(fp);
311: if (m != NULL)
312: m_free(m);
313: return (error);
314: }
CVSweb