option.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) 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))