mocl.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
       ---
       mocl.lisp (5501B)
       ---
            1 ;;;; See LICENSE for licensing information.
            2 
            3 (in-package :usocket)
            4 
            5 (defun handle-condition (condition &optional (socket nil) (host-or-ip nil))
            6   "Dispatch correct usocket condition."
            7   (declare (ignore socket))
            8   (signal condition))
            9 
           10 (defun socket-connect (host port &key (protocol :stream) (element-type 'character)
           11                        timeout deadline (nodelay t nodelay-specified)
           12                        (local-host nil local-host-p)
           13                        (local-port nil local-port-p))
           14   (when (and nodelay-specified 
           15              (not (eq nodelay :if-supported)))
           16     (unsupported 'nodelay 'socket-connect))
           17   (when deadline (unsupported 'deadline 'socket-connect))
           18   (when timeout (unimplemented 'timeout 'socket-connect))
           19   (when local-host-p
           20      (unimplemented 'local-host 'socket-connect))
           21   (when local-port-p
           22      (unimplemented 'local-port 'socket-connect))
           23 
           24   (let (socket)
           25     (ecase protocol
           26       (:stream
           27        (setf socket (rt::socket-connect host port))
           28        (let ((stream (rt::make-socket-stream socket :binaryp (not (eq element-type 'character)))))
           29          (make-stream-socket :socket socket :stream stream)))
           30       (:datagram
           31        (error 'unsupported
           32               :feature '(protocol :datagram)
           33               :context 'socket-connect)))))
           34 
           35 (defun socket-listen (host port
           36                            &key reuseaddress
           37                            (reuse-address nil reuse-address-supplied-p)
           38                            (backlog 5)
           39                            (element-type 'character))
           40   (unimplemented 'socket-listen 'mocl))
           41 
           42 (defmethod socket-accept ((usocket stream-server-usocket) &key element-type)
           43   (unimplemented 'socket-accept 'mocl))
           44 
           45 ;; Sockets and their associated streams are modelled as
           46 ;; different objects. Be sure to close the socket stream
           47 ;; when closing stream-sockets; it makes sure buffers
           48 ;; are flushed and the socket is closed correctly afterwards.
           49 (defmethod socket-close ((usocket usocket))
           50   "Close socket."
           51   (rt::socket-shutdown usocket)
           52   (rt::c-fclose usocket))
           53 
           54 (defmethod socket-close ((usocket stream-usocket))
           55   "Close socket."
           56   (close (socket-stream usocket)))
           57 
           58 ;; (defmethod socket-close :after ((socket datagram-usocket))
           59 ;;   (setf (%open-p socket) nil))
           60 
           61 (defmethod socket-shutdown ((usocket stream-usocket) direction)
           62   (declare (ignore usocket direction))
           63   ;; sure would be nice if there was some documentation for mocl...
           64   (unimplemented "shutdown" 'socket-shutdown))
           65 
           66 ;; (defmethod socket-send ((usocket datagram-usocket) buffer size &key host port)
           67 ;;   (let ((s (socket usocket))
           68 ;;         (host (if host (host-to-hbo host)))
           69 ;;         (real-buffer (if (zerop offset)
           70 ;;                          buffer
           71 ;;                          (subseq buffer offset (+ offset size)))))
           72 ;;     (multiple-value-bind (result errno)
           73 ;;         (ext:inet-socket-send-to s real-buffer size
           74 ;;                                  :remote-host host :remote-port port)
           75 ;;       (or result
           76 ;;           (mocl-map-socket-error errno :socket usocket)))))
           77 
           78 ;; (defmethod socket-receive ((socket datagram-usocket) buffer length &key)
           79 ;;   (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer
           80 ;;                    (integer 0)                          ; size
           81 ;;                    (unsigned-byte 32)                   ; host
           82 ;;                    (unsigned-byte 16)))                 ; port
           83 ;;   (let ((s (socket socket)))
           84 ;;     (let ((real-buffer (or buffer
           85 ;;                            (make-array length :element-type '(unsigned-byte 8))))
           86 ;;           (real-length (or length
           87 ;;                            (length buffer))))
           88 ;;       (multiple-value-bind (result errno remote-host remote-port)
           89 ;;           (ext:inet-socket-receive-from s real-buffer real-length)
           90 ;;         (if result
           91 ;;             (values real-buffer result remote-host remote-port)
           92 ;;             (mocl-map-socket-error errno :socket socket))))))
           93 
           94 ;; (defmethod get-local-name ((usocket usocket))
           95 ;;   (multiple-value-bind (address port)
           96 ;;       (with-mapped-conditions (usocket)
           97 ;;         (ext:get-socket-host-and-port (socket usocket)))
           98 ;;     (values (hbo-to-vector-quad address) port)))
           99 
          100 ;; (defmethod get-peer-name ((usocket stream-usocket))
          101 ;;   (multiple-value-bind (address port)
          102 ;;       (with-mapped-conditions (usocket)
          103 ;;         (ext:get-peer-host-and-port (socket usocket)))
          104 ;;     (values (hbo-to-vector-quad address) port)))
          105 
          106 ;; (defmethod get-local-address ((usocket usocket))
          107 ;;   (nth-value 0 (get-local-name usocket)))
          108 
          109 ;; (defmethod get-peer-address ((usocket stream-usocket))
          110 ;;   (nth-value 0 (get-peer-name usocket)))
          111 
          112 ;; (defmethod get-local-port ((usocket usocket))
          113 ;;   (nth-value 1 (get-local-name usocket)))
          114 
          115 ;; (defmethod get-peer-port ((usocket stream-usocket))
          116 ;;   (nth-value 1 (get-peer-name usocket)))
          117 
          118 
          119 ;; (defun get-host-by-address (address)
          120 ;;   (multiple-value-bind (host errno)
          121 ;;       (ext:lookup-host-entry (host-byte-order address))
          122 ;;     (cond (host
          123 ;;            (ext:host-entry-name host))
          124 ;;           (t
          125 ;;            (let ((condition (cdr (assoc errno +unix-ns-error-map+))))
          126 ;;              (cond (condition
          127 ;;                     (error condition :host-or-ip address))
          128 ;;                    (t
          129 ;;                     (error 'ns-unknown-error :host-or-ip address
          130 ;;                            :real-error errno))))))))
          131 
          132 (defun get-hosts-by-name (name)
          133   (rt::lookup-host name))
          134 
          135 ;; (defun get-host-name ()
          136 ;;   (unix:unix-gethostname))
          137 
          138 
          139 ;;
          140 ;;
          141 ;;  WAIT-LIST part
          142 ;;
          143 
          144 
          145 (defun %add-waiter (wl waiter)
          146   (declare (ignore wl waiter)))
          147 
          148 (defun %remove-waiter (wl waiter)
          149   (declare (ignore wl waiter)))
          150 
          151 (defun %setup-wait-list (wl)
          152   (declare (ignore wl)))
          153 
          154 (defun wait-for-input-internal (wait-list &key timeout)
          155   (unimplemented 'wait-for-input-internal 'mocl))