clozure.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
       ---
       clozure.lisp (2879B)
       ---
            1 ;;;; See LICENSE for licensing information.
            2 
            3 ;;;; Functions for CCL 1.11 (IPv6) only, see openmcl.lisp for rest of functions.
            4 
            5 (in-package :usocket)
            6 
            7 #+ipv6
            8 (defun socket-connect (host port &key (protocol :stream) element-type
            9                                    timeout deadline nodelay
           10                                    local-host local-port)
           11   (when (eq nodelay :if-supported)
           12     (setf nodelay t))
           13   (with-mapped-conditions (nil host)
           14     (let* ((remote (when (and host port)
           15                      (openmcl-socket:resolve-address :host (host-to-hostname host)
           16                                                      :port port
           17                                                      :socket-type protocol)))
           18            (local  (when (and local-host local-port)
           19                      (openmcl-socket:resolve-address :host (host-to-hostname local-host)
           20                                                      :port local-port
           21                                                      :socket-type protocol)))
           22            (mcl-sock (apply #'openmcl-socket:make-socket
           23                             `(:type ,protocol
           24                               ,@(when (or remote local)
           25                                   `(:address-family ,(openmcl-socket:socket-address-family (or remote local))))
           26                               ,@(when remote
           27                                   `(:remote-address ,remote))
           28                               ,@(when local
           29                                   `(:local-address ,local))
           30                               :format ,(to-format element-type protocol)
           31                               :external-format ,ccl:*default-external-format*
           32                               :deadline ,deadline
           33                               :nodelay ,nodelay
           34                               :connect-timeout ,timeout
           35                               :input-timeout ,timeout))))
           36       (ecase protocol
           37         (:stream
           38          (make-stream-socket :stream mcl-sock :socket mcl-sock))
           39         (:datagram
           40          (make-datagram-socket mcl-sock :connected-p (and remote t)))))))
           41 
           42 #+ipv6
           43 (defun socket-listen (host port
           44                       &key
           45                         (reuse-address nil reuse-address-supplied-p)
           46                         (reuseaddress (when reuse-address-supplied-p reuse-address))
           47                         (backlog 5)
           48                         (element-type 'character))
           49   (let ((local-address (openmcl-socket:resolve-address :host (host-to-hostname host)
           50                                                        :port port :connect :passive)))
           51     (with-mapped-conditions (nil host)
           52       (make-stream-server-socket
           53         (openmcl-socket:make-socket :connect :passive
           54                                     :address-family (openmcl-socket:socket-address-family local-address)
           55                                     :local-address local-address
           56                                     :reuse-address reuseaddress
           57                                     :backlog backlog
           58                                     :format (to-format element-type :stream))
           59         :element-type element-type))))
           60 
           61 #+ipv6
           62 (defmethod socket-send ((usocket datagram-usocket) buffer size &key host port (offset 0))
           63   (let* ((ccl-socket (socket usocket))
           64          (socket-keys (ccl::socket-keys ccl-socket)))
           65     (with-mapped-conditions (usocket host)
           66       (if (and host port)
           67           (openmcl-socket:send-to ccl-socket buffer size
           68                                   :remote-host (host-to-hostname host)
           69                                   :remote-port port
           70                                   :offset offset)
           71           (openmcl-socket:send-to ccl-socket buffer size
           72                                   :remote-address (getf socket-keys :remote-address)
           73                                   :offset offset)))))