1 // SPDX-License-Identifier: MIT
3 Copyright (c) 2007, 2008 by Juliusz Chroboczek
13 #include <sys/ioctl.h>
14 #include <sys/types.h>
16 #include <sys/socket.h>
17 #include <netinet/in.h>
18 #include <netinet/in_systm.h>
19 #include <netinet/ip.h>
20 #include <arpa/inet.h>
29 babel_socket(int port
)
31 struct sockaddr_in6 sin6
;
34 int one
= 1, zero
= 0;
36 s
= socket(PF_INET6
, SOCK_DGRAM
, 0);
40 rc
= setsockopt(s
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
44 rc
= setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
48 rc
= setsockopt(s
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
,
53 rc
= setsockopt(s
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
,
58 rc
= setsockopt(s
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
,
63 setsockopt_ipv6_tclass (s
, IPTOS_PREC_INTERNETCONTROL
);
65 rc
= fcntl(s
, F_GETFL
, 0);
69 rc
= fcntl(s
, F_SETFL
, (rc
| O_NONBLOCK
));
73 rc
= fcntl(s
, F_GETFD
, 0);
77 rc
= fcntl(s
, F_SETFD
, rc
| FD_CLOEXEC
);
81 memset(&sin6
, 0, sizeof(sin6
));
82 sin6
.sin6_family
= AF_INET6
;
83 sin6
.sin6_port
= htons(port
);
84 rc
= bind(s
, (struct sockaddr
*)&sin6
, sizeof(sin6
));
98 babel_recv(int s
, void *buf
, int buflen
, struct sockaddr
*sin
, int slen
)
104 memset(&msg
, 0, sizeof(msg
));
105 iovec
.iov_base
= buf
;
106 iovec
.iov_len
= buflen
;
108 msg
.msg_namelen
= slen
;
109 msg
.msg_iov
= &iovec
;
112 rc
= recvmsg(s
, &msg
, 0);
118 void *buf1
, int buflen1
, void *buf2
, int buflen2
,
119 struct sockaddr
*sin
, int slen
)
121 struct iovec iovec
[2];
125 iovec
[0].iov_base
= buf1
;
126 iovec
[0].iov_len
= buflen1
;
127 iovec
[1].iov_base
= buf2
;
128 iovec
[1].iov_len
= buflen2
;
129 memset(&msg
, 0, sizeof(msg
));
131 msg
.msg_namelen
= slen
;
136 rc
= sendmsg(s
, &msg
, 0);
140 else if(errno
== EAGAIN
) {
142 rc2
= wait_for_fd(1, s
, 5);
152 tcp_server_socket(int port
, int local
)
154 struct sockaddr_in6 sin6
;
155 int s
, rc
, saved_errno
;
158 s
= socket(PF_INET6
, SOCK_STREAM
, 0);
162 rc
= setsockopt(s
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
166 rc
= fcntl(s
, F_GETFL
, 0);
170 rc
= fcntl(s
, F_SETFL
, (rc
| O_NONBLOCK
));
174 rc
= fcntl(s
, F_GETFD
, 0);
178 rc
= fcntl(s
, F_SETFD
, rc
| FD_CLOEXEC
);
182 memset(&sin6
, 0, sizeof(sin6
));
183 sin6
.sin6_family
= AF_INET6
;
184 sin6
.sin6_port
= htons(port
);
186 rc
= inet_pton(AF_INET6
, "::1", &sin6
.sin6_addr
);
190 rc
= bind(s
, (struct sockaddr
*)&sin6
, sizeof(sin6
));