Conditionally compile Netlink helpers and classes only on Linux
[iolib.git] / src / sockets / bsd.lisp
bloba326cfaca094cea62a966ac72b87bccef5810c8a
1 ;;;; -*- Mode: Lisp; indent-tabs-mode: nil -*-
2 ;;;
3 ;;; --- Bindings for BSD sockets.
4 ;;;
6 (in-package :iolib.sockets)
8 (defmacro define-socket-creation-call (name return-type &body args)
9 `(defsyscall ,name
10 (,return-type
11 :error-generator signal-socket-error)
12 ,@args))
14 (defmacro define-socket-call (name return-type &body args)
15 (let ((forms (alexandria:parse-body args)))
16 `(defsyscall ,name
17 (,return-type
18 :handle ,(caar forms) ; the socket FD
19 :error-generator signal-socket-error)
20 ,@forms)))
23 ;;;; sys/socket.h
25 (define-socket-call (%accept "accept") :int
26 (socket :int)
27 (address :pointer) ; sockaddr-foo
28 (addrlen :pointer))
30 (define-socket-call (%bind "bind") :int
31 (socket :int)
32 (address :pointer)
33 (addrlen socklen-t))
35 (define-socket-call (%connect "connect") :int
36 (socket :int)
37 (address :pointer) ; sockaddr-foo
38 (addrlen socklen-t))
40 (define-socket-call (%getpeername "getpeername") :int
41 (socket :int)
42 (address :pointer)
43 (addrlen :pointer))
45 (define-socket-call (%getsockname "getsockname") :int
46 (socket :int)
47 (address :pointer)
48 (addrlen :pointer))
50 (define-socket-call (%getsockopt "getsockopt") :int
51 (socket :int)
52 (level :int)
53 (optname :int)
54 (optval :pointer)
55 (optlen :pointer))
57 (define-socket-call (%listen "listen") :int
58 (socket :int)
59 (backlog :int))
61 (define-socket-call (%recvfrom "recvfrom") ssize-t
62 (socket :int)
63 (buffer :pointer)
64 (length size-t)
65 (flags :int)
66 (address :pointer)
67 (addrlen :pointer))
69 (define-socket-call (%sendto "sendto") ssize-t
70 (socket :int)
71 (buffer :pointer)
72 (length size-t)
73 (flags :int)
74 (destaddr :pointer)
75 (destlen socklen-t))
77 (define-socket-call (%recvmsg "recvmsg") ssize-t
78 (socket :int)
79 (message :pointer)
80 (flags :int))
82 (define-socket-call (%sendmsg "sendmsg") ssize-t
83 (socket :int)
84 (message :pointer)
85 (flags :int))
87 (define-socket-call (%setsockopt "setsockopt") :int
88 (socket :int)
89 (level :int)
90 (optname :int)
91 (optval :pointer)
92 (optlen socklen-t))
94 (define-socket-call (%shutdown "shutdown") :int
95 (socket :int)
96 (how :int))
98 ;;; SOCKET is emulated in winsock.lisp.
99 (define-socket-creation-call (%socket "socket") :int
100 (domain :int) ; af-*
101 (type :int) ; sock-*
102 (protocol :int))
104 #-(and) ; unused
105 (define-socket-call (%sockatmark "sockatmark") :int
106 (socket :int))
108 (define-socket-creation-call (%%socketpair "socketpair") :int
109 (domain :int) ; af-*
110 (type :int) ; sock-*
111 (protocol :int) ; usually 0 - "default protocol", whatever that is
112 (filedes :pointer))
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))))
120 ;;;; netinet/un.h
122 (defconstant unix-path-max
123 (- (isys:sizeof 'sockaddr-un) (foreign-slot-offset 'sockaddr-un 'path)))
125 ;;;; net/if.h
127 (defsyscall (%if-nametoindex "if_nametoindex")
128 (:unsigned-int
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)))
133 (ifname :string))
135 (defsyscall (%if-indextoname "if_indextoname")
136 :string
137 (ifindex :unsigned-int)
138 (ifname :pointer))
140 (defsyscall (%if-nameindex "if_nameindex")
141 :pointer)
143 (defsyscall (%if-freenameindex "if_freenameindex") :void
144 (ptr :pointer))