Wed Apr 6 11:30:06 2011

Asterisk developer's documentation


netsock2.h File Reference

Network socket handling. More...

#include <sys/socket.h>
#include <netinet/in.h>

Go to the source code of this file.

Data Structures

struct  ast_sockaddr
#define ast_sockaddr_from_sin(addr, sin)   _ast_sockaddr_from_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Converts a struct sockaddr_in to a struct ast_sockaddr.
#define ast_sockaddr_to_sin(addr, sin)   _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Converts a struct ast_sockaddr to a struct sockaddr_in.
void _ast_sockaddr_from_sin (struct ast_sockaddr *addr, const struct sockaddr_in *sin, const char *file, int line, const char *func)
int _ast_sockaddr_to_sin (const struct ast_sockaddr *addr, struct sockaddr_in *sin, const char *file, int line, const char *func)

Defines

#define ast_sockaddr_port(addr)   _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Get the port number of a socket address.
#define ast_sockaddr_set_port(addr, port)   _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__)
 Sets the port number of a socket address.
#define AST_SOCKADDR_STR_ADDR   (1 << 0)
#define AST_SOCKADDR_STR_BRACKETS   (1 << 2)
#define AST_SOCKADDR_STR_DEFAULT   AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT
#define AST_SOCKADDR_STR_HOST   AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS
#define AST_SOCKADDR_STR_PORT   (1 << 1)

Enumerations

enum  { AST_AF_UNSPEC = 0, AST_AF_INET = 2, AST_AF_INET6 = 10 }

Functions

uint16_t _ast_sockaddr_port (const struct ast_sockaddr *addr, const char *file, int line, const char *func)
void _ast_sockaddr_set_port (struct ast_sockaddr *addr, uint16_t port, const char *file, int line, const char *func)
int ast_accept (int sockfd, struct ast_sockaddr *addr)
 Wrapper around accept(2) that uses struct ast_sockaddr.
