]> git.saurik.com Git - apple/xnu.git/blame - bsd/netat/sys_dep.c
xnu-517.3.15.tar.gz
[apple/xnu.git] / bsd / netat / sys_dep.c
CommitLineData
1c79356b
A
1/*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
43866e37 6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
1c79356b 7 *
43866e37
A
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
1c79356b
A
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
43866e37
A
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
1c79356b
A
22 *
23 * @APPLE_LICENSE_HEADER_END@
24 */
25/*
26 * Copyright (c) 1995-1998 Apple Computer, Inc.
27 *
28 * Change Log:
29 * Created February 20, 1995 by Tuyen Nguyen
30 * Modified for MP, 1996 by Tuyen Nguyen
31 * Modified, March 17, 1997 by Tuyen Nguyen for MacOSX.
32 */
33#include <sys/errno.h>
34#include <sys/types.h>
35#include <sys/param.h>
36#include <machine/spl.h>
37#include <sys/systm.h>
38#include <sys/kernel.h>
39#include <sys/proc.h>
40#include <sys/filedesc.h>
41#include <sys/fcntl.h>
42#include <sys/mbuf.h>
43#include <sys/malloc.h>
44#include <sys/file.h>
45#include <sys/socket.h>
46#include <sys/socketvar.h>
47#include <net/if_var.h>
48
49#include <netat/sysglue.h>
50#include <netat/appletalk.h>
51#include <netat/at_var.h>
52#include <netat/at_pcb.h>
53#include <netat/debug.h>
54
55int (*sys_ATsocket)() = 0;
56int (*sys_ATgetmsg)() = 0;
57int (*sys_ATputmsg)() = 0;
58int (*sys_ATPsndreq)() = 0;
59int (*sys_ATPsndrsp)() = 0;
60int (*sys_ATPgetreq)() = 0;
61int (*sys_ATPgetrsp)() = 0;
62
63extern at_state_t at_state; /* global state of AT network */
64extern at_ifaddr_t *ifID_home; /* default interface */
65
55e303ae
A
66struct ATsocket_args {
67 int proto;
68};
1c79356b
A
69int ATsocket(proc, uap, retval)
70 void *proc;
55e303ae 71 struct ATsocket_args *uap;
1c79356b
A
72 int *retval;
73{
74 int err;
75
76 if (sys_ATsocket) {
77 /* required check for all AppleTalk system calls */
78 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
79 *retval = -1;
80 err = ENOTREADY;
81 } else {
82 *retval = (*sys_ATsocket)(uap->proto, &err, proc);
83 }
84 } else {
85 *retval = -1;
86 err = ENXIO;
87 }
88 return err;
89}
90
55e303ae
A
91struct ATgetmsg_args {
92 int fd;
93 void *ctlptr;
94 void *datptr;
95 int *flags;
96};
1c79356b
A
97int ATgetmsg(proc, uap, retval)
98 void *proc;
55e303ae 99 struct ATgetmsg_args *uap;
1c79356b
A
100 int *retval;
101{
102 int err;
103
104 if (sys_ATgetmsg) {
105 /* required check for all AppleTalk system calls */
106 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
107 *retval = -1;
108 err = ENOTREADY;
109 } else {
110 *retval =
111 (*sys_ATgetmsg)(uap->fd, uap->ctlptr, uap->datptr,
112 uap->flags, &err, proc);
113 }
114 } else {
115 *retval = -1;
116 err = ENXIO;
117 }
118 return err;
119}
120
55e303ae 121struct ATputmsg_args {
1c79356b
A
122 int fd;
123 void *ctlptr;
124 void *datptr;
125 int flags;
55e303ae
A
126};
127int ATputmsg(proc, uap, retval)
128 void *proc;
129 struct ATputmsg_args *uap;
1c79356b
A
130 int *retval;
131{
132 int err;
133
134 if (sys_ATputmsg) {
135 /* required check for all AppleTalk system calls */
136 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
137 *retval = -1;
138 err = ENOTREADY;
139 } else {
140 *retval =
141 (*sys_ATputmsg)(uap->fd, uap->ctlptr, uap->datptr,
142 uap->flags, &err, proc);
143 }
144 } else {
145 *retval = -1;
146 err = ENXIO;
147 }
148 return err;
149}
150
55e303ae
A
151struct ATPsndreq_args {
152 int fd;
153 unsigned char *buf;
154 int len;
155 int nowait;
156};
1c79356b
A
157int ATPsndreq(proc, uap, retval)
158 void *proc;
55e303ae 159 struct ATPsndreq_args *uap;
1c79356b
A
160 int *retval;
161{
162 int err;
163
164 if (sys_ATPsndreq) {
165 /* required check for all AppleTalk system calls */
166 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
167 *retval = -1;
168 err = ENOTREADY;
169 } else {
170 *retval =
171 (*sys_ATPsndreq)(uap->fd, uap->buf, uap->len,
172 uap->nowait, &err, proc);
173 }
174 } else {
175 *retval = -1;
176 err= ENXIO;
177 }
178 return err;
179}
180
55e303ae 181struct ATPsndrsp_args {
1c79356b
A
182 int fd;
183 unsigned char *respbuff;
184 int resplen;
185 int datalen;
55e303ae
A
186};
187int ATPsndrsp(proc, uap, retval)
188 void *proc;
189 struct ATPsndrsp_args *uap;
1c79356b
A
190 int *retval;
191{
192 int err;
193
194 if (sys_ATPsndrsp) {
195 /* required check for all AppleTalk system calls */
196 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
197 *retval = -1;
198 err = ENOTREADY;
199 } else {
200 *retval =
201 (*sys_ATPsndrsp)(uap->fd, uap->respbuff,
202 uap->resplen, uap->datalen, &err, proc);
203 }
204 } else {
205 *retval = -1;
206 err = ENXIO;
207 }
208 return err;
209}
210
55e303ae 211struct ATPgetreq_args {
1c79356b
A
212 int fd;
213 unsigned char *buf;
214 int buflen;
55e303ae
A
215};
216int ATPgetreq(proc, uap, retval)
217 void *proc;
218 struct ATPgetreq_args *uap;
1c79356b
A
219 int *retval;
220{
221 int err;
222
223 if (sys_ATPgetreq) {
224 /* required check for all AppleTalk system calls */
225 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
226 *retval = -1;
227 err = ENOTREADY;
228 } else {
229 *retval =
230 (*sys_ATPgetreq)(uap->fd, uap->buf, uap->buflen,
231 &err, proc);
232 }
233 } else {
234 *retval = -1;
235 err = ENXIO;
236 }
237 return err;
238}
239
55e303ae 240struct ATPgetrsp_args {
1c79356b
A
241 int fd;
242 unsigned char *bdsp;
55e303ae
A
243};
244int ATPgetrsp(proc, uap, retval)
245 void *proc;
246 struct ATPgetrsp_args *uap;
1c79356b
A
247 int *retval;
248{
249 int err = 0;
250
251 if (sys_ATPgetrsp) {
252 /* required check for all AppleTalk system calls */
253 if (!(at_state.flags & AT_ST_STARTED) || !ifID_home) {
254 *retval = -1;
255 err = ENOTREADY;
256 } else {
257 *retval =
258 (*sys_ATPgetrsp)(uap->fd, uap->bdsp, &err, proc);
259 }
260 } else {
261 *retval = -1;
262 err = ENXIO;
263 }
264 return err;
265}
266
267int atalk_closeref(fp, grefp)
268 struct file *fp;
269 gref_t **grefp;
270{
271 if ((*grefp = (gref_t *)fp->f_data)) {
272 fp->f_data = 0;
273/*
274 kprintf("atalk_closeref: fp = 0x%x, gref = 0x%x\n", (u_int)fp,
275 (u_int)*grefp);
276*/
277 return(0);
278 }
279 return(EBADF);
280}
281
282int atalk_openref(gref, retfd, proc)
283 gref_t *gref;
284 int *retfd;
285 struct proc *proc;
286{
55e303ae 287 extern int _ATread(), _ATwrite(),_ATioctl(), _ATselect(), _ATclose(), _ATkqfilter();
1c79356b 288 static struct fileops fileops =
55e303ae 289 {_ATread, _ATwrite, _ATioctl, _ATselect, _ATclose, _ATkqfilter};
1c79356b
A
290 int err, fd;
291 struct file *fp;
292
293 thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
294
295 if ((err = falloc(proc, &fp, &fd)) != 0) {
296 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
297 return err;
298 }
299
300 fp->f_flag = FREAD|FWRITE;
301 /*##### LD 5/7/96 Warning: we don't have a "DTYPE_OTHER" for
302 * MacOSX, so defines DTYPE_ATALK as DTYPE_SOCKET...
303 */
304 fp->f_type = DTYPE_ATALK+1;
305 fp->f_ops = &fileops;
306 *fdflags(proc, fd) &= ~UF_RESERVED;
307 *retfd = fd;
308 fp->f_data = (void *)gref;
309/*
310 kprintf("atalk_openref: fp = 0x%x, gref = 0x%x\n", (u_int)fp, (u_int)gref);
311*/
312 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
313 return 0;
314}
315
316/* go from file descriptor to gref, which has been saved in fp->f_data */
317int atalk_getref(fp, fd, grefp, proc)
318struct file *fp;
319int fd;
320gref_t **grefp;
321struct proc *proc;
322{
323 thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL);
324 if (fp == 0) {
325 int error = fdgetf(proc, fd, &fp);
326
327 if (error) {
328
329 *grefp = (gref_t *) 0;
330 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
331 return EBADF;
332 }
333 }
55e303ae
A
334 *grefp = (gref_t *)fp->f_data;
335 if (*grefp == 0 || *grefp == (gref_t *)(-1)) {
1c79356b
A
336 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
337 return EBADF;
338 }
339
340 if ((*grefp)->errno) {
341 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
342 return (int)(*grefp)->errno;
343 }
344
345 thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL);
346 return 0;
347}