3 <ENTRY NETWORK NET-ADDRESS CONNECTION TIMEOUT CURRENT-CONNECTION NET-CHANNELS
4 TIME-NUM CLOSE-DATA-CHANNEL KILL-CHANNEL INPUT-WAITING DO-TIMEOUT>
6 <INCLUDE-WHEN <COMPILING? "NETBASE"> "NETDEFS">
8 <NEW-CHANNEL-TYPE NETWORK <>
11 READ-BUFFER NETWORK-READ
12 READ-BYTE NETWORK-READ-BYTE
13 WRITE-BUFFER NETWORK-WRITE
14 WRITE-BYTE NETWORK-WRITE-BYTE
15 TIMEOUT NETWORK-TIMEOUT
16 INPUT-WAITING NETWORK-TYPE-AHEAD?
17 CLOSE-DATA-CHANNEL NET-CLOSE-ALT
18 FILE-HANDLE NET-FILE-HANDLE>
20 <COND (<NOT <VALID-TYPE? CONNECTION>>
21 <NEWTYPE CONNECTION VECTOR>
22 <NEWTYPE NET-ADDRESS UVECTOR>)>
24 <SETG NET-CHANNELS ()>
26 <DEFINE NET-FILE-HANDLE (CH:<CHANNEL 'NETWORK> OPER
27 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CH>))
30 <DEFINE NETWORK-TYPE-AHEAD? (CHANNEL:<CHANNEL 'NETWORK> OPER
31 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
32 (BUF:UVECTOR <STACK <IUVECTOR 1>>)
33 (CURRENT-CONNECTION:<SPECIAL <CHANNEL 'NETWORK>>
35 <COND (<CALL SYSCALL IOCTL <C-SOCKET .DATA> ,FIONREAD .BUF>
36 <COND (<G? <1 .BUF> 0>
39 <DEFINE TIME-NUM (UV:<UVECTOR [2 FIX]> "OPT" NEW:<OR FIX FLOAT> "AUX" OLD)
41 <COND (<0? <2 .UV>> <1 .UV>)
43 <+ <FLOAT <1 .UV>> </ <FLOAT <2 .UV>> 1000000.0>>)>>
44 <COND (<NOT <ASSIGNED? NEW>>)
50 <2 .UV <FIX <* 1000000.0 <- .NEW <1 .UV>>>>>)>
53 <DEFINE NETWORK-TIMEOUT (CHANNEL:<CHANNEL 'NETWORK> OPER
54 "OPT" NEW:<OR FIX FLOAT FALSE>
55 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
57 <COND (<SET UV <C-TIMEOUT .DATA>>
58 <SET OLD <TIME-NUM .UV>>)>
59 <COND (<NOT <ASSIGNED? NEW>>)
60 (<NOT .NEW> <C-TIMEOUT .DATA <>>)
62 <COND (<NOT .UV><SET UV <IUVECTOR 2>>)>
64 <C-TIMEOUT .DATA .UV>)>
67 <DEFINE NETWORK-OPEN (TYPE OPER NAME:<OR STRING FALSE>
68 "OPTIONAL" SERVICE:<OR NET-ADDRESS FIX>
69 (H:<OR NET-ADDRESS FIX> <CALL SYSCALL GETHOSTID>)
70 (NS:<OR FIX FALSE> <>)
72 (FA <STACK <IUVECTOR ,ADDR-WORD-LEN>>)
73 (ADDR:NET-ADDRESS <CHTYPE .FA NET-ADDRESS>)
74 ERR KIND:FIX PROT:FIX SERVSOCK:FIX)
76 (<NOT <ASSIGNED? SERVICE>>
77 <ERROR TOO-FEW-ARGUMENTS!-ERRORS
81 <COND (<TYPE? .SERVICE NET-ADDRESS>
82 <SET SERVSOCK <IN-ADDR-PORT .SERVICE>>
84 <SET KIND ,SOCK-STREAM>
85 <SET H <NA-HOST .SERVICE>>
87 <SET SERVICE <PUTLHW .SERVSOCK .PROT>>)
89 <SET PROT <LHW .SERVICE>>
90 <SET SERVSOCK <RHW .SERVICE>>
91 <COND (<==? .PROT ,PROT-UDP> <SET KIND ,SOCK-DGRAM>)
92 (T <SET KIND ,SOCK-STREAM>)>
93 <BUILD-ADDRESS .SERVICE .H .ADDR>)>
94 <COND (<SET S <CALL SYSCALL SOCKET ,AF-INET .KIND .PROT>>
95 <COND (<NOT <SET ERR <CALL SYSCALL CONNECT
97 <CALL SYSCALL CLOSE .S>
100 <SETG NET-CHANNELS (.S .CURRENT-CHANNEL
102 <CHTYPE [.S <CHTYPE <UVECTOR !.ADDR>
107 <SETG NET-CHANNELS (.NS .CURRENT-CHANNEL
109 <CHTYPE [.NS <CHTYPE <UVECTOR !.H> NET-ADDRESS>
110 .SERVICE 0 <> <>] CONNECTION>)>>
112 <DEFINE KILL-CHANNEL (CHANNEL:CHANNEL
113 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
115 <COND (<SET L <MEMQ <C-SOCKET .DATA> ,NET-CHANNELS>>
116 <COND (<==? .L ,NET-CHANNELS>
117 <SETG NET-CHANNELS <REST ,NET-CHANNELS 2>>)
119 <PUTREST <REST ,NET-CHANNELS <- <LENGTH ,NET-CHANNELS>
124 <DEFINE NET-CLOSE-ALT (C:<CHANNEL 'NETWORK> OPER
125 "AUX" (DATA:CONNECTION <CHANNEL-DATA .C>) NC)
126 <COND (<TYPE? <SET NC <C-ALTCHANNEL .DATA>> CHANNEL>
127 <COND (<CHANNEL-OPEN? .NC>
128 <CHANNEL-CLOSE .NC>)>
129 <C-ALTCHANNEL .DATA <>>)
131 <CALL SYSCALL CLOSE .NC>
132 <C-ALTCHANNEL .DATA <>>)>>
134 <DEFINE NETWORK-CLOSE (CHANNEL:<CHANNEL 'NETWORK> OPER
135 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>))
136 <COND (<C-ALTCHANNEL .DATA>
137 <CHANNEL-OP .CHANNEL CLOSE-DATA-CHANNEL>)>
138 <KILL-CHANNEL .CHANNEL>
139 <CALL SYSCALL CLOSE <C-SOCKET .DATA>>
143 <DEFINE NETWORK-WRITE (CHANNEL:<CHANNEL 'NETWORK> OPER
145 "AUX" (CT:FIX <LENGTH .STUFF>)
146 (IOV:UVECTOR <STACK <IUVECTOR .CT>>) RLEN
147 (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
148 FROB:<OR STRING UVECTOR>
150 (CURRENT-CONNECTION:<SPECIAL CHANNEL> .CHANNEL))
151 #DECL ((STUFF) <<PRIMTYPE VECTOR>
152 [REST <OR STRING UVECTOR>
156 <SET FROB <1 .STUFF>>
157 <COND (<OR <==? .CT 1> <NOT <2 .STUFF>>>
158 <COND (<TYPE? .FROB STRING> <SET CT <LENGTH .FROB>>)
159 (T <SET CT <LENGTH .FROB>>)>)
161 <SET CT <2 .STUFF>>)>
163 <COND (<TYPE? .FROB UVECTOR> <SET CT <* .CT 4>>)>
165 <COND (<SET NC <ISYSCALL WRITE <C-SOCKET .DATA>
169 <COND (<TYPE? .FROB UVECTOR>
170 <SET FROB <REST .FROB </ .NC 4>>>)
172 <SET FROB <REST .FROB .NC>>)>
176 <SET NC <MAKE-ARGS .STUFF .IOV>>
179 (<SET NEW <ISYSCALL WRITEV <C-SOCKET .DATA> .IOV </ .CT 2>>>
180 <COND (<G? <SET NC <- .NC .NEW>> 0>
181 <SET RES <+ <GET-COUNT .STUFF .IOV .NEW T> .RES>>
184 <SET RES <+ <GET-COUNT .STUFF .IOV .NEW> .RES>>)>
187 <DEFINE NETWORK-READ-BYTE (CHANNEL:<CHANNEL 'NETWORK> OPER "AUX"
188 (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
189 (BUF <STACK <ISTRING 1>>)
190 (CURRENT-CONNECTION:<SPECIAL <CHANNEL 'NETWORK>>
194 (<OR <NOT <C-TIMEOUT .DATA>>
197 (<AND <SET RES <ISYSCALL READ <C-SOCKET .DATA> .BUF 1>>
201 <DEFINE NETWORK-WRITE-BYTE (CHANNEL:<CHANNEL 'NETWORK> OPER BYTE:<OR FIX CHARACTER>
202 "AUX" (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
203 (BUF1 <STACK <ISTRING 1>>)
204 (BUF2 <STACK <IUVECTOR 1>>)
205 (CURRENT-CONNECTION:<SPECIAL <CHANNEL 'NETWORK>>
207 <COND (<TYPE? .BYTE FIX>
209 <COND (<NETWORK-WRITE .CHANNEL .OPER .BUF2 1> .BYTE)>)
212 <COND (<ISYSCALL WRITE <C-SOCKET .DATA> .BUF1 1> .BYTE)>)>>
216 <DEFINE DO-TIMEOUT (DATA:CONNECTION "AUX" (BUF <STACK <IUVECTOR 1>>)
218 <1 .BUF <LSH 1 <C-SOCKET .DATA>>>
221 <ISYSCALL SELECT <+ <C-SOCKET .DATA> 1> .BUF 0 0 <C-TIMEOUT .DATA>>>
222 <COND (<0? .RES> ,TIMED-OUT)
225 <DEFINE NETWORK-READ (CHANNEL:<CHANNEL 'NETWORK> OPER
227 "AUX" (CT:FIX <LENGTH .STUFF>)
228 (IOV:UVECTOR <STACK <IUVECTOR .CT>>)
229 (DATA:CONNECTION <CHANNEL-DATA .CHANNEL>)
230 LAST FROB:<OR STRING UVECTOR> RES:<OR FIX FALSE>
231 (CURRENT-CONNECTION:<SPECIAL <CHANNEL 'NETWORK>>
233 #DECL ((STUFF) <<PRIMTYPE VECTOR>
234 [REST <OR STRING UVECTOR>
236 <COND (<OR <NOT <C-TIMEOUT .DATA>>
240 <SET FROB <1 .STUFF>>
241 <COND (<OR <==? .CT 1> <NOT <2 .STUFF>>>
242 <COND (<TYPE? .FROB STRING> <SET CT <LENGTH .FROB>>)
243 (T <SET CT <LENGTH .FROB>>)>)
244 (T <SET CT <2 .STUFF>>)>
245 <COND (<TYPE? .FROB UVECTOR> <SET CT <* .CT 4>>)>
246 <COND (<SET RES <ISYSCALL READ <C-SOCKET .DATA> .FROB .CT>>
247 <COND (<TYPE? .FROB UVECTOR>
251 <MAKE-ARGS .STUFF .IOV>
253 (<SET RES <ISYSCALL READV <C-SOCKET .DATA> .IOV </ .CT 2>>>
254 <GET-COUNT .STUFF .IOV .RES>)>)>)>>
256 <DEFINE GET-COUNT (STUFF:<<PRIMTYPE VECTOR> [REST <OR STRING UVECTOR>
258 IOV:<UVECTOR [REST FIX]>
259 CT:FIX "OPT" (WRITE?:<OR ATOM FALSE> <>))
260 <REPEAT ((NC 0) FROB LEN NEW)
261 <COND (<OR <EMPTY? .STUFF>
266 <2 .IOV <SET NEW <MAX 0 <- .LEN .CT>>>>
267 <1 .IOV <+ <1 .IOV> <- .LEN .NEW>>>)>
268 <SET NEW <MIN .CT .LEN>>
269 <SET CT <- .CT .NEW>>
270 <COND (<TYPE? <1 .STUFF> UVECTOR>
271 <SET NEW </ <+ .NEW 3> 4>>)>
272 <SET NC <+ .NC .NEW>>
273 <SET IOV <REST .IOV 2>>
274 <SET STUFF <REST .STUFF 2>>>>
276 <DEFINE MAKE-ARGS (STUFF:<<PRIMTYPE VECTOR>
277 [REST <OR STRING UVECTOR> <OR FALSE FIX>]>
278 IOV:<UVECTOR [REST FIX]>)
279 <COND (<NOT <0? <MOD <LENGTH .STUFF> 2>>>
280 <ERROR ARGUMENT-VECTOR-IS-BAD-LENGTH!-ERROR
281 .STUFF NETWORK-READ/WRITE>)>
282 <REPEAT (THING LEN (CT 0))
283 <COND (<EMPTY? .STUFF> <RETURN .CT>)>
285 <COND (<TYPE? <SET THING <1 .STUFF>> UVECTOR>
287 <SET LEN <LENGTH .THING>>
289 <SET LEN <* 4 .LEN>>)
292 <SET LEN <LENGTH .THING>>
294 <1 .IOV <CALL VALUE .THING>>
296 <SET CT <+ .CT .LEN>>
297 <SET STUFF <REST .STUFF 2>>
298 <SET IOV <REST .IOV 2>>>>