57 #include <sys/types.h> 58 #include <sys/socket.h> 59 #include <sys/ioctl.h> 61 #include <netinet/in.h> 62 #include <arpa/inet.h> 67 # include <winsock2.h> 68 # include <ws2tcpip.h> 70 # if defined(IPPROTO_IPV6) || (_WIN32_WINNT >= 0x0501) 84 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY 88 #define INVALID_SOCKET ((su_socket_t)INVALID_SOCKET) 91 #define SOCKET_ERROR SOCKET_ERROR 97 #if SYMBIAN && !defined(MSG_NOSIGNAL) 98 #define MSG_NOSIGNAL (0) 100 #elif SU_HAVE_WINSOCK 106 #define MSG_NOSIGNAL (0) 111 #define SU_MAXHOST (1025) 113 #define SU_MAXSERV (25) 116 #define SU_ADDRSIZE (48) 118 #define SU_SERVSIZE (16) 120 #define SU_SUCCESS su_success 121 #define SU_FAILURE su_failure 127 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY 129 #elif SU_HAVE_WINSOCK 133 #if !SU_HAVE_SOCKADDR_STORAGE 137 #define _SS_MAXSIZE 128 138 #define _SS_ALIGNSIZE (sizeof(int64_t)) 139 #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(u_char) * 2) 140 #define _SS_PAD2SIZE (_SS_MAXSIZE - sizeof(u_char) * 2 - \ 141 _SS_PAD1SIZE - _SS_ALIGNSIZE) 143 struct sockaddr_storage {
144 #if SU_HAVE_SOCKADDR_SA_LEN 145 unsigned char ss_len;
146 unsigned char ss_family;
148 unsigned short ss_family;
150 char __ss_pad1[_SS_PAD1SIZE];
152 char __ss_pad2[_SS_PAD2SIZE];
158 #ifdef DOCUMENTATION_ONLY 164 #if SU_HAVE_SOCKADDR_SA_LEN 165 #define su_len su_sa.sa_len 167 #define su_len su_array[0] 169 #define su_family su_sa.sa_family 170 #define su_port su_sin.sin_port 176 struct sockaddr su_sa;
177 struct sockaddr_in su_sin;
179 struct sockaddr_in6 su_sin6;
181 #ifdef DOCUMENTATION_ONLY 184 #define su_scope_id su_array32[6] 190 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY 250 #define SU_IOVECLEN_MAX SIZE_MAX 262 #define SU_IOVECLEN_MAX ULONG_MAX 313 #define su_ioctl ioctl 318 #define su_is_blocking(e) \ 319 ((e) == EINPROGRESS || (e) == EAGAIN || (e) == EWOULDBLOCK) 323 SOFIAPUBFUN int su_inet_pton(
int af,
char const *src,
void *dst);
324 SOFIAPUBFUN const char *su_inet_ntop(
int af,
void const *src,
325 char *dst,
size_t size);
327 su_send(
su_socket_t s,
void *buffer,
size_t length,
int flags),
328 su_sendto(
su_socket_t s,
void *buffer,
size_t length,
int flags,
330 su_recv(
su_socket_t s,
void *buffer,
size_t length,
int flags),
331 su_recvfrom(
su_socket_t s,
void *buffer,
size_t length,
int flags,
337 return (
uint16_t)(((s & 255) << 8) | ((s & 0xff00) >> 8));
343 return ((l & 0xff) << 24) | ((l & 0xff00) << 8)
344 | ((l & 0xff0000) >> 8) | ((l & 0xff000000U) >> 24);
347 #define ntohs su_ntohs 348 #define htons su_ntohs 349 #define ntohl su_ntohl 350 #define htonl su_ntohl 353 #define su_inet_pton inet_pton 354 #define su_inet_ntop inet_ntop 355 #define su_send(s,b,l,f) send((s),(b),(l),(f)) 356 #define su_sendto(s,b,l,f,a,L) sendto((s),(b),(l),(f),(void const*)(a),(L)) 357 #define su_recv(s,b,l,f) recv((s),(b),(l),(f)) 358 #define su_recvfrom(s,b,l,f,a,L) recvfrom((s),(b),(l),(f),(void *)(a),(L)) 365 #define getuid() (0x505) 369 #define IPPROTO_SCTP (132) 381 #define SU_ADDR(su) \ 382 ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \ 383 ((su)->su_family == AF_INET6 ? (void *)&(su)->su_sin6.sin6_addr : \ 384 (void *)&(su)->su_sa.sa_data)) 386 #define SU_ADDR(su) \ 387 ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \ 388 (void *)&(su)->su_sa.sa_data) 397 #define SU_ADDRLEN(su) \ 398 ((su)->su_family == AF_INET \ 399 ? (socklen_t)sizeof((su)->su_sin.sin_addr) : \ 400 ((su)->su_family == AF_INET6 \ 401 ? (socklen_t)sizeof((su)->su_sin6.sin6_addr) \ 402 : (socklen_t)sizeof((su)->su_sa.sa_data))) 404 #define SU_ADDRLEN(su) \ 405 ((su)->su_family == AF_INET \ 406 ? (socklen_t)sizeof((su)->su_sin.sin_addr) \ 407 : (socklen_t)sizeof((su)->su_sa.sa_data)) 412 #define SU_HAS_INADDR_ANY(su) \ 413 ((su)->su_family == AF_INET \ 414 ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) \ 415 : ((su)->su_family == AF_INET6 \ 416 ? (memcmp(&(su)->su_sin6.sin6_addr, su_in6addr_any(), \ 417 sizeof(*su_in6addr_any())) == 0) : 0)) 419 #define SU_HAS_INADDR_ANY(su) \ 420 ((su)->su_family == AF_INET \ 421 ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) : 0) 424 #define SU_SOCKADDR_INADDR_ANY(su) SU_HAS_INADDR_ANY(su) 428 #define SU_SOCKADDR_SIZE(su) \ 429 ((socklen_t)((su)->su_family == AF_INET ? sizeof((su)->su_sin) \ 430 : ((su)->su_family == AF_INET6 ? sizeof((su)->su_sin6) \ 433 #define SU_SOCKADDR_SIZE(su) \ 434 ((socklen_t)((su)->su_family == AF_INET ? sizeof((su)->su_sin) \ 437 #define su_sockaddr_size SU_SOCKADDR_SIZE 441 #define su_in6addr_any() (&in6addr_any) 442 #define su_in6addr_loopback() (&in6addr_loopback) 443 #define SU_IN6ADDR_ANY_INIT IN6ADDR_ANY_INIT 444 #define SU_IN6ADDR_LOOPBACK_INIT IN6ADDR_LOOPBACK_INIT 446 #if SU_HAVE_WINSOCK || DOCUMENTATION_ONLY 447 SOFIAPUBVAR const struct in_addr6 *su_in6addr_any(
void);
448 SOFIAPUBVAR const struct in_addr6 *su_in6addr_loopback(
void);
449 #define SU_IN6ADDR_ANY_INIT { 0 } 450 #define SU_IN6ADDR_LOOPBACK_INIT { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1 } 454 #define SU_IN6_IS_ADDR_V4MAPPED(a) \ 455 (((uint32_t const *) (a))[0] == 0 && \ 456 ((uint32_t const *) (a))[1] == 0 && \ 457 ((uint32_t const *) (a))[2] == htonl(0xffff)) 459 #define SU_IN6_IS_ADDR_V4COMPAT(a) \ 460 (((uint32_t const *)(a))[0] == 0 && \ 461 ((uint32_t const *)(a))[1] == 0 && \ 462 ((uint32_t const *)(a))[2] == 0 && \ 463 ((uint32_t const *)(a))[3] != htonl(1) && \ 464 ((uint32_t const *)(a))[3] != htonl(0)) 473 #define SU_CANONIZE_SOCKADDR(su) \ 474 ((su)->su_family == AF_INET6 ? su_canonize_sockaddr(su) : (void)0) 476 #define SU_CANONIZE_SOCKADDR(su) \ 482 #ifndef SU_ADDRINFO_H int su_ioctl(su_socket_t s, int request,...)
Control socket.
Network address and service translation.
uint16_t su_port
Port number.
Definition: su.h:161
Basic integer types for su library.
Return code for an unsuccessful call.
Definition: su.h:95
I/O vector for scatter-gather I/O.
Definition: su.h:239
uint8_t su_len
Length of structure.
Definition: su.h:159
int su_socket_t
Socket descriptor type.
Definition: su.h:128
Return code for a successful call.
Definition: su.h:93
void * siv_base
Pointer to buffer.
Definition: su.h:240
SU_U16_T uint16_t
16-bit unsigned integer
Definition: su_types.h:91
uint8_t su_family
Address family.
Definition: su.h:160
su_socket_t su_socket(int af, int sock, int proto)
Create an endpoint for communication.
Definition: su.c:84
uint32_t su_scope_id
Scope ID.
Definition: su.h:182
int su_close(su_socket_t s)
Close an socket descriptor.
Definition: su.c:251
issize_t su_vsend(su_socket_t, su_iovec_t const iov[], isize_t len, int flags, su_sockaddr_t const *su, socklen_t sulen)
Scatter-gather send.
Definition: su.c:496
#define SOFIAPUBFUN
SOFIAPUBFUN declares an exported function.
Definition: su_config.h:66
struct su_iovec_s su_iovec_t
I/O vector for scatter-gather I/O.
int su_setblocking(su_socket_t s, int blocking)
Set/reset blocking option.
Definition: su.c:256
issize_t su_vrecv(su_socket_t, su_iovec_t iov[], isize_t len, int flags, su_sockaddr_t *su, socklen_t *sulen)
Scatter-gather receive.
Definition: su.c:520
void su_deinit(void)
Deinitialize socket implementation.
Definition: su.c:243
issize_t su_getmsgsize(su_socket_t s)
Get size of message available in socket.
Definition: su.c:420
int su_is_blocking(int errcode)
Check for in-progress error codes.
#define SOFIAPUBVAR
SOFIAPUBVAR declares an exported variable.
Definition: su_config.h:68
su_ioveclen_t siv_len
Size of buffer.
Definition: su.h:241
int su_init(void)
Initialize socket implementation.
Definition: su.c:217
int su_setreuseaddr(su_socket_t s, int reuse)
Set/reset address reusing option.
Definition: su.c:392
int su_soerror(su_socket_t s)
Get the error code associated with the socket.
Definition: su.c:371
Common socket address structure.
Definition: su.h:157
int su_getlocalip(su_sockaddr_t *sin)
Return local IP address.
Definition: su_localinfo.c:1672
SU_U32_T uint32_t
32-bit unsigned integer
Definition: su_types.h:87
SU_S64_T int64_t
64-bit signed integer
Definition: su_types.h:85
void su_canonize_sockaddr(su_sockaddr_t *su)
Convert mapped/compat address to IPv4 address.
Definition: su.c:659
int su_getsocktype(su_socket_t s)
Get the socket type.
Definition: su.c:381
Invalid socket descriptor, error from socket() or accept()
Definition: su.h:87
SU_U8_T uint8_t
8-bit unsigned integer
Definition: su_types.h:95
int su_cmp_sockaddr(su_sockaddr_t const *a, su_sockaddr_t const *b)
Compare two socket addresses.
Definition: su.c:586
int su_match_sockaddr(su_sockaddr_t const *a, su_sockaddr_t const *b)
Check if socket address b match with a.
Definition: su.c:622
Error from other socket calls.
Definition: su.h:90
size_t su_ioveclen_t
Type of siv_len field in su_iovec_t.
Definition: su.h:201