int ast_bind (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around bind(2) that uses struct ast_sockaddr.
int ast_connect (int sockfd, const struct ast_sockaddr *addr)
 Wrapper around connect(2) that uses struct ast_sockaddr.
int ast_getsockname (int sockfd, struct ast_sockaddr *addr)
 Wrapper around getsockname(2) that uses struct ast_sockaddr.
ssize_t ast_recvfrom (int sockfd, void *buf, size_t len, int flags, struct ast_sockaddr *src_addr)
 Wrapper around recvfrom(2) that uses struct ast_sockaddr.
ssize_t ast_sendto (int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr)
 Wrapper around sendto(2) that uses ast_sockaddr.
int ast_set_qos (int sockfd, int tos, int cos, const char *desc)
 Set type of service.
int ast_sockaddr_cmp (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares two ast_sockaddr structures.
int ast_sockaddr_cmp_addr (const struct ast_sockaddr *a, const struct ast_sockaddr *b)
 Compares the addresses of two ast_sockaddr structures.
static void ast_sockaddr_copy (struct ast_sockaddr *dst, const struct ast_sockaddr *src)
 Copies the data from one ast_sockaddr to another.
int ast_sockaddr_hash (const struct ast_sockaddr *addr)
 Computes a hash value from the address. The port is ignored.
uint32_t ast_sockaddr_ipv4 (const struct ast_sockaddr *addr)
 Get an IPv4 address of an ast_sockaddr.
int ast_sockaddr_ipv4_mapped (const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped)
 Convert an IPv4-mapped IPv6 address into an IPv4 address.
int ast_sockaddr_is_any (const struct ast_sockaddr *addr)
 Determine if the address type is unspecified, or "any" address.
int ast_sockaddr_is_ipv4 (const struct ast_sockaddr *addr)
 Determine if the address is an IPv4 address.
int ast_sockaddr_is_ipv4_mapped (const struct ast_sockaddr *addr)
 Determine if this is an IPv4-mapped IPv6 address.
int ast_sockaddr_is_ipv6 (const struct ast_sockaddr *addr)
 Determine if this is an IPv6 address.
static int ast_sockaddr_isnull (const struct ast_sockaddr *addr)
 Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.
int ast_sockaddr_parse (struct ast_sockaddr *addr, const char *str, int flags)
 Parse an IPv4 or IPv6 address string.
int ast_sockaddr_resolve (struct ast_sockaddr **addrs, const char *str, int flags, int family)
 Parses a string with an IPv4 or IPv6 address and place results into an array.
static void ast_sockaddr_setnull (struct ast_sockaddr *addr)
 Sets address addr to null.
int ast_sockaddr_split_hostport (char *str, char **host, char **port, int flags)
 Splits a string into its host and port components.
static char * ast_sockaddr_stringify (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() with default format.
static char * ast_sockaddr_stringify_addr (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only.
char * ast_sockaddr_stringify_fmt (const struct ast_sockaddr *addr, int format)
 Convert a socket address to a string.
static char * ast_sockaddr_stringify_host (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).
static char * ast_sockaddr_stringify_port (const struct ast_sockaddr *addr)
 Wrapper around ast_sockaddr_stringify_fmt() to return a port only.


Detailed Description

Network socket handling.

Definition in file netsock2.h.


Define Documentation

#define ast_sockaddr_from_sin ( addr,
sin   )     _ast_sockaddr_from_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Converts a struct sockaddr_in to a struct ast_sockaddr.

Since:
1.8
Parameters:
sin The sockaddr_in to convert
Returns:
an ast_sockaddr structure

Definition at line 552 of file netsock2.h.

Referenced by __ast_http_load(), __oh323_rtp_create(), apply_netmask(), ast_rtp_read(), ast_rtp_stun_request(), ast_sockaddr_ipv4_mapped(), auth_manager_http_callback(), auth_mxml_http_callback(), auth_rawman_http_callback(), authenticate(), check_access(), find_subchannel_and_lock(), gtalk_alloc(), gtalk_get_local_ip(), gtalk_update_externip(), gtalk_update_stun(), handle_open_receive_channel_ack_message(), jingle_alloc(), jingle_create_candidates(), jingle_update_stun(), load_module(), manager_http_callback(), mxml_http_callback(), parse_cidr_mask(), process_sdp(), rawman_http_callback(), register_verify(), setup_rtp_connection(), skinny_register(), start_rtp(), stun_start_monitor(), and update_registry().

#define ast_sockaddr_port ( addr   )     _ast_sockaddr_port(addr, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Get the port number of a socket address.

Since:
1.8
Warning:
Do not use this function unless you really know what you are doing. And "I want the port number" is not knowing what you are doing.
Return values:
0 Address is null
non-zero The port number of the ast_sockaddr

Definition at line 330 of file netsock2.h.

Referenced by __iax2_show_peers(), __set_address_from_contact(), __sip_subscribe_mwi_do(), _sip_show_peer(), _sip_show_peers(), add_sdp(), ast_ouraddrfor(), ast_rtp_prop_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), build_peer(), check_via(), copy_via_headers(), create_addr(), dnsmgr_refresh(), function_sippeer(), get_our_media_address(), initreqprep(), manager_iax2_show_peer_list(), multicast_send_control_packet(), parse_register_contact(), peer_ipcmp_cb(), peers_data_provider_get(), realtime_update_peer(), set_destination(), sip_debug_test_addr(), sip_request_call(), sipsock_read(), transmit_notify_with_mwi(), transmit_register(), and udptl_debug_test_addr().

#define ast_sockaddr_set_port ( addr,
port   )     _ast_sockaddr_set_port(addr,port,__FILE__,__LINE__,__PRETTY_FUNCTION__)

Sets the port number of a socket address.

Since:
1.8
Warning:
Do not use this function unless you really know what you are doing. And "I want the port number" is not knowing what you are doing.
Parameters:
addr Address on which to set the port
port The port you wish to set the address to use
Return values:
void 

Definition at line 346 of file netsock2.h.

Referenced by __set_address_from_contact(), __sip_subscribe_mwi_do(), add_sdp(), ast_get_ip_or_srv(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), ast_udptl_new_with_bindaddr(), build_peer(), check_via(), check_via_response(), create_addr(), dnsmgr_refresh(), get_our_media_address(), iax2_append_register(), parse_register_contact(), process_sdp(), proxy_update(), set_destination(), sip_request_call(), and transmit_register().

#define AST_SOCKADDR_STR_ADDR   (1 << 0)

Definition at line 142 of file netsock2.h.

Referenced by ast_sockaddr_stringify_addr(), and ast_sockaddr_stringify_fmt().

#define AST_SOCKADDR_STR_BRACKETS   (1 << 2)

Definition at line 144 of file netsock2.h.

#define AST_SOCKADDR_STR_DEFAULT   AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_PORT

Definition at line 146 of file netsock2.h.

Referenced by ast_sockaddr_stringify(), and ast_sockaddr_stringify_fmt().

#define AST_SOCKADDR_STR_HOST   AST_SOCKADDR_STR_ADDR | AST_SOCKADDR_STR_BRACKETS

Definition at line 145 of file netsock2.h.

Referenced by _sip_show_peers(), ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_host().

#define AST_SOCKADDR_STR_PORT   (1 << 1)

Definition at line 143 of file netsock2.h.

Referenced by ast_sockaddr_stringify_fmt(), and ast_sockaddr_stringify_port().

#define ast_sockaddr_to_sin ( addr,
sin   )     _ast_sockaddr_to_sin(addr,sin, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Converts a struct ast_sockaddr to a struct sockaddr_in.

Since:
1.8
Parameters:
addr The ast_sockaddr to convert
[out] sin The resulting sockaddr_in struct
Return values:
nonzero Success
zero Failure

Definition at line 539 of file netsock2.h.

Referenced by __iax2_show_peers(), add_sdp(), addr_range_hash_cb(), addr_range_match_address_cb(), ast_rtp_read(), ast_rtp_stun_request(), auth_manager_http_callback(), auth_mxml_http_callback(), auth_rawman_http_callback(), authenticate_reply(), build_peer(), build_user(), config_parse_variables(), create_addr(), external_rtp_create(), find_subchannel_and_lock(), gtalk_create_candidates(), gtalk_update_stun(), handle_cli_iax2_set_debug(), handle_cli_iax2_show_peer(), handle_open_receive_channel_ack_message(), handle_show_http(), iax2_ack_registry(), iax2_do_register(), iax2_getpeername(), iax2_getpeertrunk(), iax2_poke_peer(), jingle_create_candidates(), manager_http_callback(), mansession_encode_sin_local(), mxml_http_callback(), oh323_set_rtp_peer(), peer_set_srcaddr(), peercnt_modify(), rawman_http_callback(), registry_rerequest(), session_do(), skinny_set_rtp_peer(), start_rtp(), transmit_modify_with_sdp(), and update_registry().


Enumeration Type Documentation

anonymous enum

Values for address families that we support. This is reproduced from socket.h because we do not want users to include that file. Only netsock2.c should ever include socket.h.

Enumerator:
AST_AF_UNSPEC 
AST_AF_INET 
AST_AF_INET6 

Definition at line 39 of file netsock2.h.

00039      {
00040    AST_AF_UNSPEC  = 0,
00041    AST_AF_INET = 2,
00042    AST_AF_INET6   = 10,
00043 };


Function Documentation

void _ast_sockaddr_from_sin ( struct ast_sockaddr addr,
const struct sockaddr_in *  sin,
const char *  file,
int  line,
const char *  func 
)

Definition at line 527 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00529 {
00530    memcpy(&addr->ss, sin, sizeof(*sin));
00531 
00532    if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
00533       ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
00534    }
00535 
00536    addr->len = sizeof(*sin);
00537 }

uint16_t _ast_sockaddr_port ( const struct ast_sockaddr addr,
const char *  file,
int  line,
const char *  func 
)

