1 ;;;; -*- Mode: 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 (- (isys:sizeof
'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