]> git.saurik.com Git - apple/xnu.git/blob - bsd/netat/adsp_misc.c
aa68178ae966e542cf852ee8acdf2adb3635eaad
[apple/xnu.git] / bsd / netat / adsp_misc.c
1 /*
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28 #include <sys/errno.h>
29 #include <sys/types.h>
30 #include <sys/param.h>
31 #include <machine/spl.h>
32 #include <sys/systm.h>
33 #include <sys/kernel.h>
34 #include <sys/proc.h>
35 #include <sys/filedesc.h>
36 #include <sys/fcntl.h>
37 #include <sys/mbuf.h>
38 #include <sys/socket.h>
39
40 #include <netat/sysglue.h>
41 #include <netat/appletalk.h>
42 #include <netat/at_pcb.h>
43 #include <netat/debug.h>
44 #include <netat/adsp.h>
45 #include <netat/adsp_internal.h>
46
47 /*
48 * These function replace the Mk68 assembly routines found in qAddToEnd.s and
49 * q????.s
50 * Modified for MP, 1996 by Tuyen Nguyen
51 * Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
52 */
53
54
55 struct qlink {
56 struct qlink *qlinkp;
57 };
58
59 /* ----------------------------------------------------------------------
60 * void qAddToEnd(void *qhead, void *qelem)
61 *
62 * INPUTS:
63 * Ptr to ptr to 1st item in queue
64 * Ptr to item to add to end of queue
65 * OUTPUTS:
66 * none
67 *
68 * Assumptions: The link field is the FIRST field of the qelem structure.
69 * ----------------------------------------------------------------------
70 */
71 int qAddToEnd(qhead, qelem)
72 struct qlink **qhead;
73 struct qlink *qelem;
74 {
75 /* define our own type to access the next field. NOTE THAT THE "NEXT"
76 * FIELD IS ASSUMED TO BE THE FIRST FIELD OF THE STRUCTURE
77 */
78
79 register struct qlink *q;
80
81 /* Scan the linked list to the end and update the previous
82 * element next field. (do that protocted).
83 */
84
85 q = *qhead;
86 if (q) {
87 while (q->qlinkp) {
88 /* are we about to link to ourself */
89 if (q == qelem)
90 goto breakit;
91 q = q->qlinkp;
92 }
93 q->qlinkp = qelem;
94 }
95 else {
96 *qhead = qelem;
97 }
98 qelem->qlinkp = (struct qlink *) 0;
99 breakit:
100 #ifdef NOTDEF
101 DPRINTF("%s: qhead=%x added elem=%x\n","qAddToEnd", qhead, qelem);
102 #endif
103 return 0;
104 }
105
106
107
108 /* ----------------------------------------------------------------------
109 * qfind_m
110 * void* qfind_m(void *qhead, void NPTR match, ProcPtr compare_fnx)
111 *
112 * Hunt down a linked list of queue elements calling the compare
113 * function on each item. When the compare function returns true,
114 * return ptr to the queue element.
115 *
116 *
117 * INPUTS:
118 * qhead Address of ptr to first item in queue
119 * match
120 * compare_fnx
121 * OUTPUTS:
122 * D0 & A0 Ptr to queue element or NIL
123 * REGISTERS:
124 * D0,D1,A0,A1
125 * ----------------------------------------------------------------------
126 */
127 void* qfind_m(qhead, match, compare_fnx)
128 CCBPtr qhead;
129 void *match;
130 ProcPtr compare_fnx;
131 {
132 CCBPtr queue_item = qhead;
133
134 while (queue_item) {
135 if ((*compare_fnx)(queue_item,match))
136 break;
137
138 queue_item = queue_item->ccbLink;
139 }
140
141 return (queue_item);
142 }