Definition at line 337 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00338 {
00339    if (addr->ss.ss_family == AF_INET &&
00340        addr->len == sizeof(struct sockaddr_in)) {
00341       return ntohs(((struct sockaddr_in *)&addr->ss)->sin_port);
00342    } else if (addr->ss.ss_family == AF_INET6 &&
00343        addr->len == sizeof(struct sockaddr_in6)) {
00344       return ntohs(((struct sockaddr_in6 *)&addr->ss)->sin6_port);
00345    }
00346    if (option_debug >= 1) {
00347       ast_log(__LOG_DEBUG, file, line, func, "Not an IPv4 nor IPv6 address, cannot get port.\n");
00348    }
00349    return 0;
00350 }

void _ast_sockaddr_set_port ( struct ast_sockaddr addr,
uint16_t  port,
const char *  file,
int  line,
const char *  func 
)

Definition at line 352 of file netsock2.c.

References __LOG_DEBUG, ast_log(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00353 {
00354    if (addr->ss.ss_family == AF_INET &&
00355        addr->len == sizeof(struct sockaddr_in)) {
00356       ((struct sockaddr_in *)&addr->ss)->sin_port = htons(port);
00357    } else if (addr->ss.ss_family == AF_INET6 &&
00358        addr->len == sizeof(struct sockaddr_in6)) {
00359       ((struct sockaddr_in6 *)&addr->ss)->sin6_port = htons(port);
00360    } else if (option_debug >= 1) {
00361       ast_log(__LOG_DEBUG, file, line, func,
00362          "Not an IPv4 nor IPv6 address, cannot set port.\n");
00363    }
00364 }

int _ast_sockaddr_to_sin ( const struct ast_sockaddr addr,
struct sockaddr_in *  sin,
const char *  file,
int  line,
const char *  func 
)

Definition at line 506 of file netsock2.c.

References __LOG_DEBUG, __LOG_ERROR, ast_log(), ast_sockaddr_isnull(), ast_sockaddr::len, option_debug, and ast_sockaddr::ss.

00508 {
00509    if (ast_sockaddr_isnull(addr)) {
00510       memset(sin, 0, sizeof(*sin));
00511       return 1;
00512    }
00513 
00514    if (addr->len != sizeof(*sin)) {
00515       ast_log(__LOG_ERROR, file, line, func, "Bad address cast to IPv4\n");
00516       return 0;
00517    }
00518 
00519    if (addr->ss.ss_family != AF_INET && option_debug >= 1) {
00520       ast_log(__LOG_DEBUG, file, line, func, "Address family is not AF_INET\n");
00521    }
00522 
00523    *sin = *(struct sockaddr_in *)&addr->ss;
00524    return 1;
00525 }

int ast_accept ( int  sockfd,
struct ast_sockaddr addr 
)

Wrapper around accept(2) that uses struct ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for accept(2).

Definition at line 422 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_tcptls_server_root().

00423 {
00424    addr->len = sizeof(addr->ss);
00425    return accept(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
00426 }

int ast_bind ( int  sockfd,
const struct ast_sockaddr addr 
)

Wrapper around bind(2) that uses struct ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for bind(2).

Definition at line 428 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_rtp_new(), ast_rtp_prop_set(), ast_tcptls_client_create(), ast_tcptls_server_start(), and ast_udptl_new_with_bindaddr().

00429 {
00430    return bind(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
00431 }

int ast_connect ( int  sockfd,
const struct ast_sockaddr addr 
)

Wrapper around connect(2) that uses struct ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for connect(2).

Definition at line 433 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_ouraddrfor(), ast_tcptls_client_start(), gtalk_update_externip(), and stun_start_monitor().

00434 {
00435    return connect(sockfd, (const struct sockaddr *)&addr->ss, addr->len);
00436 }

int ast_getsockname ( int  sockfd,
struct ast_sockaddr addr 
)

Wrapper around getsockname(2) that uses struct ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for getsockname(2).

Definition at line 438 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by ast_ouraddrfor(), and ast_set_qos().

00439 {
00440    addr->len = sizeof(addr->ss);
00441    return getsockname(sockfd, (struct sockaddr *)&addr->ss, &addr->len);
00442 }

ssize_t ast_recvfrom ( int  sockfd,
void *  buf,
size_t  len,
int  flags,
struct ast_sockaddr src_addr 
)

Wrapper around recvfrom(2) that uses struct ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for recvfrom(2).

Definition at line 444 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by __rtp_recvfrom(), ast_udptl_read(), and sipsock_read().

00446 {
00447    src_addr->len = sizeof(src_addr->ss);
00448    return recvfrom(sockfd, buf, len, flags,
00449          (struct sockaddr *)&src_addr->ss, &src_addr->len);
00450 }

ssize_t ast_sendto ( int  sockfd,
const void *  buf,
size_t  len,
int  flags,
const struct ast_sockaddr dest_addr 
)

Wrapper around sendto(2) that uses ast_sockaddr.

Since:
1.8
For parameter and return information, see the man page for sendto(2)

Definition at line 452 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by __rtp_sendto(), __sip_xmit(), ast_udptl_write(), multicast_rtp_write(), and multicast_send_control_packet().

00454 {
00455    return sendto(sockfd, buf, len, flags,
00456             (const struct sockaddr *)&dest_addr->ss, dest_addr->len);
00457 }

int ast_set_qos ( int  sockfd,
int  tos,
int  cos,
const char *  desc 
)

Set type of service.

Since:
1.8
Set ToS ("Type of Service for IPv4 and "Traffic Class for IPv6) and CoS (Linux's SO_PRIORITY)

Parameters:
sockfd File descriptor for socket on which to set the parameters
tos The type of service for the socket
cos The cost of service for the socket
desc A text description of the socket in question.
Return values:
0 Success
-1 Error, with errno set to an appropriate value

Definition at line 459 of file netsock2.c.

References ast_getsockname(), ast_log(), ast_sockaddr_is_any(), ast_sockaddr_is_ipv6(), ast_verb, errno, and LOG_WARNING.

Referenced by ast_rtp_qos_set().

00460 {
00461    int res = 0;
00462    int set_tos;
00463    int set_tclass;
00464    struct ast_sockaddr addr;
00465 
00466    /* If the sock address is IPv6, the TCLASS field must be set. */
00467    set_tclass = !ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr) ? 1 : 0;
00468 
00469    /* If the the sock address is IPv4 or (IPv6 set to any address [::]) set TOS bits */
00470    set_tos = (!set_tclass || (set_tclass && ast_sockaddr_is_any(&addr))) ? 1 : 0;
00471 
00472    if (set_tos) {
00473       if ((res = setsockopt(sockfd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)))) {
00474          ast_log(LOG_WARNING, "Unable to set %s DSCP TOS value to %d (may be you have no "
00475             "root privileges): %s\n", desc, tos, strerror(errno));
00476       } else if (tos) {
00477          ast_verb(2, "Using %s TOS bits %d\n", desc, tos);
00478       }
00479    }
00480 
00481 #if defined(IPV6_TCLASS) && defined(IPPROTO_IPV6)
00482    if (set_tclass) {
00483       if (!ast_getsockname(sockfd, &addr) && ast_sockaddr_is_ipv6(&addr)) {
00484          if ((res = setsockopt(sockfd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)))) {
00485             ast_log(LOG_WARNING, "Unable to set %s DSCP TCLASS field to %d (may be you have no "
00486                "root privileges): %s\n", desc, tos, strerror(errno));
00487          } else if (tos) {
00488             ast_verb(2, "Using %s TOS bits %d in TCLASS field.\n", desc, tos);
00489          }
00490       }
00491    }
00492 #endif
00493 
00494 #ifdef linux
00495    if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &cos, sizeof(cos))) {
00496       ast_log(LOG_WARNING, "Unable to set %s CoS to %d: %s\n", desc, cos,
00497          strerror(errno));
00498    } else if (cos) {
00499       ast_verb(2, "Using %s CoS mark %d\n", desc, cos);
00500    }
00501 #endif
00502 
00503    return res;
00504 }

