Coverage report: /home/ellis/.stash/quicklisp/dists/ultralisp/software/usocket-usocket-20250208033134/option.lisp
Kind | Covered | All | % |
expression | 0 | 129 | 0.0 |
branch | 0 | 2 | 0.0 |
Key
Not instrumented
Conditionalized out
Executed
Not executed
Both branches taken
One branch taken
Neither branch taken
1
;;;; -*- Mode: LISP; Base: 10; Syntax: ANSI-Common-lisp; Package: USOCKET -*-
2
;;;; SOCKET-OPTION, a high-level socket option get/set framework
4
;;;; See LICENSE for licensing information.
8
;; put here because option.lisp is for native backend only
9
(defparameter *backend* :native)
11
;;; Interface definition
13
(defgeneric socket-option (socket option &key)
15
"Get a socket's internal options"))
17
(defgeneric (setf socket-option) (new-value socket option &key)
19
"Set a socket's internal options"))
21
;;; Handling of wrong type of arguments
23
(defmethod socket-option ((socket usocket) (option t) &key)
24
(error 'type-error :datum option :expected-type 'keyword))
26
(defmethod (setf socket-option) (new-value (socket usocket) (option t) &key)
27
(declare (ignore new-value))
28
(socket-option socket option))
30
(defmethod socket-option ((socket usocket) (option symbol) &key)
32
(error 'unimplemented :feature option :context 'socket-option)
33
(error 'type-error :datum option :expected-type 'keyword)))
35
(defmethod (setf socket-option) (new-value (socket usocket) (option symbol) &key)
36
(declare (ignore new-value))
37
(socket-option socket option))
39
;;; Socket option: RECEIVE-TIMEOUT (SO_RCVTIMEO)
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))
51
(socket:socket-options socket :so-rcvtimeo)
53
(ccl:stream-input-timeout socket)
55
(lisp::fd-stream-timeout (socket-stream usocket))
57
(sb-bsd-sockets:sockopt-receive-timeout socket)
59
(get-socket-receive-timeout socket)
65
(sb-impl::fd-stream-timeout (socket-stream usocket))
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))
74
(declare (ignorable socket timeout))
80
(socket:socket-options socket :so-rcvtimeo timeout)
82
(setf (ccl:stream-input-timeout socket) timeout)
84
(setf (lisp::fd-stream-timeout (socket-stream usocket))
85
(coerce timeout 'integer))
87
(setf (sb-bsd-sockets:sockopt-receive-timeout socket) timeout)
89
(set-socket-receive-timeout socket timeout)
95
(setf (sb-impl::fd-stream-timeout (socket-stream usocket))
96
(coerce timeout 'single-float))
101
;;; Socket option: SEND-TIMEOUT (SO_SNDTIMEO)
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))
113
(socket:socket-options socket :so-sndtimeo)
115
(ccl:stream-output-timeout socket)
117
(lisp::fd-stream-timeout (socket-stream usocket))
119
(sb-bsd-sockets:sockopt-send-timeout socket)
121
(get-socket-send-timeout socket)
127
(sb-impl::fd-stream-timeout (socket-stream usocket))
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))
136
(declare (ignorable socket timeout))
142
(socket:socket-options socket :so-sndtimeo timeout)
144
(setf (ccl:stream-output-timeout socket) timeout)
146
(setf (lisp::fd-stream-timeout (socket-stream usocket))
147
(coerce timeout 'integer))
149
(setf (sb-bsd-sockets:sockopt-send-timeout socket) timeout)
151
(set-socket-send-timeout socket timeout)
157
(setf (sb-impl::fd-stream-timeout (socket-stream usocket))
158
(coerce timeout 'single-float))
163
;;; Socket option: REUSE-ADDRESS (SO_REUSEADDR), for TCP server
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))
175
(int->bool (socket:socket-options socket :so-reuseaddr))
177
(int->bool (get-socket-option-reuseaddr socket))
181
(get-socket-reuse-address socket)
186
#+(or ecl sbcl clasp)
187
(sb-bsd-sockets:sockopt-reuse-address socket)
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))
199
(socket:set-socket-options socket option new-value)
201
(socket:socket-options socket :so-reuseaddr (bool->int new-value))
203
(set-socket-option-reuseaddr socket (bool->int new-value))
207
(set-socket-reuse-address socket new-value)
212
#+(or ecl sbcl clasp)
213
(setf (sb-bsd-sockets:sockopt-reuse-address socket) new-value)
218
;;; Socket option: BROADCAST (SO_BROADCAST), for UDP client
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))
230
(int->bool (socket:socket-options socket :so-broadcast))
232
(int->bool (get-socket-option-broadcast socket))
238
(int->bool (get-socket-broadcast socket))
244
(sb-bsd-sockets:sockopt-broadcast socket)
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))
257
(socket:set-socket-options socket option new-value)
259
(socket:socket-options socket :so-broadcast (bool->int new-value))
261
(set-socket-option-broadcast socket (bool->int new-value))
267
(set-socket-broadcast socket (bool->int new-value))
273
(setf (sb-bsd-sockets:sockopt-broadcast socket) new-value)
278
;;; Socket option: TCP-NODELAY (TCP_NODELAY), for TCP client
280
(defmethod socket-option ((usocket stream-usocket)
281
(option (eql :tcp-no-delay)) &key)
282
(declare (ignorable option))
283
(socket-option usocket :tcp-nodelay))
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))
295
(int->bool (socket:socket-options socket :tcp-nodelay))
297
(int->bool (get-socket-option-tcp-nodelay socket))
301
(sb-bsd-sockets::sockopt-tcp-nodelay socket)
303
(int->bool (get-socket-tcp-nodelay socket))
309
(sb-bsd-sockets::sockopt-tcp-nodelay socket)
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))
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))
327
(socket:set-socket-options socket :no-delay new-value)
329
(socket:socket-options socket :tcp-nodelay (bool->int new-value))
331
(set-socket-option-tcp-nodelay socket (bool->int new-value))
335
(setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value)
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)))
347
(setf (sb-bsd-sockets::sockopt-tcp-nodelay socket) new-value)
352
;;; Socket option: TCP-KEEPALIVE (SO_KEEPALIVE)
354
(defmethod socket-option ((usocket stream-usocket)
355
(option (eql :tcp-keepalive)) &key)
356
(declare (ignorable option))
357
(let ((socket (socket usocket)))
358
(declare (ignorable socket))
366
(int->bool (get-socket-option-keep-alive socket))
370
(sb-bsd-sockets::sockopt-keep-alive socket)
372
(int->bool (get-socket-keepalive socket))
378
(sb-bsd-sockets:sockopt-keep-alive socket)
382
(defmethod (setf socket-option) (new-value (usocket stream-usocket)
383
(option (eql :tcp-keepalive)) &key)
384
(declare (type boolean new-value)
385
(ignorable new-value option))
386
(let ((socket (socket usocket)))
387
(declare (ignorable socket))
395
(set-socket-option-keep-alive socket (bool->int new-value))
399
(setf (sb-bsd-sockets::sockopt-keep-alive socket) new-value)
401
(set-socket-keepalive socket (bool->int new-value))
407
(setf (sb-bsd-sockets:sockopt-keep-alive socket) new-value)
412
(eval-when (:load-toplevel :execute)
413
(export 'socket-option))