58#include <sys/socket.h>
61#include <netinet/in.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)
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
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)
143struct 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
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)
323SOFIAPUBFUN int su_inet_pton(
int af,
char const *src,
void *dst);
324SOFIAPUBFUN 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)
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))
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
447SOFIAPUBVAR const struct in_addr6 *su_in6addr_any(
void);
448SOFIAPUBVAR 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) \
I/O vector for scatter-gather I/O.
Definition su.h:239
void * siv_base
Pointer to buffer.
Definition su.h:240
su_ioveclen_t siv_len
Size of buffer.
Definition su.h:241
@ su_success
Return code for a successful call.
Definition su.h:93
@ su_failure
Return code for an unsuccessful call.
Definition su.h:95
void su_canonize_sockaddr(su_sockaddr_t *su)
Convert mapped/compat address to IPv4 address.
Definition su.c:659
size_t su_ioveclen_t
Type of siv_len field in su_iovec_t.
Definition su.h:201
void su_deinit(void)
Deinitialize socket implementation.
Definition su.c:243
int su_socket_t
Socket descriptor type.
Definition su.h:128
int su_close(su_socket_t s)
Close an socket descriptor.
Definition su.c:251
int su_setblocking(su_socket_t s, int blocking)
Set/reset blocking option.
Definition su.c:256
int su_setreuseaddr(su_socket_t s, int reuse)
Set/reset address reusing option.
Definition su.c:392
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
int su_ioctl(su_socket_t s, int request,...)
Control socket.
struct su_iovec_s su_iovec_t
I/O vector for scatter-gather I/O.
int su_cmp_sockaddr(su_sockaddr_t const *a, su_sockaddr_t const *b)
Compare two socket addresses.
Definition su.c:586
int su_getsocktype(su_socket_t s)
Get the socket type.
Definition su.c:381
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
issize_t su_getmsgsize(su_socket_t s)
Get size of message available in socket.
Definition su.c:420
int su_soerror(su_socket_t s)
Get the error code associated with the socket.
Definition su.c:371
su_socket_t su_socket(int af, int sock, int proto)
Create an endpoint for communication.
Definition su.c:84
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
int su_is_blocking(int errcode)
Check for in-progress error codes.
int su_init(void)
Initialize socket implementation.
Definition su.c:217
int su_getlocalip(su_sockaddr_t *sin)
Return local IP address.
Definition su_localinfo.c:1672
Network address and service translation.
#define SOFIAPUBFUN
SOFIAPUBFUN declares an exported function.
Definition su_config.h:66
#define SOFIAPUBVAR
SOFIAPUBVAR declares an exported variable.
Definition su_config.h:68
Basic integer types for su library.
SU_U32_T uint32_t
32-bit unsigned integer
Definition su_types.h:87
SU_U16_T uint16_t
16-bit unsigned integer
Definition su_types.h:91
SU_S64_T int64_t
64-bit signed integer
Definition su_types.h:85
SU_U8_T uint8_t
8-bit unsigned integer
Definition su_types.h:95
Common socket address structure.
Definition su.h:157
struct sockaddr_in su_sin
Address in IPv4 format.
Definition su.h:177
char su_array[32]
Presented as chars.
Definition su.h:173
struct sockaddr su_sa
Address in struct sockaddr format.
Definition su.h:176
uint16_t su_port
Port number.
Definition su.h:161
uint8_t su_family
Address family.
Definition su.h:160
uint16_t su_array16[16]
Presented as 16-bit ints.
Definition su.h:174
uint8_t su_len
Length of structure.
Definition su.h:159
uint32_t su_array32[8]
Presented as 32-bit ints.
Definition su.h:175
uint32_t su_scope_id
Scope ID.
Definition su.h:182