int ast_sockaddr_cmp ( const struct ast_sockaddr a,
const struct ast_sockaddr b 
)

Compares two ast_sockaddr structures.

Since:
1.8
Return values:
-1 a is lexicographically smaller than b
0 a is equal to b
1 b is lexicographically smaller than a

Definition at line 272 of file netsock2.c.

References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), ast_rtcp_read(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_remote_address(), ast_rtp_read(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), dnsmgr_refresh(), parse_register_contact(), realtime_peer(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), threadinfo_locate_cb(), udptl_debug_test_addr(), and update_registry().

00273 {
00274    const struct ast_sockaddr *a_tmp, *b_tmp;
00275    struct ast_sockaddr ipv4_mapped;
00276 
00277    a_tmp = a;
00278    b_tmp = b;
00279 
00280    if (a_tmp->len != b_tmp->len) {
00281       if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
00282          a_tmp = &ipv4_mapped;
00283       } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
00284          b_tmp = &ipv4_mapped;
00285       }
00286    }
00287 
00288    if (a_tmp->len < b_tmp->len) {
00289       return -1;
00290    } else if (a_tmp->len > b_tmp->len) {
00291       return 1;
00292    }
00293 
00294    return memcmp(&a_tmp->ss, &b_tmp->ss, a_tmp->len);
00295 }

int ast_sockaddr_cmp_addr ( const struct ast_sockaddr a,
const struct ast_sockaddr b 
)

Compares the addresses of two ast_sockaddr structures.

Since:
1.8
Return values:
-1 a is lexicographically smaller than b
0 a is equal to b
1 b is lexicographically smaller than a

Definition at line 297 of file netsock2.c.

References ast_sockaddr_ipv4_mapped(), ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by addr_range_cmp_cb(), ast_apply_ha(), get_our_media_address(), peer_ipcmp_cb(), sip_debug_test_addr(), and udptl_debug_test_addr().

00298 {
00299    const struct ast_sockaddr *a_tmp, *b_tmp;
00300    struct ast_sockaddr ipv4_mapped;
00301    const struct in_addr *ip4a, *ip4b;
00302    const struct in6_addr *ip6a, *ip6b;
00303    int ret = -1;
00304 
00305    a_tmp = a;
00306    b_tmp = b;
00307 
00308    if (a_tmp->len != b_tmp->len) {
00309       if (ast_sockaddr_ipv4_mapped(a, &ipv4_mapped)) {
00310          a_tmp = &ipv4_mapped;
00311       } else if (ast_sockaddr_ipv4_mapped(b, &ipv4_mapped)) {
00312          b_tmp = &ipv4_mapped;
00313       }
00314    }
00315 
00316    if (a->len < b->len) {
00317       ret = -1;
00318    } else if (a->len > b->len) {
00319       ret = 1;
00320    }
00321 
00322    switch (a_tmp->ss.ss_family) {
00323    case AF_INET:
00324       ip4a = &((const struct sockaddr_in*)&a_tmp->ss)->sin_addr;
00325       ip4b = &((const struct sockaddr_in*)&b_tmp->ss)->sin_addr;
00326       ret = memcmp(ip4a, ip4b, sizeof(*ip4a));
00327       break;
00328    case AF_INET6:
00329       ip6a = &((const struct sockaddr_in6*)&a_tmp->ss)->sin6_addr;
00330       ip6b = &((const struct sockaddr_in6*)&b_tmp->ss)->sin6_addr;
00331       ret = memcmp(ip6a, ip6b, sizeof(*ip6a));
00332       break;
00333    }
00334    return ret;
00335 }

static void ast_sockaddr_copy ( struct ast_sockaddr dst,
const struct ast_sockaddr src 
) [inline, static]

Copies the data from one ast_sockaddr to another.

Since:
1.8
Parameters:
dst The destination ast_sockaddr
src The source ast_sockaddr
Return values:
void 

Definition at line 111 of file netsock2.h.

References ast_sockaddr::len.

