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