1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; indent-tabs-mode: nil -*-
3 ;;; --- Bindings for BSD sockets.
6 (in-package :iolib.sockets
)
8 (defmacro define-socket-creation-call
(name return-type
&body args
)
11 :error-generator signal-socket-error
)
14 (defmacro define-socket-call
(name return-type
&body args
)
15 (let ((forms (alexandria:parse-body args
)))
18 :handle
,(caar forms
) ; the socket FD
19 :error-generator signal-socket-error
)
25 (define-socket-call ("accept" %accept
) :int
27 (address :pointer
) ; sockaddr-foo
30 (define-socket-call ("bind" %bind
) :int
35 (define-socket-call ("connect" %connect
) :int
37 (address :pointer
) ; sockaddr-foo
40 (define-socket-call ("getpeername" %getpeername
) :int
45 (define-socket-call ("getsockname" %getsockname
) :int
50 (define-socket-call ("getsockopt" %getsockopt
) :int
57 (define-socket-call ("listen" %listen
) :int
61 (define-socket-call ("recvfrom" %recvfrom
) ssize-t
69 (define-socket-call ("sendto" %sendto
) ssize-t
77 (define-socket-call ("recvmsg" %recvmsg
) ssize-t
82 (define-socket-call ("sendmsg" %sendmsg
) ssize-t
87 (define-socket-call ("setsockopt" %setsockopt
) :int
94 (define-socket-call ("shutdown" %shutdown
) :int
98 ;;; SOCKET is emulated in winsock.lisp.
99 (define-socket-creation-call ("socket" %socket
) :int
105 (define-socket-call ("sockatmark" %sockatmark
) :int
108 (define-socket-creation-call ("socketpair" %%socketpair
) :int
111 (protocol :int
) ; usually 0 - "default protocol", whatever that is
114 (defun %socketpair
(domain type protocol
)
115 (with-foreign-object (filedes :int
2)
116 (%%socketpair domain type protocol filedes
)
117 (values (mem-aref filedes
:int
0)
118 (mem-aref filedes
:int
1))))
122 (defconstant unix-path-max
123 (- size-of-sockaddr-un
(foreign-slot-offset 'sockaddr-un
'path
)))
127 (defsyscall ("if_nametoindex" %if-nametoindex
)
129 :error-predicate zerop
130 :error-generator
(lambda (r syscall h h2
)
131 (declare (ignore r h h2
))
132 (isys:signal-syscall-error-kw
:enxio syscall
)))
135 (defsyscall ("if_indextoname" %if-indextoname
)
137 (ifindex :unsigned-int
)
140 (defsyscall ("if_nameindex" %if-nameindex
)
143 (defsyscall ("if_freenameindex" %if-freenameindex
) :void