First round of Gray Stream code cleanup.
[iolib.git] / net.sockets / base-sockets.lisp
bloba57f3716db95cbbc3a53bfaa7aebe967bb9f49f9
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; --- Base socket classes.
4 ;;;
6 (in-package :net.sockets)
8 ;;;; Sockets
10 (defclass socket (dual-channel-single-fd-mixin)
11 ((address-family :initarg :address-family :accessor socket-address-family)
12 (protocol :initarg :protocol :accessor socket-protocol)
13 (bound :initform nil :reader socket-bound-p :type boolean))
14 (:documentation "Base class for sockets."))
15 (unset-method-docstring #'socket-address-family () '(socket))
16 (set-function-docstring 'socket-address-family "Return the address family of a socket.")
17 (unset-method-docstring #'socket-protocol () '(socket))
18 (set-function-docstring 'socket-protocol "Return the protocol of a socket.")
20 (defgeneric socket-os-fd (socket)
21 (:documentation "Returns the OS file descriptor of `SOCKET'."))
23 (defgeneric socket-type (socket)
24 (:documentation "Returns the socket type of `SOCKET' - one of :STREAM or :DATAGRAM."))
26 (defgeneric socket-open-p (socket)
27 (:documentation "Returns a boolean indicating whether or not the file descriptor of `SOCKET' is open."))
29 (defgeneric local-name (socket)
30 (:documentation "For INTERNET sockets, returns two values: the local host and the local port.
31 For LOCAL sockets, returns the local filename."))
33 (defgeneric local-host (socket)
34 (:documentation "Returns the local host of `SOCKET'.
35 Works only on INTERNET sockets."))
37 (defgeneric local-port (socket)
38 (:documentation "Returns the local port of `SOCKET' - an (unsigned-byte 16).
39 Works only on INTERNET sockets."))
41 (defgeneric local-filename (socket)
42 (:documentation "Returns the local filename of `SOCKET'.
43 Works only on LOCAL sockets."))
45 (defgeneric remote-name (socket)
46 (:documentation "For INTERNET sockets, returns two values: the remote host and the remote port.
47 For REMOTE sockets, returns the remote filename."))
49 (defgeneric remote-host (socket)
50 (:documentation "Returns the remote host of `SOCKET'.
51 Works only on INTERNET sockets."))
53 (defgeneric remote-port (socket)
54 (:documentation "Returns the remote port of `SOCKET' - an (unsigned-byte 16).
55 Works only on INTERNET sockets."))
57 (defgeneric remote-filename (socket)
58 (:documentation "Returns the remote filename of `SOCKET'.
59 Works only on LOCAL sockets."))
61 (defgeneric socket-option (socket option-name)
62 (:documentation "Returns the value(s) of OS options on `SOCKET'.
63 For a complete list of supported options see net.sockets/socket-options.lisp ."))
65 (defclass stream-socket (socket) ()
66 (:default-initargs :type :stream)
67 (:documentation "Mixin for sockets of type SOCK_STREAM."))
69 (defclass datagram-socket (socket) ()
70 (:default-initargs :type :datagram)
71 (:documentation "Mixin for sockets of type SOCK_DGRAM."))
73 (defgeneric disconnect (socket)
74 (:documentation "Disassociates `SOCKET' from any remote address.
75 Works only on DATAGRAM sockets."))
77 (define-symbol-macro +default-inet-address-family+
78 (if *ipv6* :ipv6 :ipv4))
80 (defclass internet-socket (socket) ()
81 (:default-initargs :address-family +default-inet-address-family+)
82 (:documentation "Mixin for sockets of domain AF_INET or AF_INET6."))
84 (defclass local-socket (socket) ()
85 (:default-initargs :address-family :local)
86 (:documentation "Mixin for sockets of domain AF_LOCAL."))
88 (defgeneric send-file-descriptor (socket file-descriptor)
89 (:documentation "Send `FILE-DESCRIPTOR' through `SOCKET'.
90 The receiving process must use RECEIVE-FILE-DESCRIPTOR to receive the
91 file descriptor in order for it to be valid in the receiving process."))
93 (defgeneric receive-file-descriptor (socket)
94 (:documentation "Receive a file descriptor as ancillary data through `SOCKET'."))
96 (defclass active-socket (socket dual-channel-gray-stream) ()
97 (:default-initargs :read-fn 'socket-read-fn
98 :write-fn 'socket-write-fn)
99 (:documentation "Mixin class for active(client) sockets."))
101 (defgeneric connect (socket address &key &allow-other-keys)
102 (:documentation "Connects `SOCKET' to `ADDRESS'. For INTERNET sockets you can specify
103 the port to connect to using keyword argument `PORT'. The default value of `PORT' is 0,
104 which usually means letting the OS choose a random port to connect to.
105 For `INTERNET' sockets, if `WAIT' is true and a connection cannot be established within
106 `TIMEOUT' seconds signal `IOMUX:POLL-TIMEOUT', but it works only with non-blocking sockets."))
108 (defgeneric socket-connected-p (socket)
109 (:documentation "Returns a boolean specifying whether or not `SOCKET' is connected."))
111 (defgeneric shutdown (socket &key read write)
112 (:documentation "Shut down all or part of a connection. If `READ' it non-NIL, further receptions are
113 disallowed; if `WRITE' is non-NIL, further transmissions are disallowed. CLOSE must still be called on
114 `SOCKET' in order to release OS resources."))
116 (defgeneric receive-from (socket &rest args &key &allow-other-keys)
117 (:documentation "Receives data from `SOCKET'. If `BUFFER' is specified
118 `START' and `END' are used as bounding index. In that case `BUFFER' must be
119 an array and its ARRAY-ELEMENT-TYPE be either (UNSIGNED-BYTE 8) or T.
120 If `BUFFER' is not specified an (UNSIGNED-BYTE 8) buffer of size `SIZE'
121 will be allocated.
123 Some flags can also be passed to recvfrom(2):
124 * `OUT-OF-BAND' for receiving out-of-band data - only for stream sockets
125 * `PEEK' for keeping the returned data in the kernel buffers
126 * `WAIT-ALL' for waiting until the entire buffer can be filled
127 * `DONT-WAIT' for making only the current call non-blocking
129 The first two values returned are the buffer and the number of elements that have been copied into the buffer.
130 For INTERNET DATAGRAM sockets, two additional values are returned: the host and port of the remote peer
131 from which the data was received.
132 For LOCAL DATAGRAM sockets, one additional values is returned: the filename of the remote peer
133 from which the data was received."))
135 (defgeneric send-to (socket buffer &rest args &key &allow-other-keys)
136 (:documentation "Send the contents of `BUFFER' to `SOCKET'.
137 `BUFFER' must be a vector that can be coerced to a (SIMPLE-ARRAY (UNSIGNED-BYTE 8) *).
138 `START' and `END' are used a bounding index on `BUFFER'.
139 For disconnected datagram sockets, `REMOTE-HOST' and `REMOTE-PORT' or `REMOTE-FILENAME' are used
140 as destination for the data.
142 Some flags can also be passed to sendto(2):
143 * `OUT-OF-BAND' for receiving out-of-band data - only for stream sockets
144 * `DONT-WAIT' for making only the current call non-blocking
145 * `DONT-ROUTE' for sending only to hosts on directly connected networks, not using gateways
146 * `CONFIRM' for signalling progress on the link layer - only available on Linux and only with DATAGRAM sockets
147 * `MORE' for telling the kernel that there is more data to send - only available on Linux
149 Returns the number of bytes sent."))
151 (defclass passive-socket (socket)
152 ((listening :initform nil :reader socket-listening-p :type boolean)
153 (external-format :initarg :external-format :reader external-format-of)
154 (active-class :initarg :active-class :reader active-class
155 :type symbol :allocation :class))
156 (:default-initargs :external-format :default)
157 (:documentation "Mixin class for passive(server) sockets."))
159 (defgeneric bind-address (socket address &key &allow-other-keys)
160 (:documentation "Sets the local address of `SOCKET' to `ADDRESS'(and `PORT' for INTERNET sockets).
161 `REUSE-ADDRESS' sets the SO_REUSEADDR socket option on `SOCKET'."))
163 (defgeneric listen-on (socket &key &allow-other-keys)
164 (:documentation "Start allowing incoming connections on `SOCKET'.
165 `BACKLOG' specifies the maximum length of the queue of pending connections."))
167 (defgeneric accept-connection (passive-socket &key &allow-other-keys)
168 (:documentation "Returns one connection from the queue of pending connections on `SOCKET'.
169 If `WAIT' is true, waits until a connection is received or `TIMEOUT' expires in which case returns NIL.
170 If `WAIT' is false and there are no pending connections return NIL.
171 `EXTERNAL-FORMAT' optionally specifies the external format of the new socket - the default being
172 that of `SOCKET'. Buffer sizes for the new socket can also be specified using `INPUT-BUFFER-SIZE'
173 and `OUTPUT-BUFFER-SIZE'."))
175 (defclass socket-stream-internet-active
176 (active-socket stream-socket internet-socket) ()
177 (:documentation "Class representing active sockets of type SOCK_STREAM and domain AF_INET or AF_INET6."))
179 (defclass socket-stream-internet-passive
180 (passive-socket stream-socket internet-socket) ()
181 (:default-initargs :active-class 'socket-stream-internet-active)
182 (:documentation "Class representing passive sockets of type SOCK_STREAM and domain AF_INET or AF_INET6."))
184 (defclass socket-stream-local-active
185 (active-socket stream-socket local-socket) ()
186 (:documentation "Class representing active sockets of type SOCK_STREAM and domain AF_LOCAL."))
188 (defclass socket-stream-local-passive
189 (passive-socket stream-socket local-socket) ()
190 (:default-initargs :active-class 'socket-stream-local-active)
191 (:documentation "Class representing passive sockets of type SOCK_STREAM and domain AF_LOCAL."))
193 (defclass socket-datagram-internet-active
194 (active-socket datagram-socket internet-socket) ()
195 (:documentation "Class representing active sockets of type SOCK_DGRAM and domain AF_INET or AF_INET6."))
197 (defclass socket-datagram-local-active
198 (active-socket datagram-socket local-socket) ()
199 (:documentation "Class representing active sockets of type SOCK_DGRAM and domain AF_LOCAL."))