Referenced by add_sdp(), ast_copy_ha(), ast_find_ourip(), ast_rtcp_read(), ast_rtp_alt_remote_address_set(), ast_rtp_instance_get_and_cmp_local_address(), ast_rtp_instance_get_and_cmp_remote_address(), ast_rtp_instance_get_local_address(), ast_rtp_instance_get_remote_address(), ast_rtp_instance_new(), ast_rtp_instance_set_alt_remote_address(), ast_rtp_instance_set_local_address(), ast_rtp_instance_set_remote_address(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_sip_ouraddrfor(), ast_sockaddr_resolve_first_af(), ast_tcptls_client_create(), ast_tcptls_server_root(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_get_peer(), ast_udptl_get_us(), ast_udptl_new_with_bindaddr(), ast_udptl_read(), ast_udptl_set_peer(), create_addr(), dialog_initialize_rtp(), dnsmgr_refresh(), find_peer(), get_our_media_address(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), handle_request_do(), parse_register_contact(), reg_source_db(), remote_bridge_loop(), resolve_first(), sip_alloc(), sip_do_debug_peer(), sip_prepare_socket(), and transmit_response_using_temp().

00113 {
00114    memcpy(dst, src, src->len);
00115    dst->len = src->len;
00116 };

int ast_sockaddr_hash ( const struct ast_sockaddr addr  ) 

Computes a hash value from the address. The port is ignored.

Since:
1.8
Return values:
0 Unknown address family
other A 32-bit hash derived from the address

Definition at line 404 of file netsock2.c.

References ast_log(), LOG_ERROR, and ast_sockaddr::ss.

Referenced by peer_iphash_cb(), and threadt_hash_cb().

00405 {
00406    /*
00407     * For IPv4, return the IP address as-is. For IPv6, return the last 32
00408     * bits.
00409     */
00410    switch (addr->ss.ss_family) {
00411    case AF_INET:
00412       return ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr;
00413    case AF_INET6:
00414       return ((uint32_t *)&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr)[3];
00415    default:
00416       ast_log(LOG_ERROR, "Unknown address family '%d'.\n",
00417          addr->ss.ss_family);
00418       return 0;
00419    }
00420 }

uint32_t ast_sockaddr_ipv4 ( const struct ast_sockaddr addr  ) 

Get an IPv4 address of an ast_sockaddr.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Returns:
IPv4 address in network byte order

Definition at line 366 of file netsock2.c.

References ast_sockaddr::ss.

Referenced by iax2_devicestate(), iax2_do_register(), iax2_poke_peer(), jingle_create_candidates(), load_module(), and multicast_send_control_packet().

00367 {
00368    const struct sockaddr_in *sin = (struct sockaddr_in *)&addr->ss;
00369    return ntohl(sin->sin_addr.s_addr);
00370 }

int ast_sockaddr_ipv4_mapped ( const struct ast_sockaddr addr,
struct ast_sockaddr ast_mapped 
)

Convert an IPv4-mapped IPv6 address into an IPv4 address.

Warning:
You should rarely need this function. Only call this if you know what you're doing.
Parameters:
addr The IPv4-mapped address to convert
mapped_addr The resulting IPv4 address
Return values:
0 Unable to make the conversion
1 Successful conversion

Definition at line 35 of file netsock2.c.

References ast_sockaddr_from_sin, ast_sockaddr_is_ipv4_mapped(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_append_ha(), ast_apply_ha(), ast_sockaddr_cmp(), ast_sockaddr_cmp_addr(), and ast_sockaddr_stringify_fmt().

00036 {
00037    const struct sockaddr_in6 *sin6;
00038    struct sockaddr_in sin4;
00039 
00040    if (!ast_sockaddr_is_ipv6(addr)) {
00041       return 0;
00042    }
00043 
00044    if (!ast_sockaddr_is_ipv4_mapped(addr)) {
00045       return 0;
00046    }
00047 
00048    sin6 = (const struct sockaddr_in6*)&addr->ss;
00049 
00050    memset(&sin4, 0, sizeof(sin4));
00051    sin4.sin_family = AF_INET;
00052    sin4.sin_port = sin6->sin6_port;
00053    sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3];
00054 
00055    ast_sockaddr_from_sin(ast_mapped, &sin4);
00056 
00057    return 1;
00058 }

int ast_sockaddr_is_any ( const struct ast_sockaddr addr  ) 

Determine if the address type is unspecified, or "any" address.

Since:
1.8
For IPv4, this would be the address 0.0.0.0, and for IPv6, this would be the address ::. The port number is ignored.

Return values:
1 This is an "any" address
0 This is not an "any" address

Definition at line 390 of file netsock2.c.

References ast_sockaddr_is_ipv4(), ast_sockaddr_is_ipv6(), and ast_sockaddr::ss.

Referenced by ast_find_ourip(), ast_set_qos(), ast_sip_ouraddrfor(), get_address_family_filter(), get_our_media_address(), gtalk_get_local_ip(), and sip_show_settings().

00391 {
00392    union {
00393       struct sockaddr_storage ss;
00394       struct sockaddr_in sin;
00395       struct sockaddr_in6 sin6;
00396    } tmp_addr = {
00397       .ss = addr->ss,
00398    };
00399 
00400    return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) ||
00401        (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr));
00402 }

int ast_sockaddr_is_ipv4 ( const struct ast_sockaddr addr  ) 

Determine if the address is an IPv4 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv4 address
0 This is an IPv6 or IPv4-mapped IPv6 address

Definition at line 372 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by apply_netmask(), ast_append_ha(), ast_apply_ha(), ast_rtp_new(), ast_rtp_prop_set(), and ast_sockaddr_is_any().

00373 {
00374    return addr->ss.ss_family == AF_INET &&
00375        addr->len == sizeof(struct sockaddr_in);
00376 }

int ast_sockaddr_is_ipv4_mapped ( const struct ast_sockaddr addr  ) 

Determine if this is an IPv4-mapped IPv6 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv4-mapped IPv6 address.
0 This is not an IPv4-mapped IPv6 address.

Definition at line 378 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), ast_apply_ha(), ast_rtp_instance_bridge(), and ast_sockaddr_ipv4_mapped().

00379 {
00380    const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr->ss;
00381    return addr->len && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr);
00382 }

int ast_sockaddr_is_ipv6 ( const struct ast_sockaddr addr  ) 

Determine if this is an IPv6 address.

