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
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