Fix if_nametoindex() too
[iolib.git] / src / sockets / bsd.lisp
blob15e7023157a2d31e25a1811e76a7b4af3005d2aa
1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-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 (- size-of-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))