Since:
1.8
Warning:
You should rarely need this function. Only use if you know what you're doing.
Return values:
1 This is an IPv6 or IPv4-mapped IPv6 address.
0 This is an IPv4 address.

Definition at line 384 of file netsock2.c.

References ast_sockaddr::len, and ast_sockaddr::ss.

Referenced by add_sdp(), apply_netmask(), ast_apply_ha(), ast_ouraddrfor(), ast_rtp_new(), ast_rtp_prop_set(), ast_set_qos(), ast_sip_ouraddrfor(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_is_any(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_new_with_bindaddr(), get_address_family_filter(), multicast_send_control_packet(), and sip_show_settings().

00385 {
00386    return addr->ss.ss_family == AF_INET6 &&
00387        addr->len == sizeof(struct sockaddr_in6);
00388 }

static int ast_sockaddr_isnull ( const struct ast_sockaddr addr  )  [inline, static]

Checks if the ast_sockaddr is null. "null" in this sense essentially means uninitialized, or having a 0 length.

Since:
1.8
Parameters:
addr Pointer to the ast_sockaddr we wish to check
Return values:
1 addr is null
0 addr is non-null.

Definition at line 83 of file netsock2.h.

References ast_sockaddr::len.

Referenced by _ast_sockaddr_to_sin(), _sip_show_peers(), add_sdp(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_remote_address_set(), ast_rtp_write(), ast_sip_ouraddrfor(), ast_sockaddr_stringify_fmt(), ast_tcptls_client_create(), ast_tcptls_server_start(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), build_peer(), check_rtp_timeout(), create_addr(), create_addr_from_peer(), get_our_media_address(), multicast_send_control_packet(), parse_register_contact(), peer_iphash_cb(), process_sdp(), register_verify(), remote_bridge_loop(), rtcp_debug_test_addr(), rtp_debug_test_addr(), sip_debug_test_addr(), sip_devicestate(), sip_do_debug_peer(), sip_poke_peer(), sip_prune_realtime(), sip_send_mwi_to_peer(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), udptl_debug_test_addr(), and unlink_peer_from_tables().

00084 {
00085    return !addr || addr->len == 0;
00086 }

int ast_sockaddr_parse ( struct ast_sockaddr addr,
const char *  str,
int  flags 
)

Parse an IPv4 or IPv6 address string.

Since:
1.8
Parses a string containing an IPv4 or IPv6 address followed by an optional port (separated by a colon) into a struct ast_sockaddr. The allowed formats are the following:

a.b.c.d a.b.c.d:port a:b:c:...:d [a:b:c:...:d] [a:b:c:...:d]:port

Host names are NOT allowed.

Parameters:
[out] addr The resulting ast_sockaddr
str The string to parse
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
Return values:
1 Success
0 Failure

Definition at line 180 of file netsock2.c.

References ast_log(), ast_sockaddr_split_hostport(), ast_strdupa, ast_sockaddr::len, LOG_ERROR, LOG_WARNING, S_OR, and ast_sockaddr::ss.

Referenced by ast_append_ha(), ast_parse_arg(), build_peer(), multicast_rtp_request(), proxy_update(), reg_source_db(), rtcp_do_debug_ip(), and rtp_do_debug_ip().

00181 {
00182    struct addrinfo hints;
00183    struct addrinfo   *res;
00184    char *s;
00185    char *host;
00186    char *port;
00187    int   e;
00188 
00189    s = ast_strdupa(str);
00190    if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
00191       return 0;
00192    }
00193 
00194    memset(&hints, 0, sizeof(hints));
00195    /* Hint to get only one entry from getaddrinfo */
00196    hints.ai_socktype = SOCK_DGRAM;
00197 
00198 #ifdef AI_NUMERICSERV
00199    hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
00200 #else
00201    hints.ai_flags = AI_NUMERICHOST;
00202 #endif
00203    if ((e = getaddrinfo(host, port, &hints, &res))) {
00204       if (e != EAI_NONAME) { /* if this was just a host name rather than a ip address, don't print error */
00205          ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
00206             host, S_OR(port, "(null)"), gai_strerror(e));
00207       }
00208       return 0;
00209    }
00210 
00211    /*
00212     * I don't see how this could be possible since we're not resolving host
00213     * names. But let's be careful...
00214     */
00215    if (res->ai_next != NULL) {
00216       ast_log(LOG_WARNING, "getaddrinfo() returned multiple "
00217          "addresses. Ignoring all but the first.\n");
00218    }
00219 
00220    addr->len = res->ai_addrlen;
00221    memcpy(&addr->ss, res->ai_addr, addr->len);
00222 
00223    freeaddrinfo(res);
00224 
00225    return 1;
00226 }

int ast_sockaddr_resolve ( struct ast_sockaddr **  addrs,
const char *  str,
int  flags,
int  family 
)

Parses a string with an IPv4 or IPv6 address and place results into an array.

Since:
1.8
Parses a string containing a host name or an IPv4 or IPv6 address followed by an optional port (separated by a colon). The result is returned into a array of struct ast_sockaddr. Allowed formats for str are the following:

hostname:port host.example.com:port a.b.c.d a.b.c.d:port a:b:c:...:d [a:b:c:...:d] [a:b:c:...:d]:port

Parameters:
[out] addrs The resulting array of ast_sockaddrs
str The string to parse
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
family Only addresses of the given family will be returned. Use 0 or AST_SOCKADDR_UNSPEC to get addresses of all families.
Return values:
0 Failure
non-zero The number of elements in addrs array.

Definition at line 228 of file netsock2.c.

References ast_log(), ast_malloc, ast_sockaddr_split_hostport(), ast_strdupa, cleanup(), len(), LOG_ERROR, and S_OR.

Referenced by ast_sockaddr_resolve_first_af(), gtalk_get_local_ip(), handle_cli_udptl_set_debug(), realtime_peer(), and resolve_first().

00230 {
00231    struct addrinfo hints, *res, *ai;
00232    char *s, *host, *port;
00233    int   e, i, res_cnt;
00234 
00235    s = ast_strdupa(str);
00236    if (!ast_sockaddr_split_hostport(s, &host, &port, flags)) {
00237       return 0;
00238    }
00239 
00240    memset(&hints, 0, sizeof(hints));
00241    hints.ai_family = family;
00242    hints.ai_socktype = SOCK_DGRAM;
00243 
00244    if ((e = getaddrinfo(host, port, &hints, &res))) {
00245       ast_log(LOG_ERROR, "getaddrinfo(\"%s\", \"%s\", ...): %s\n",
00246          host, S_OR(port, "(null)"), gai_strerror(e));
00247       return 0;
00248    }
00249 
00250    res_cnt = 0;
00251    for (ai = res; ai; ai = ai->ai_next) {
00252       res_cnt++;
00253    }
00254 
00255    if ((*addrs = ast_malloc(res_cnt * sizeof(struct ast_sockaddr))) == NULL) {
00256       res_cnt = 0;
00257       goto cleanup;
00258    }
00259 
00260    i = 0;
00261    for (ai = res; ai; ai = ai->ai_next) {
00262       (*addrs)[i].len = ai->ai_addrlen;
00263       memcpy(&(*addrs)[i].ss, ai->ai_addr, ai->ai_addrlen);
00264       ++i;
00265    }
00266 
00267 cleanup:
00268    freeaddrinfo(res);
00269    return res_cnt;
00270 }

static void ast_sockaddr_setnull ( struct ast_sockaddr addr  )  [inline, static]

Sets address addr to null.

Since:
1.8
Return values:
void 

Definition at line 96 of file netsock2.h.

References ast_sockaddr::len.

Referenced by ast_rtp_stop(), ast_udptl_stop(), build_peer(), multicast_rtp_request(), and set_peer_defaults().

00097 {
00098    addr->len = 0;
00099 }

int ast_sockaddr_split_hostport ( char *  str,
char **  host,
char **  port,
int  flags 
)

Splits a string into its host and port components.

Since:
1.8
Parameters:
str[in] The string to parse. May be modified by writing a NUL at the end of the host part.
host[out] Pointer to the host component within str.
port[out] Pointer to the port component within str.
flags If set to zero, a port MAY be present. If set to PARSE_PORT_IGNORE, a port MAY be present but will be ignored. If set to PARSE_PORT_REQUIRE, a port MUST be present. If set to PARSE_PORT_FORBID, a port MUST NOT be present.
Return values:
1 Success
0 Failure

Definition at line 121 of file netsock2.c.

References ast_debug, ast_log(), LOG_WARNING, PARSE_PORT_FORBID, PARSE_PORT_IGNORE, PARSE_PORT_MASK, and PARSE_PORT_REQUIRE.

Referenced by ast_sockaddr_parse(), and ast_sockaddr_resolve().

00122 {
00123    char *s = str;
00124 
00125    ast_debug(5, "Splitting '%s' gives...\n", str);
00126    *host = NULL;
00127    *port = NULL;
00128    if (*s == '[') {
00129       *host = ++s;
00130       for (; *s && *s != ']'; ++s) {
00131       }
00132       if (*s == ']') {
00133          *s++ = '\0';
00134       }
00135       if (*s == ':') {
00136          *port = s + 1;
00137       }
00138    } else {
00139       *host = s;
00140       for (; *s; ++s) {
00141          if (*s == ':') {
00142             if (*port) {
00143                *port = NULL;
00144                break;
00145             } else {
00146                *port = s;
00147             }
00148          }
00149       }
00150       if (*port) {
00151          **port = '\0';
00152          ++*port;
00153       }
00154    }
00155    ast_debug(5, "...host '%s' and port '%s'.\n", *host, *port);
00156 
00157    switch (flags & PARSE_PORT_MASK) {
00158    case PARSE_PORT_IGNORE:
00159       *port = NULL;
00160       break;
00161    case PARSE_PORT_REQUIRE:
00162       if (*port == NULL) {
00163          ast_log(LOG_WARNING, "missing port\n");
00164          return 0;
00165       }
00166       break;
00167    case PARSE_PORT_FORBID:
00168       if (*port != NULL) {
00169          ast_log(LOG_WARNING, "port disallowed\n");
00170          return 0;
00171       }
00172       break;
00173    }
00174 
00175    return 1;
00176 }

static char* ast_sockaddr_stringify ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() with default format.

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 187 of file netsock2.h.

References AST_SOCKADDR_STR_DEFAULT, and ast_sockaddr_stringify_fmt().

Referenced by __sip_xmit(), _sip_show_peer(), add_sdp(), apply_directmedia_ha(), ast_append_ha(), ast_parse_arg(), ast_rtcp_read(), ast_rtcp_write_rr(), ast_rtcp_write_sr(), ast_rtp_dtmf_begin(), ast_rtp_dtmf_continuation(), ast_rtp_dtmf_end_with_duration(), ast_rtp_raw_write(), ast_rtp_read(), ast_sip_ouraddrfor(), ast_tcptls_client_create(), ast_tcptls_client_start(), ast_tcptls_server_start(), ast_udptl_bridge(), ast_udptl_read(), ast_udptl_write(), bridge_p2p_rtp_write(), build_callid_pvt(), build_contact(), build_via(), check_peer_ok(), check_via(), create_dtmf_frame(), dnsmgr_refresh(), generate_uri(), gtalk_update_externip(), handle_cli_iax2_show_registry(), handle_cli_udptl_set_debug(), handle_incoming(), handle_manager_show_settings(), handle_request_bye(), handle_request_do(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_response_notify(), handle_response_refer(), manager_iax2_show_registry(), multicast_rtp_write(), parse_register_contact(), process_cn_rfc3389(), process_dtmf_rfc2833(), process_sdp(), reg_source_db(), register_verify(), remote_bridge_loop(), retrans_pkt(), rtcp_do_debug_ip(), rtp_do_debug_ip(), send_request(), send_response(), set_destination(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_show_channel(), sip_show_settings(), sip_show_tcp(), and stun_start_monitor().

00188 {
00189    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_DEFAULT);
00190 }

static char* ast_sockaddr_stringify_addr ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return an address only.

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 200 of file netsock2.h.

References AST_SOCKADDR_STR_ADDR, and ast_sockaddr_stringify_fmt().

Referenced by __iax2_show_peers(), _sip_show_peer(), _sip_show_peers(), add_sdp(), ast_ouraddrfor(), build_peer(), copy_via_headers(), function_iaxpeer(), function_sipchaninfo_read(), function_sippeer(), gtalk_create_candidates(), httpstatus_callback(), manager_iax2_show_peer_list(), parse_register_contact(), realtime_peer(), realtime_update_peer(), register_verify(), show_channels_cb(), show_chanstats_cb(), sip_do_debug_ip(), sip_do_debug_peer(), sip_show_channel(), and sip_show_settings().

00201 {
00202    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_ADDR);
00203 }

char* ast_sockaddr_stringify_fmt ( const struct ast_sockaddr addr,
int  format 
)

Convert a socket address to a string.

Since:
1.8
This will be of the form a.b.c.d:xyz for IPv4 and [a:b:c:...:d]:xyz for IPv6.

This function is thread-safe. The returned string is on static thread-specific storage.

Parameters:
addr The input to be stringified
format one of the following: AST_SOCKADDR_STR_DEFAULT: a.b.c.d:xyz for IPv4 [a:b:c:...:d]:xyz for IPv6. AST_SOCKADDR_STR_ADDR: address only a.b.c.d for IPv4 a:b:c:...:d for IPv6. AST_SOCKADDR_STR_HOST: address only, suitable for a URL a.b.c.d for IPv4 [a:b:c:...:d] for IPv6. AST_SOCKADDR_STR_PORT: port only
Return values:
(null) addr is null
"" An error occurred during processing
string The stringified form of the address

Definition at line 63 of file netsock2.c.

References ast_log(), ast_sockaddr_ipv4_mapped(), ast_sockaddr_isnull(), AST_SOCKADDR_STR_ADDR, AST_SOCKADDR_STR_DEFAULT, AST_SOCKADDR_STR_HOST, AST_SOCKADDR_STR_PORT, ast_sockaddr_stringify_buf, ast_str_buffer(), ast_str_set(), ast_str_thread_get(), ast_sockaddr::len, LOG_ERROR, ast_sockaddr::ss, and str.

Referenced by _sip_show_peers(), ast_sockaddr_stringify(), ast_sockaddr_stringify_addr(), ast_sockaddr_stringify_host(), and ast_sockaddr_stringify_port().

00064 {
00065    struct ast_sockaddr sa_ipv4;
00066    const struct ast_sockaddr *sa_tmp;
00067    char host[NI_MAXHOST];
00068    char port[NI_MAXSERV];
00069    struct ast_str *str;
00070    int e;
00071    static const size_t size = sizeof(host) - 1 + sizeof(port) - 1 + 4;
00072 
00073 
00074    if (ast_sockaddr_isnull(sa)) {
00075       return "(null)";
00076    }
00077 
00078    if (!(str = ast_str_thread_get(&ast_sockaddr_stringify_buf, size))) {
00079       return "";
00080    }
00081 
00082    if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) {
00083       sa_tmp = &sa_ipv4;
00084    } else {
00085       sa_tmp = sa;
00086    }
00087 
00088    if ((e = getnameinfo((struct sockaddr *)&sa_tmp->ss, sa->len,
00089               format & AST_SOCKADDR_STR_ADDR ? host : NULL,
00090               format & AST_SOCKADDR_STR_ADDR ? sizeof(host) : 0,
00091               format & AST_SOCKADDR_STR_PORT ? port : 0,
00092               format & AST_SOCKADDR_STR_PORT ? sizeof(port): 0,
00093               NI_NUMERICHOST | NI_NUMERICSERV))) {
00094       ast_log(LOG_ERROR, "getnameinfo(): %s\n", gai_strerror(e));
00095       return "";
00096    }
00097 
00098    switch (format)  {
00099    case AST_SOCKADDR_STR_DEFAULT:
00100       ast_str_set(&str, 0, sa_tmp->ss.ss_family == AF_INET6 ?
00101             "[%s]:%s" : "%s:%s", host, port);
00102       break;
00103    case AST_SOCKADDR_STR_ADDR:
00104       ast_str_set(&str, 0, "%s", host);
00105       break;
00106    case AST_SOCKADDR_STR_HOST:
00107       ast_str_set(&str, 0,
00108              sa_tmp->ss.ss_family == AF_INET6 ? "[%s]" : "%s", host);
00109       break;
00110    case AST_SOCKADDR_STR_PORT:
00111       ast_str_set(&str, 0, "%s", port);
00112       break;
00113    default:
00114       ast_log(LOG_ERROR, "Invalid format\n");
00115       return "";
00116    }
00117 
00118    return ast_str_buffer(str);
00119 }

static char* ast_sockaddr_stringify_host ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return an address only, suitable for a URL (with brackets for IPv6).

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 214 of file netsock2.h.

References AST_SOCKADDR_STR_HOST, and ast_sockaddr_stringify_fmt().

Referenced by add_diversion_header(), add_rpid(), build_callid_registry(), build_reply_digest(), create_addr_from_peer(), initreqprep(), peers_data_provider_get(), reg_source_db(), sip_poke_peer(), and transmit_notify_with_mwi().

00215 {
00216    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_HOST);
00217 }

static char* ast_sockaddr_stringify_port ( const struct ast_sockaddr addr  )  [inline, static]

Wrapper around ast_sockaddr_stringify_fmt() to return a port only.

Since:
1.8
Returns:
same as ast_sockaddr_stringify_fmt()

Definition at line 227 of file netsock2.h.

References AST_SOCKADDR_STR_PORT, and ast_sockaddr_stringify_fmt().

Referenced by add_sdp(), httpstatus_callback(), realtime_update_peer(), and register_verify().

00228 {
00229    return ast_sockaddr_stringify_fmt(addr, AST_SOCKADDR_STR_PORT);
00230 }


Generated on Wed Apr 6 11:30:06 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7