sofia-sip/su.h

Go to the documentation of this file.
00001 /*
00002  * This file is part of the Sofia-SIP package
00003  *
00004  * Copyright (C) 2005 Nokia Corporation.
00005  *
00006  * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public License
00010  * as published by the Free Software Foundation; either version 2.1 of
00011  * the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00021  * 02110-1301 USA
00022  *
00023  */
00024 
00025 #ifndef SU_H
00026 
00027 #define SU_H
00028 
00036 /* ---------------------------------------------------------------------- */
00037 /* Includes */
00038 
00039 #ifndef SU_CONFIG_H
00040 #include "sofia-sip/su_config.h"
00041 #endif
00042 #ifndef SU_TYPES_H
00043 #include "sofia-sip/su_types.h"
00044 #endif
00045 #ifndef SU_ERRNO_H
00046 #include <sofia-sip/su_errno.h>
00047 #endif
00048 
00049 #include <stdio.h>
00050 
00051 SOFIA_BEGIN_DECLS
00052 
00053 #if SU_HAVE_BSDSOCK             /* Unix-compatible includes */
00054 #include <errno.h>
00055 #include <unistd.h>
00056 #include <limits.h>
00057 
00058 #include <fcntl.h>
00059 #include <sys/types.h>
00060 #include <sys/socket.h>
00061 #include <sys/ioctl.h>
00062 
00063 #include <netinet/in.h>
00064 #include <arpa/inet.h>
00065 #include <netdb.h>
00066 #endif
00067 
00068 #if SU_HAVE_WINSOCK             /* Windows includes */
00069 #  include <winsock2.h>
00070 #  include <ws2tcpip.h>
00071 
00072 static __inline
00073 uint16_t su_ntohs(uint16_t s)
00074 {
00075   return (uint16_t)(((s & 255) << 8) | ((s & 0xff00) >> 8));
00076 }
00077 
00078 static __inline
00079 uint32_t su_ntohl(uint32_t l)
00080 {
00081   return ((l & 0xff) << 24) | ((l & 0xff00) << 8)
00082        | ((l & 0xff0000) >> 8) | ((l & 0xff000000U) >> 24);
00083 }
00084 
00085 #define ntohs su_ntohs
00086 #define htons su_ntohs
00087 #define ntohl su_ntohl
00088 #define htonl su_ntohl
00089 
00090 #  if defined(IPPROTO_IPV6)
00091 /* IPv6 defined in ws2tcpip.h */
00092 #  elif SU_HAVE_IN6 
00093 #    include <tpipv6.h>         /* From "IPv6 Tech Preview"  */
00094 #  else
00095 #    error Winsock with IPv6 support required
00096 #  endif
00097 
00098 #include <limits.h>
00099 
00100 #endif
00101 
00102 /* ---------------------------------------------------------------------- */
00103 /* Constant definitions */
00104 
00105 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY
00106 enum {
00108   INVALID_SOCKET = -1,
00110   SOCKET_ERROR = -1,
00111 
00113   su_success = 0, 
00115   su_failure = -1
00116 };
00117 #elif SU_HAVE_WINSOCK
00118 enum { 
00119   su_success = 0, 
00120   su_failure = 0xffffffffUL 
00121 };
00122 
00123 #define MSG_NOSIGNAL (0)
00124 
00125 #endif
00126 
00128 #define SU_MAXHOST (1025)
00129 
00130 #define SU_MAXSERV (25)
00131 
00133 #define SU_ADDRSIZE (48)
00134 
00135 #define SU_SERVSIZE (16)
00136 
00137 #define SU_SUCCESS su_success
00138 #define SU_FAILURE su_failure
00139 
00140 /* ---------------------------------------------------------------------- */
00141 /* Type definitions */
00142 
00144 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY
00145 typedef int su_socket_t;
00146 #elif SU_HAVE_WINSOCK
00147 typedef SOCKET su_socket_t;
00148 #endif
00149 
00150 #if !SU_HAVE_SOCKADDR_STORAGE
00151 /*
00152  * RFC 2553: protocol-independent placeholder for socket addresses
00153  */
00154 #define _SS_MAXSIZE     128
00155 #define _SS_ALIGNSIZE   (sizeof(int64_t))
00156 #define _SS_PAD1SIZE    (_SS_ALIGNSIZE - sizeof(u_char) * 2)
00157 #define _SS_PAD2SIZE    (_SS_MAXSIZE - sizeof(u_char) * 2 - \
00158                                 _SS_PAD1SIZE - _SS_ALIGNSIZE)
00159 
00160 struct sockaddr_storage {
00161 #if SU_HAVE_SOCKADDR_SA_LEN
00162         unsigned char ss_len;           /* address length */
00163         unsigned char ss_family;        /* address family */
00164 #else
00165         unsigned short ss_family;       /* address family */
00166 #endif
00167         char    __ss_pad1[_SS_PAD1SIZE];
00168         int64_t __ss_align;     /* force desired structure storage alignment */
00169         char    __ss_pad2[_SS_PAD2SIZE];
00170 };
00171 #endif
00172 
00174 union su_sockaddr_u {
00175 #ifdef DOCUMENTATION_ONLY
00176   uint8_t             su_len;         
00177   uint8_t             su_family;      
00178   uint16_t            su_port;        
00179 #else
00180   short               su_dummy;       
00181 #if SU_HAVE_SOCKADDR_SA_LEN
00182 #define               su_len          su_sa.sa_len
00183 #define               su_family       su_sa.sa_family
00184 #else
00185 #define               su_len          su_array[0]
00186   short               su_family;
00187 #endif
00188 #define               su_port         su_sin.sin_port  
00189 #endif
00190 
00191   char                su_array[32];   
00192   uint16_t            su_array16[16]; 
00193   uint32_t            su_array32[8];  
00194   struct sockaddr     su_sa;          
00195   struct sockaddr_in  su_sin;         
00196 #if SU_HAVE_IN6
00197   struct sockaddr_in6 su_sin6;        
00198 #endif
00199 #ifdef DOCUMENTATION_ONLY
00200   uint32_t            su_scope_id;    
00201 #else
00202 #define               su_scope_id     su_array32[6]
00203 #endif
00204 };
00205 
00206 typedef union su_sockaddr_u su_sockaddr_t;
00207 
00208 #if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY
00209 
00212 struct su_iovec_s {
00213   void  *siv_base;              
00214   size_t siv_len;               
00215 };
00216 #endif
00217 
00218 #if SU_HAVE_WINSOCK
00219 struct su_iovec_s {
00220   long  siv_len;
00221   void *siv_base;
00222 };
00223 #endif
00224 
00226 typedef struct su_iovec_s   su_iovec_t;
00227 
00228 /* ---------------------------------------------------------------------- */
00229 /* Socket compatibility functions */
00230 
00231 SOFIAPUBFUN int su_init(void);
00232 SOFIAPUBFUN void su_deinit(void);
00233 
00235 SOFIAPUBFUN su_socket_t su_socket(int af, int sock, int proto);
00237 SOFIAPUBFUN int su_close(su_socket_t s);
00239 SOFIAPUBFUN int su_ioctl(su_socket_t s, int request, ...);
00240 
00242 SOFIAPUBFUN int su_isblocking(void);
00244 SOFIAPUBFUN int su_setblocking(su_socket_t s, int blocking);
00246 SOFIAPUBFUN int su_setreuseaddr(su_socket_t s, int reuse);
00248 SOFIAPUBFUN int su_soerror(su_socket_t s);
00250 SOFIAPUBFUN int su_getmsgsize(su_socket_t s);
00251 
00253 SOFIAPUBFUN
00254 int su_vsend(su_socket_t s, su_iovec_t const iov[], int iovlen, int flags, 
00255              su_sockaddr_t const *su, socklen_t sulen);
00257 SOFIAPUBFUN
00258 int su_vrecv(su_socket_t s, su_iovec_t iov[], int iovlen, int flags, 
00259              su_sockaddr_t *su, socklen_t *sulen);
00261 SOFIAPUBFUN int su_getlocalip(su_sockaddr_t *sin);
00262 
00263 #include <sofia-sip/su_addrinfo.h>
00264 
00265 #if SU_HAVE_BSDSOCK
00266 #define su_ioctl  ioctl
00267 #define su_isblocking() (su_errno() == EAGAIN || su_errno() == EWOULDBLOCK)
00268 #endif
00269 
00270 #if SU_HAVE_WINSOCK
00271 SOFIAPUBFUN int inet_pton(int af, char const *src, void *dst);
00272 SOFIAPUBFUN const char *inet_ntop(int af, void const *src,
00273                                   char *dst, size_t size);
00274 #endif
00275 
00276 /* ---------------------------------------------------------------------- */
00277 /* Other compatibility stuff */
00278 
00279 #if SU_HAVE_WINSOCK
00280 #define getuid() (0x505)
00281 #endif
00282 
00283 #ifndef IPPROTO_SCTP
00284 #define IPPROTO_SCTP (132)
00285 #endif
00286 
00287 /* ---------------------------------------------------------------------- */
00288 /* Address manipulation macros */
00289 
00295 #if SU_HAVE_IN6
00296 #define SU_ADDR(su) \
00297   ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \
00298   ((su)->su_family == AF_INET6 ? (void *)&(su)->su_sin6.sin6_addr : \
00299   (void *)&(su)->su_sa.sa_data))
00300 #else
00301 #define SU_ADDR(su) \
00302   ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \
00303   (void *)&(su)->su_sa.sa_data)
00304 #endif
00305 
00311 #if SU_HAVE_IN6
00312 #define SU_ADDRLEN(su) \
00313   ((su)->su_family == AF_INET ? sizeof((su)->su_sin.sin_addr) :     \
00314    ((su)->su_family == AF_INET6 ? sizeof((su)->su_sin6.sin6_addr) : \
00315     sizeof((su)->su_sa.sa_data)))
00316 #else
00317 #define SU_ADDRLEN(su) \
00318   ((su)->su_family == AF_INET ? sizeof((su)->su_sin.sin_addr) :     \
00319    sizeof((su)->su_sa.sa_data))
00320 #endif
00321 
00323 #if SU_HAVE_IN6
00324 #define SU_HAS_INADDR_ANY(su) \
00325   ((su)->su_family == AF_INET \
00326    ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) \
00327    : ((su)->su_family == AF_INET6 \
00328       ? (memcmp(&(su)->su_sin6.sin6_addr, su_in6addr_any(), \
00329                 sizeof(*su_in6addr_any())) == 0) : 0))
00330 #else
00331 #define SU_HAS_INADDR_ANY(su) \
00332   ((su)->su_family == AF_INET \
00333   ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) : 0)
00334 #endif
00335 
00336 #define SU_SOCKADDR_INADDR_ANY(su) SU_HAS_INADDR_ANY(su)
00337 
00339 #if SU_HAVE_IN6
00340 #define SU_SOCKADDR_SIZE(su) \
00341   ((su)->su_family == AF_INET ? sizeof((su)->su_sin) \
00342    : ((su)->su_family == AF_INET6 ? sizeof((su)->su_sin6) \
00343       : sizeof(*su)))
00344 #else
00345 #define SU_SOCKADDR_SIZE(su) \
00346   ((su)->su_family == AF_INET ? sizeof((su)->su_sin) \
00347     : sizeof(*su))
00348 #endif
00349 #define su_sockaddr_size SU_SOCKADDR_SIZE
00350 
00351 #if SU_HAVE_IN6
00352 #if SU_HAVE_BSDSOCK
00353 #define su_in6addr_any()         (&in6addr_any)
00354 #define su_in6addr_loopback()    (&in6addr_loopback)
00355 #define SU_IN6ADDR_ANY_INIT      IN6ADDR_ANY_INIT
00356 #define SU_IN6ADDR_LOOPBACK_INIT IN6ADDR_LOOPBACK_INIT
00357 #endif
00358 #if SU_HAVE_WINSOCK || DOCUMENTATION_ONLY
00359 SOFIAPUBVAR const struct in_addr6 *su_in6addr_any(void);
00360 SOFIAPUBVAR const struct in_addr6 *su_in6addr_loopback(void);
00361 #define SU_IN6ADDR_ANY_INIT      { 0 }
00362 #define SU_IN6ADDR_LOOPBACK_INIT { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1 }
00363 #endif
00364 #endif /* SU_HAVE_IN6 */
00365 
00366 SOFIAPUBFUN int su_cmp_sockaddr(su_sockaddr_t const *a,
00367                                 su_sockaddr_t const *b);
00368 SOFIAPUBFUN int su_match_sockaddr(su_sockaddr_t const *a,
00369                                   su_sockaddr_t const *b);
00370 SOFIAPUBFUN void su_canonize_sockaddr(su_sockaddr_t *su);
00371 
00372 #if SU_HAVE_IN6
00373 #define SU_CANONIZE_SOCKADDR(su) \
00374   ((su)->su_family == AF_INET6 ? su_canonize_sockaddr(su) : (void)0)
00375 #else
00376 #define SU_CANONIZE_SOCKADDR(su) \
00377   ((void)0)
00378 #endif
00379 
00380 SOFIA_END_DECLS
00381 
00382 #endif /* !defined(SU_H) */

Sofia-SIP 1.12.1 - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.