156 lines
5.4 KiB
Common Lisp
156 lines
5.4 KiB
Common Lisp
|
|
;;;; See LICENSE for licensing information.
|
||
|
|
|
||
|
|
(in-package :usocket)
|
||
|
|
|
||
|
|
(defun handle-condition (condition &optional (socket nil) (host-or-ip nil))
|
||
|
|
"Dispatch correct usocket condition."
|
||
|
|
(declare (ignore socket))
|
||
|
|
(signal condition))
|
||
|
|
|
||
|
|
(defun socket-connect (host port &key (protocol :stream) (element-type 'character)
|
||
|
|
timeout deadline (nodelay t nodelay-specified)
|
||
|
|
(local-host nil local-host-p)
|
||
|
|
(local-port nil local-port-p))
|
||
|
|
(when (and nodelay-specified
|
||
|
|
(not (eq nodelay :if-supported)))
|
||
|
|
(unsupported 'nodelay 'socket-connect))
|
||
|
|
(when deadline (unsupported 'deadline 'socket-connect))
|
||
|
|
(when timeout (unimplemented 'timeout 'socket-connect))
|
||
|
|
(when local-host-p
|
||
|
|
(unimplemented 'local-host 'socket-connect))
|
||
|
|
(when local-port-p
|
||
|
|
(unimplemented 'local-port 'socket-connect))
|
||
|
|
|
||
|
|
(let (socket)
|
||
|
|
(ecase protocol
|
||
|
|
(:stream
|
||
|
|
(setf socket (rt::socket-connect host port))
|
||
|
|
(let ((stream (rt::make-socket-stream socket :binaryp (not (eq element-type 'character)))))
|
||
|
|
(make-stream-socket :socket socket :stream stream)))
|
||
|
|
(:datagram
|
||
|
|
(error 'unsupported
|
||
|
|
:feature '(protocol :datagram)
|
||
|
|
:context 'socket-connect)))))
|
||
|
|
|
||
|
|
(defun socket-listen (host port
|
||
|
|
&key reuseaddress
|
||
|
|
(reuse-address nil reuse-address-supplied-p)
|
||
|
|
(backlog 5)
|
||
|
|
(element-type 'character))
|
||
|
|
(unimplemented 'socket-listen 'mocl))
|
||
|
|
|
||
|
|
(defmethod socket-accept ((usocket stream-server-usocket) &key element-type)
|
||
|
|
(unimplemented 'socket-accept 'mocl))
|
||
|
|
|
||
|
|
;; Sockets and their associated streams are modelled as
|
||
|
|
;; different objects. Be sure to close the socket stream
|
||
|
|
;; when closing stream-sockets; it makes sure buffers
|
||
|
|
;; are flushed and the socket is closed correctly afterwards.
|
||
|
|
(defmethod socket-close ((usocket usocket))
|
||
|
|
"Close socket."
|
||
|
|
(rt::socket-shutdown usocket)
|
||
|
|
(rt::c-fclose usocket))
|
||
|
|
|
||
|
|
(defmethod socket-close ((usocket stream-usocket))
|
||
|
|
"Close socket."
|
||
|
|
(close (socket-stream usocket)))
|
||
|
|
|
||
|
|
;; (defmethod socket-close :after ((socket datagram-usocket))
|
||
|
|
;; (setf (%open-p socket) nil))
|
||
|
|
|
||
|
|
(defmethod socket-shutdown ((usocket stream-usocket) direction)
|
||
|
|
(declare (ignore usocket direction))
|
||
|
|
;; sure would be nice if there was some documentation for mocl...
|
||
|
|
(unimplemented "shutdown" 'socket-shutdown))
|
||
|
|
|
||
|
|
;; (defmethod socket-send ((usocket datagram-usocket) buffer size &key host port)
|
||
|
|
;; (let ((s (socket usocket))
|
||
|
|
;; (host (if host (host-to-hbo host)))
|
||
|
|
;; (real-buffer (if (zerop offset)
|
||
|
|
;; buffer
|
||
|
|
;; (subseq buffer offset (+ offset size)))))
|
||
|
|
;; (multiple-value-bind (result errno)
|
||
|
|
;; (ext:inet-socket-send-to s real-buffer size
|
||
|
|
;; :remote-host host :remote-port port)
|
||
|
|
;; (or result
|
||
|
|
;; (mocl-map-socket-error errno :socket usocket)))))
|
||
|
|
|
||
|
|
;; (defmethod socket-receive ((socket datagram-usocket) buffer length &key)
|
||
|
|
;; (declare (values (simple-array (unsigned-byte 8) (*)) ; buffer
|
||
|
|
;; (integer 0) ; size
|
||
|
|
;; (unsigned-byte 32) ; host
|
||
|
|
;; (unsigned-byte 16))) ; port
|
||
|
|
;; (let ((s (socket socket)))
|
||
|
|
;; (let ((real-buffer (or buffer
|
||
|
|
;; (make-array length :element-type '(unsigned-byte 8))))
|
||
|
|
;; (real-length (or length
|
||
|
|
;; (length buffer))))
|
||
|
|
;; (multiple-value-bind (result errno remote-host remote-port)
|
||
|
|
;; (ext:inet-socket-receive-from s real-buffer real-length)
|
||
|
|
;; (if result
|
||
|
|
;; (values real-buffer result remote-host remote-port)
|
||
|
|
;; (mocl-map-socket-error errno :socket socket))))))
|
||
|
|
|
||
|
|
;; (defmethod get-local-name ((usocket usocket))
|
||
|
|
;; (multiple-value-bind (address port)
|
||
|
|
;; (with-mapped-conditions (usocket)
|
||
|
|
;; (ext:get-socket-host-and-port (socket usocket)))
|
||
|
|
;; (values (hbo-to-vector-quad address) port)))
|
||
|
|
|
||
|
|
;; (defmethod get-peer-name ((usocket stream-usocket))
|
||
|
|
;; (multiple-value-bind (address port)
|
||
|
|
;; (with-mapped-conditions (usocket)
|
||
|
|
;; (ext:get-peer-host-and-port (socket usocket)))
|
||
|
|
;; (values (hbo-to-vector-quad address) port)))
|
||
|
|
|
||
|
|
;; (defmethod get-local-address ((usocket usocket))
|
||
|
|
;; (nth-value 0 (get-local-name usocket)))
|
||
|
|
|
||
|
|
;; (defmethod get-peer-address ((usocket stream-usocket))
|
||
|
|
;; (nth-value 0 (get-peer-name usocket)))
|
||
|
|
|
||
|
|
;; (defmethod get-local-port ((usocket usocket))
|
||
|
|
;; (nth-value 1 (get-local-name usocket)))
|
||
|
|
|
||
|
|
;; (defmethod get-peer-port ((usocket stream-usocket))
|
||
|
|
;; (nth-value 1 (get-peer-name usocket)))
|
||
|
|
|
||
|
|
|
||
|
|
;; (defun get-host-by-address (address)
|
||
|
|
;; (multiple-value-bind (host errno)
|
||
|
|
;; (ext:lookup-host-entry (host-byte-order address))
|
||
|
|
;; (cond (host
|
||
|
|
;; (ext:host-entry-name host))
|
||
|
|
;; (t
|
||
|
|
;; (let ((condition (cdr (assoc errno +unix-ns-error-map+))))
|
||
|
|
;; (cond (condition
|
||
|
|
;; (error condition :host-or-ip address))
|
||
|
|
;; (t
|
||
|
|
;; (error 'ns-unknown-error :host-or-ip address
|
||
|
|
;; :real-error errno))))))))
|
||
|
|
|
||
|
|
(defun get-hosts-by-name (name)
|
||
|
|
(rt::lookup-host name))
|
||
|
|
|
||
|
|
;; (defun get-host-name ()
|
||
|
|
;; (unix:unix-gethostname))
|
||
|
|
|
||
|
|
|
||
|
|
;;
|
||
|
|
;;
|
||
|
|
;; WAIT-LIST part
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
(defun %add-waiter (wl waiter)
|
||
|
|
(declare (ignore wl waiter)))
|
||
|
|
|
||
|
|
(defun %remove-waiter (wl waiter)
|
||
|
|
(declare (ignore wl waiter)))
|
||
|
|
|
||
|
|
(defun %setup-wait-list (wl)
|
||
|
|
(declare (ignore wl)))
|
||
|
|
|
||
|
|
(defun wait-for-input-internal (wait-list &key timeout)
|
||
|
|
(unimplemented 'wait-for-input-internal 'mocl))
|