VSF Documented
socket.h
Go to the documentation of this file.
1#ifndef __VSF_LINUX_SYS_SOCKET_H__
2#define __VSF_LINUX_SYS_SOCKET_H__
3
5
6#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
7# include "../sys/types.h"
8#else
9# include <sys/types.h>
10#endif
11// for stdint.h
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#define SOMAXCONN 256
19
20#define SCM_RIGHTS 0x01
21#define SCM_CREDENTIALS 0x02
22#define SCM_SECURITY 0x03
23
24// protocol families
25// refer: https://code.woboq.org/gtk/include/bits/socket.h.html
26#define PF_UNSPEC 0
27#define PF_LOCAL 1
28#define PF_UNIX PF_LOCAL
29#define PF_INET 2
30#define PF_INET6 10
31#define PF_PACKET 17
32
33// standard address families
34#define AF_UNSPEC PF_UNSPEC
35#define AF_LOCAL PF_LOCAL
36#define AF_UNIX PF_UNIX
37#define AF_FILE PF_FILE
38#define AF_INET PF_INET
39#define AF_INET6 PF_INET6
40#define AF_PACKET PF_PACKET
41
42#define SOL_IP IPPROTO_IP
43#define SOL_TCP IPPROTO_TCP
44#define SOL_UDP IPPROTO_UDP
45
46#define IP_TOS 1
47#define IP_TTL 2
48#define IP_HDRINCL 3
49#define IP_OPTIONS 4
50
58};
59#define SOCK_MAX (SOCK_PACKET + 1)
60
61// flags for socket/socketpair/accept4
62#define SOCK_CLOEXEC O_CLOEXEC
63#define SOCK_NONBLOCK O_NONBLOCK
64
65#define INVALID_SOCKET -1
66#define SOCKET_ERROR -1
67
69#define __socklen_t_defined
70
72struct sockaddr {
74 char sa_data[32];
75};
78 // TODO: need to be larger?
79 char sa_data[32];
80};
81
82struct linger {
85};
86
87#if VSF_LINUX_SOCKET_CFG_WRAPPER == ENABLED
88#define VSF_LINUX_SOCKET_WRAPPER(__api) VSF_SHELL_WRAPPER(vsf_linux_socket, __api)
89
90#define setsockopt VSF_LINUX_SOCKET_WRAPPER(setsockopt)
91#define getsockopt VSF_LINUX_SOCKET_WRAPPER(getsockopt)
92
93#define getpeername VSF_LINUX_SOCKET_WRAPPER(getpeername)
94#define getsockname VSF_LINUX_SOCKET_WRAPPER(getsockname)
95
96#define accept VSF_LINUX_SOCKET_WRAPPER(accept)
97#define accept4 VSF_LINUX_SOCKET_WRAPPER(accept4)
98#define bind VSF_LINUX_SOCKET_WRAPPER(bind)
99#define connect VSF_LINUX_SOCKET_WRAPPER(connect)
100#define listen VSF_LINUX_SOCKET_WRAPPER(listen)
101#define recv VSF_LINUX_SOCKET_WRAPPER(recv)
102#define recvmsg VSF_LINUX_SOCKET_WRAPPER(recvmsg)
103#define recvfrom VSF_LINUX_SOCKET_WRAPPER(recvfrom)
104#define send VSF_LINUX_SOCKET_WRAPPER(send)
105#define sendmsg VSF_LINUX_SOCKET_WRAPPER(sendmsg)
106#define sendto VSF_LINUX_SOCKET_WRAPPER(sendto)
107#define shutdown VSF_LINUX_SOCKET_WRAPPER(shutdown)
108#define socket VSF_LINUX_SOCKET_WRAPPER(socket)
109#define socketpair VSF_LINUX_SOCKET_WRAPPER(socketpair)
110#endif
111
112// syscalls
113
114#define __NR_connect connect
115#define __NR_accept accept
116#define __NR_accept4 accept4
117#define __NR_bind bind
118
119// level for sockopt
120#define SOL_SOCKET 0xFFFF
121// sock options
122// refer: https://code.woboq.org/gtk/include/asm-generic/socket.h.html
123#define SO_DEBUG 1
124#define SO_REUSEADDR 2
125#define SO_TYPE 3
126#define SO_ERROR 4
127#define SO_DONTROUTE 5
128#define SO_BROADCAST 6
129#define SO_SNDBUF 7
130#define SO_RCVBUF 8
131#define SO_KEEPALIVE 9
132#define SO_OOBINLINE 10
133#define SO_NO_CHECK 11
134#define SO_PRIORITY 12
135#define SO_LINGER 13
136#define SO_BSDCOMPAT 14
137#define SO_REUSEPORT 15
138// struct ucred is not implemented
139//#define SO_PASSCRED 16
140//#define SO_PEERCRED 17
141#define SO_RCVLOWAT 18
142#define SO_SNDLOWAT 19
143#define SO_RCVTIMEO 20
144#define SO_SNDTIMEO 21
145#define SO_BINDTODEVICE 25
146#define SO_MAX_PACING_RATE 47
147#define SO_NONBLOCK 100
148
149// IP options
150#define IP_TOS 1
151#define IP_TTL 2
152#define IP_HDRINCL 3
153#define IP_OPTIONS 4
154
155// multicast
156// in.h
157#define IP_MULTICAST_IF 5
158#define IP_MULTICAST_TTL 6
159#define IP_MULTICAST_LOOP 7
160#define IP_ADD_MEMBERSHIP 8
161#define IP_DROP_MEMBERSHIP 9
162#define IP_MULTICAST_ALL 31
163// in6.h
164#define IPV6_UNICAST_HOPS 16
165#define IPV6_MULTICAST_IF 17
166#define IPV6_MULTICAST_HOPS 18
167#define IPV6_MULTICAST_LOOP 19
168#define IPV6_ADD_MEMBERSHIP 20
169#define IPV6_DROP_MEMBERSHIP 21
170
171// flags for send/recv
172enum {
173 MSG_OOB = 1 << 0,
174#define MSG_OOB MSG_OOB
175 MSG_PEEK = 1 << 1,
176#define MSG_PEEK MSG_PEEK
178#define MSG_DONTROUTE MSG_DONTROUTE
179 MSG_TRUNC = 1 << 5,
180#define MSG_TRUNC MSG_TRUNC
181 MSG_DONTWAIT = 1 << 6,
182#define MSG_DONTWAIT MSG_DONTWAIT
183 MSG_WAITALL = 1 << 8,
184#define MSG_WAITALL MSG_WAITALL
185 MSG_NOSIGNAL = 1 << 14,
186#define MSG_NOSIGNAL MSG_NOSIGNAL
187};
188
189struct msghdr {
190 void *msg_name;
192 struct iovec *msg_iov;
197};
198
199#define CMSG_ALIGN(len) (((len)+sizeof(long)-1) & ~(sizeof(long)-1))
200#define CMSG_SPACE(len) (sizeof(struct cmsghdr) + CMSG_ALIGN(len))
201#define CMSG_LEN(len) (sizeof(struct cmsghdr) + (len))
202#define CMSG_DATA(cmsg) (void *)((uint8_t *)(cmsg) + sizeof(struct cmsghdr))
203#define CMSG_FIRSTHDR(msg) \
204 ((msg)->msg_controllen >= sizeof(struct cmsghdr) ? \
205 (struct cmsghdr *)(msg)->msg_control \
206 : (struct cmsghdr *)NULL)
207struct cmsghdr {
208 size_t cmsg_len;
211};
212
213#if __IS_COMPILER_GCC__
214# pragma GCC diagnostic push
215# pragma GCC diagnostic ignored "-Wcast-align"
216#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
217# pragma clang diagnostic push
218# pragma clang diagnostic ignored "-Wcast-align"
219#endif
220
221static inline struct cmsghdr * CMSG_NXTHDR(struct msghdr *__msg, struct cmsghdr *__cmsg)
222{
223 struct cmsghdr * __ptr;
224
225 __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) + CMSG_ALIGN(__cmsg->cmsg_len));
226 if ((unsigned long)((char*)(__ptr+1) - (char *)__msg->msg_control) > __msg->msg_controllen)
227 return (struct cmsghdr *)0;
228
229 return __ptr;
230}
231
232#if __IS_COMPILER_GCC__
233# pragma GCC diagnostic pop
234#elif __IS_COMPILER_LLVM__ || __IS_COMPILER_ARM_COMPILER_6__
235# pragma clang diagnostic pop
236#endif
237
238// how for shutdown
239enum {
240 SHUT_RD = 1 << 0,
241 SHUT_WR = 1 << 1,
243};
244
245#if VSF_LINUX_APPLET_USE_SYS_SOCKET == ENABLED
248
251
254
259
266
270
271 // in6addr_any and in6addr_loopback belongs to <netinet/in.h>, which has no vplt, so add to socket vplt
275# ifndef __VSF_APPLET__
277# endif
278#endif
279
280#if defined(__VSF_APPLET__) && (defined(__VSF_APPLET_LIB__) || defined(__VSF_APPLET_LINUX_SYS_SOCKET_LIB__))\
281 && VSF_APPLET_CFG_ABI_PATCH != ENABLED && VSF_LINUX_APPLET_USE_SYS_SOCKET == ENABLED
282
283#ifndef VSF_LINUX_APPLET_SYS_SOCKET_VPLT
284# if VSF_LINUX_USE_APPLET == ENABLED
285# define VSF_LINUX_APPLET_SYS_SOCKET_VPLT \
286 ((vsf_linux_sys_socket_vplt_t *)(VSF_LINUX_APPLET_VPLT->sys_socket_vplt))
287# else
288# define VSF_LINUX_APPLET_SYS_SOCKET_VPLT \
289 ((vsf_linux_sys_socket_vplt_t *)vsf_vplt((void *)0))
290# endif
291#endif
292
293#define VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(__NAME) \
294 VSF_APPLET_VPLT_ENTRY_FUNC_ENTRY(VSF_LINUX_APPLET_SYS_SOCKET_VPLT, __NAME)
295#define VSF_LINUX_APPLET_SYS_SOCKET_IMP(...) \
296 VSF_APPLET_VPLT_ENTRY_FUNC_IMP(VSF_LINUX_APPLET_SYS_SOCKET_VPLT, __VA_ARGS__)
297
298VSF_LINUX_APPLET_SYS_SOCKET_IMP(setsockopt, int, int sockfd, int level, int optname, const void *optval, socklen_t optlen) {
300 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(setsockopt)(sockfd, level, optname, optval, optlen);
301}
302VSF_LINUX_APPLET_SYS_SOCKET_IMP(getsockopt, int, int sockfd, int level, int optname, void *optval, socklen_t *optlen) {
304 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(getsockopt)(sockfd, level, optname, optval, optlen);
305}
306VSF_LINUX_APPLET_SYS_SOCKET_IMP(getpeername, int, int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
308 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(getpeername)(sockfd, addr, addrlen);
309}
310VSF_LINUX_APPLET_SYS_SOCKET_IMP(getsockname, int, int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
312 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(getsockname)(sockfd, addr, addrlen);
313}
314VSF_LINUX_APPLET_SYS_SOCKET_IMP(accept, int, int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
316 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(accept)(sockfd, addr, addrlen);
317}
318VSF_LINUX_APPLET_SYS_SOCKET_IMP(bind, int, int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
320 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(bind)(sockfd, addr, addrlen);
321}
322VSF_LINUX_APPLET_SYS_SOCKET_IMP(connect, int, int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
324 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(connect)(sockfd, addr, addrlen);
325}
326VSF_LINUX_APPLET_SYS_SOCKET_IMP(listen, int, int sockfd, int backlog) {
328 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(listen)(sockfd, backlog);
329}
330VSF_LINUX_APPLET_SYS_SOCKET_IMP(recv, ssize_t, int sockfd, void *buffer, size_t length, int flags) {
332 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(recv)(sockfd, buffer, length, flags);
333}
334VSF_LINUX_APPLET_SYS_SOCKET_IMP(recvmsg, ssize_t, int sockfd, struct msghdr *msg, int flags) {
336 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(recvmsg)(sockfd, msg, flags);
337}
338VSF_LINUX_APPLET_SYS_SOCKET_IMP(recvfrom, ssize_t, int sockfd, void *buffer, size_t length, int flags, struct sockaddr *src_addr, socklen_t *addrlen) {
340 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(recvfrom)(sockfd, buffer, length, flags, src_addr, addrlen);
341}
342VSF_LINUX_APPLET_SYS_SOCKET_IMP(send, ssize_t, int sockfd, const void *buffer, size_t length, int flags) {
344 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(send)(sockfd, buffer, length, flags);
345}
346VSF_LINUX_APPLET_SYS_SOCKET_IMP(sendmsg, ssize_t, int sockfd, const struct msghdr *msg, int flags) {
348 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(sendmsg)(sockfd, msg, flags);
349}
350VSF_LINUX_APPLET_SYS_SOCKET_IMP(sendto, ssize_t, int sockfd, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) {
352 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(sendto)(sockfd, buffer, length, flags, dest_addr, addrlen);
353}
354VSF_LINUX_APPLET_SYS_SOCKET_IMP(shutdown, int, int sockfd, int how) {
356 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(shutdown)(sockfd, how);
357}
358VSF_LINUX_APPLET_SYS_SOCKET_IMP(socket, int, int domain, int type, int protocol) {
360 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(socket)(domain, type, protocol);
361}
362VSF_LINUX_APPLET_SYS_SOCKET_IMP(socketpair, int, int domain, int type, int protocol, int socket_vector[2]) {
364 return VSF_LINUX_APPLET_SYS_SOCKET_ENTRY(socketpair)(domain, type, protocol, socket_vector);
365}
366
367#else // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_SYS_SOCKET
368
369int setsockopt(int sockfd, int level, int optname, const void *optval,
370 socklen_t optlen);
371int getsockopt(int sockfd, int level, int optname, void *optval,
372 socklen_t *optlen);
373
374int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
375int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
376
377int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
378int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
379int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
380int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
381int listen(int sockfd, int backlog);
382
383ssize_t recv(int sockfd, void *buffer, size_t length, int flags);
384ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
385ssize_t recvfrom(int sockfd, void *buffer, size_t length, int flags,
386 struct sockaddr *src_addr, socklen_t *addrlen);
387ssize_t send(int sockfd, const void *buffer, size_t length, int flags);
388ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
389ssize_t sendto(int sockfd, const void *buffer, size_t length, int flags,
390 const struct sockaddr *dest_addr, socklen_t addrlen);
391
392int shutdown(int sockfd, int how);
393int socket(int domain, int type, int protocol);
394int socketpair(int domain, int type, int protocol, int socket_vector[2]);
395
396#endif // __VSF_APPLET__ && VSF_LINUX_APPLET_USE_SYS_SOCKET
397
398#ifdef __cplusplus
399}
400#endif
401
402#endif
const struct in6_addr in6addr_loopback
Definition vsf_linux_socket.c:72
const struct in6_addr in6addr_any
Definition vsf_linux_socket.c:70
int ssize_t
Definition types.h:68
sock_type
Definition socket.h:51
@ SOCK_DGRAM
Definition socket.h:53
@ SOCK_RDM
Definition socket.h:55
@ SOCK_SEQPACKET
Definition socket.h:56
@ SOCK_RAW
Definition socket.h:54
@ SOCK_PACKET
Definition socket.h:57
@ SOCK_STREAM
Definition socket.h:52
#define MSG_WAITALL
Definition socket.h:184
#define getpeername
Definition socket.h:93
uint16_t sa_family_t
Definition socket.h:71
#define listen
Definition socket.h:100
#define sendmsg
Definition socket.h:105
#define setsockopt
Definition socket.h:90
#define accept
Definition socket.h:96
#define recvfrom
Definition socket.h:103
uint32_t socklen_t
Definition socket.h:68
#define sendto
Definition socket.h:106
__VSF_VPLT_DECORATOR__ vsf_linux_sys_socket_vplt_t vsf_linux_sys_socket_vplt
Definition vsf_linux_socket.c:848
@ SHUT_RD
Definition socket.h:240
@ SHUT_WR
Definition socket.h:241
@ SHUT_RDWR
Definition socket.h:242
#define MSG_PEEK
Definition socket.h:176
#define recvmsg
Definition socket.h:102
#define MSG_TRUNC
Definition socket.h:180
#define getsockopt
Definition socket.h:91
#define accept4
Definition socket.h:97
#define CMSG_ALIGN(len)
Definition socket.h:199
#define MSG_DONTROUTE
Definition socket.h:178
#define MSG_OOB
Definition socket.h:174
#define MSG_NOSIGNAL
Definition socket.h:186
#define getsockname
Definition socket.h:94
#define socket
Definition socket.h:108
#define MSG_DONTWAIT
Definition socket.h:182
#define socketpair
Definition socket.h:109
#define shutdown
Definition socket.h:107
#define connect
Definition socket.h:99
#define recv
Definition socket.h:101
#define bind
Definition socket.h:98
#define send
Definition socket.h:104
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
Definition socket.h:207
int cmsg_type
Definition socket.h:210
size_t cmsg_len
Definition socket.h:208
int cmsg_level
Definition socket.h:209
Definition unistd.h:229
Definition socket.h:82
int l_linger
Definition socket.h:84
int l_onoff
Definition socket.h:83
Definition socket.h:189
struct iovec * msg_iov
Definition socket.h:192
socklen_t msg_namelen
Definition socket.h:191
void * msg_name
Definition socket.h:190
int msg_flags
Definition socket.h:196
size_t msg_controllen
Definition socket.h:195
size_t msg_iovlen
Definition socket.h:193
void * msg_control
Definition socket.h:194
Definition socket.h:76
sa_family_t ss_family
Definition socket.h:77
char sa_data[32]
Definition socket.h:79
Definition socket.h:72
char sa_data[32]
Definition socket.h:74
sa_family_t sa_family
Definition socket.h:73
Definition socket.h:246
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(socketpair)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(setsockopt)
vsf_vplt_info_t info
Definition socket.h:247
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(shutdown)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(getsockopt)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(getpeername)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(recvfrom)
VSF_APPLET_VPLT_ENTRY_VAR_DEF(in6addr_loopback)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(getsockname)
VSF_APPLET_VPLT_ENTRY_VAR_DEF(in6addr_any)
Definition vsf_cfg.h:95
vk_av_control_type_t type
Definition vsf_audio.h:170
#define __VSF_VPLT_DECORATOR__
Definition vsf_cfg.h:93
#define VSF_APPLET_VPLT_ENTRY_FUNC_TRACE()
Definition vsf_cfg.h:165
uint_fast8_t length
Definition vsf_pbuf.c:38