option.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
HTML git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
option.lisp (9993B)
---
1 ;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET -*-
2 ;;;; SOCKET-OPTION, a high-level socket option get/set framework
3
4 ;;;; See LICENSE for licensing information.
5
6 (in-package :usocket)
7
8 ;; put here because option.lisp is for native backend only
9 (defparameter *backend* :native)
10
11 ;;; Interface definition
12
13 (defgeneric socket-option (socket option &key)
14 (:documentation
15 "Get a socket's internal options"))
16
17 (defgeneric (setf socket-option) (new-value socket option &key)
18 (:documentation
19 "Set a socket's internal options"))
20
21 ;;; Handling of wrong type of arguments
22
23 (defmethod socket-option ((socket usocket) (option t) &key)
24 (error 'type-error :datum option :expected-type 'keyword))
25
26 (defmethod (setf socket-option) (new-value (socket usocket) (option t) &key)
27 (declare (ignore new-value))
28 (socket-option socket option))
29
30 (defmethod socket-option ((socket usocket) (option symbol) &key)
31 (if (keywordp option)
32 (error 'unimplemented :feature option :context 'socket-option)
33 (error 'type-error :datum option :expected-type 'keyword)))
34
35 (defmethod (setf socket-option) (new-value (socket usocket) (option symbol) &key)
36 (declare (ignore new-value))
37 (socket-option socket option))
38
39 ;;; Socket option: RECEIVE-TIMEOUT (SO_RCVTIMEO)
40
41 (defmethod socket-option ((usocket stream-usocket)
42 (option (eql :receive-timeout)) &key)
43 (declare (ignorable option))
44 (let ((socket (socket usocket)))
45 (declare (ignorable socket))
46 #+abcl
47 () ; TODO
48 #+allegro
49 () ; TODO
50 #+clisp
51 (socket:socket-options socket :so-rcvtimeo)
52 #+clozure
53 (ccl:stream-input-timeout socket)
54 #+cmu
55 (lisp::fd-stream-timeout (socket-stream usocket))
56 #+(or ecl clasp)
57 (sb-bsd-sockets:sockopt-receive-timeout socket)
58 #+lispworks
59 (get-socket-receive-timeout socket)
60 #+mcl
61 () ; TODO
62 #+mocl
63 () ; unknown
64 #+sbcl
65 (sb-impl::fd-stream-timeout (socket-stream usocket))
66 #+scl
67 ())) ; TODO
68
69 (defmethod (setf socket-option) (new-value (usocket stream-usocket)
70 (option (eql :receive-timeout)) &key)
71 (declare (type number new-value) (ignorable new-value option))
72 (let ((socket (socket usocket))
73 (timeout new-value))
74 (declare (ignorable socket timeout))
75 #+abcl
76 () ; TODO
77 #+allegro
78 () ; TODO
79 #+clisp
80 (socket:socket-options socket :so-rcvtimeo timeout)
81 #+clozure
82 (setf (ccl:stream-input-timeout socket) timeout)
83 #+cmu
84 (setf (lisp::fd-stream-timeout (socket-stream usocket))
85 (coerce timeout 'integer))
86 #+(or ecl clasp)
87 (setf (sb-bsd-sockets:sockopt-receive-timeout socket) timeout)
88 #+lispworks
89 (set-socket-receive-timeout socket timeout)
90 #+mcl
91 () ; TODO
92 #+mocl
93 () ; unknown
94 #+sbcl
95 (setf (sb-impl::fd-stream-timeout (socket-stream usocket))
96 (coerce timeout 'single-float))
97 #+scl
98 () ; TODO
99 new-value))
100
101 ;;; Socket option: SEND-TIMEOUT (SO_SNDTIMEO)
102
103 (defmethod socket-option ((usocket stream-usocket)
104 (option (eql :send-timeout)) &key)
105 (declare (ignorable option))
106 (let ((socket (socket usocket)))
107 (declare (ignorable socket))
108 #+abcl
109 () ; TODO
110 #+allegro
111 () ; TODO
112 #+clisp
113 (socket:socket-options socket :so-sndtimeo)
114 #+clozure
115 (ccl:stream-output-timeout socket)
116 #+cmu
117 (lisp::fd-stream-timeout (socket-stream usocket))
118 #+(or ecl clasp)
119 (sb-bsd-sockets:sockopt-send-timeout socket)
120 #+lispworks
121 (get-socket-send-timeout socket)
122 #+mcl
123 () ; TODO
124 #+mocl
125 () ; unknown
126 #+sbcl
127 (sb-impl::fd-stream-timeout (socket-stream usocket))
128 #+scl
129 ())) ; TODO
130
131 (defmethod (setf socket-option) (new-value (usocket stream-usocket)
132 (option (eql :send-timeout)) &key)
133 (declare (type number new-value) (ignorable new-value option))
134 (let ((socket (socket usocket))
135 (timeout new-value))
136 (declare (ignorable socket timeout))
137 #+abcl
138 () ; TODO
139 #+allegro
140 () ; TODO
141 #+clisp
142 (socket:socket-options socket :so-sndtimeo timeout)
143 #+clozure
144 (setf (ccl:stream-output-timeout socket) timeout)
145 #+cmu
146 (setf (lisp::fd-stream-timeout (socket-stream usocket))
147 (coerce timeout 'integer))
148 #+(or ecl clasp)
149 (setf (sb-bsd-sockets:sockopt-send-timeout socket) timeout)
150 #+lispworks
151 (set-socket-send-timeout socket timeout)
152 #+mcl
153 () ; TODO
154 #+mocl
155 () ; unknown
156 #+sbcl
157 (setf (sb-impl::fd-stream-timeout (socket-stream usocket))
158 (coerce timeout 'single-float))
159 #+scl
160 () ; TODO
161 new-value))
162
163 ;;; Socket option: REUSE-ADDRESS (SO_REUSEADDR), for TCP server
164
165 (defmethod socket-option ((usocket stream-server-usocket)
166 (option (eql :reuse-address)) &key)
167 (declare (ignorable option))
168 (let ((socket (socket usocket)))
169 (declare (ignorable socket))
170 #+abcl
171 () ; TODO
172 #+allegro
173 () ; TODO
174 #+clisp
175 (int->bool (socket:socket-options socket :so-reuseaddr))
176 #+clozure
177 (int->bool (get-socket-option-reuseaddr socket))
178 #+cmu
179 () ; TODO
180 #+lispworks
181 (get-socket-reuse-address socket)
182 #+mcl
183 () ; TODO
184 #+mocl
185 () ; unknown
186 #+(or ecl sbcl clasp)
187 (sb-bsd-sockets:sockopt-reuse-address socket)
188 #+scl
189 ())) ; TODO
190
191 (defmethod (setf socket-option) (new-value (usocket stream-server-usocket)
192 (option (eql :reuse-address)) &key)
193 (declare (type boolean new-value) (ignorable new-value option))
194 (let ((socket (socket usocket)))
195 (declare (ignorable socket))
196 #+abcl
197 () ; TODO
198 #+allegro
199 (socket:set-socket-options socket option new-value)
200 #+clisp
201 (socket:socket-options socket :so-reuseaddr (bool->int new-value))
202 #+clozure
203 (set-socket-option-reuseaddr socket (bool->int new-value))
204 #+cmu
205 () ; TODO
206 #+lispworks
207 (set-socket-reuse-address socket new-value)
208 #+mcl
209 () ; TODO
210 #+mocl
211 () ; unknown
212 #+(or ecl sbcl clasp)
213 (setf (sb-bsd-sockets:sockopt-reuse-address socket) new-value)
214 #+scl
215 () ; TODO
216 new-value))
217
218 ;;; Socket option: BROADCAST (SO_BROADCAST), for UDP client
219
220 (defmethod socket-option ((usocket datagram-usocket)
221 (option (eql :broadcast)) &key)
222 (declare (ignorable option))
223 (let ((socket (socket usocket)))
224 (declare (ignorable socket))
225 #+abcl
226 () ; TODO
227 #+allegro
228 () ; TODO
229 #+clisp
230 (int->bool (socket:socket-options socket :so-broadcast))
231 #+clozure
232 (int->bool (get-socket-option-broadcast socket))
233 #+cmu
234 () ; TODO
235 #+(or ecl clasp)
236 () ; TODO
237 #+lispworks
238 () ; TODO
239 #+mcl
240 () ; TODO
241 #+mocl
242 () ; unknown
243 #+sbcl
244 (sb-bsd-sockets:sockopt-broadcast socket)
245 #+scl
246 ())) ; TODO
247
248 (defmethod (setf socket-option) (new-value (usocket datagram-usocket)
249 (option (eql :broadcast)) &key)
250 (declare (type boolean new-value)
251 (ignorable new-value option))
252 (let ((socket (socket usocket)))
253 (declare (ignorable socket))
254 #+abcl
255 () ; TODO
256 #+allegro
257 (socket:set-socket-options socket option new-value)
258 #+clisp
259 (socket:socket-options socket :so-broadcast (bool->int new-value))
260 #+clozure
261 (set-socket-option-broadcast socket (bool->int new-value))
262 #+cmu
263 () ; TODO
264 #+(or ecl clasp)
265 () ; TODO
266 #+lispworks
267 () ; TODO
268 #+mcl
269 () ; TODO
270 #+mocl
271 () ; unknown
272 #+sbcl
273 (setf (sb-bsd-sockets:sockopt-broadcast socket) new-value)
274 #+scl
275 () ; TODO
276 new-value))
277
278 ;;; Socket option: TCP-NODELAY (TCP_NODELAY), for TCP client
279
280 (defmethod socket-option ((usocket stream-usocket)
281 (option (eql :tcp-no-delay)) &key)
282 (declare (ignorable option))
283 (socket-option usocket :tcp-nodelay))
284
285 (defmethod socket-option ((usocket stream-usocket)
286 (option (eql :tcp-nodelay)) &key)
287 (declare (ignorable option))
288 (let ((socket (socket usocket)))
289 (declare (ignorable socket))
290 #+abcl
291 () ; TODO
292 #+allegro
293 () ; TODO
294 #+clisp
295 (int->bool (socket:socket-options socket :tcp-nodelay))
296 #+clozure
297 (int->bool (get-socket-option-tcp-nodelay socket))
298 #+cmu
299 ()
300 #+(or ecl clasp)
301 (sb-bsd-sockets::sockopt-tcp-nodelay socket)
302 #+lispworks
303 (int->bool (get-socket-tcp-nodelay socket))
304 #+mcl
305 () ; TODO
306 #+mocl
307 () ; unknown
308 #+sbcl
309 (sb-bsd-sockets::sockopt-tcp-nodelay socket)
310 #+scl
311 ())) ; TODO
312
313 (defmethod (setf socket-option) (new-value (usocket stream-usocket)
314 (option (eql :tcp-no-delay)) &key)
315 (declare (ignorable option))
316 (setf (socket-option usocket :tcp-nodelay) new-value))
317
318 (defmethod (setf socket-option) (new-value (usocket stream-usocket)
319 (option (eql :tcp-nodelay)) &key)
320 (declare (type boolean new-value)
321 (ignorable new-value option))
322 (let ((socket (socket usocket)))
323 (declare (ignorable socket))
324 #+abcl
325 () ; TODO
326 #+allegro
327 (socket:set-socket-options socket :no-delay new-value)
328 #+clisp
329 (socket:socket-options socket :tcp-nodelay (bool->int new-value))
330 #+clozure
331 (set-socket-option-tcp-nodelay socket (bool->int new-value))
332 #+cmu
333 ()
334 #+(or ecl clasp)
335 (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value)
336 #+lispworks
337 (progn
338 #-(or lispworks4 lispworks5.0)
339 (comm::set-socket-tcp-nodelay socket new-value)
340 #+(or lispworks4 lispworks5.0)
341 (set-socket-tcp-nodelay socket (bool->int new-value)))
342 #+mcl
343 () ; TODO
344 #+mocl
345 () ; unknown
346 #+sbcl
347 (setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value)
348 #+scl
349 () ; TODO
350 new-value))
351
352 (eval-when (:load-toplevel :execute)
353 (export 'socket-option))