Wed Oct 28 15:49:23 2009

Asterisk developer's documentation


utils.h File Reference

Utility functions. More...

#include "asterisk/compat.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <limits.h>
#include "asterisk/lock.h"
#include "asterisk/time.h"
#include "asterisk/strings.h"

Include dependency graph for utils.h:

Go to the source code of this file.

Data Structures

struct  ast_flags
struct  ast_hostent

Defines

#define ast_clear_flag(p, flag)
#define ast_clear_flag_nonstd(p, flag)
#define ast_copy_flags(dest, src, flagz)
#define ast_copy_flags_nonstd(dest, src, flagz)
#define AST_FLAGS_ALL   UINT_MAX
#define ast_pthread_create(a, b, c, d)   ast_pthread_create_stack(a,b,c,d,0)
#define ast_set2_flag(p, value, flag)
#define ast_set2_flag_nonstd(p, value, flag)
#define ast_set_flag(p, flag)
#define ast_set_flag_nonstd(p, flag)
#define AST_STACKSIZE   256 * 1024
#define ast_test_flag(p, flag)
#define ast_test_flag_nonstd(p, flag)
#define inet_ntoa   __dont__use__inet_ntoa__use__ast_inet_ntoa__instead__

Functions

int ast_base64decode (unsigned char *dst, const char *src, int max)
int ast_base64encode (char *dst, const unsigned char *src, int srclen, int max)
void ast_enable_packet_fragmentation (int sock)
 Disable PMTU discovery on a socket.
struct hostent * ast_gethostbyname (const char *host, struct ast_hostent *hp)
 Re-entrant (thread safe) version of gethostbyname that replaces the standard gethostbyname (which is not thread safe).
const char * ast_inet_ntoa (char *buf, int bufsiz, struct in_addr ia)
 ast_inet_ntoa: Recursive thread safe replacement of inet_ntoa
void ast_md5_hash (char *output, char *input)
 ast_md5_hash: Produce 16 char MD5 hash of value. ---
char * ast_process_quotes_and_slashes (char *start, char find, char replace_with)
 Process a string to find and replace characters.
int ast_pthread_create_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize)
void ast_sha1_hash (char *output, char *input)
 Produce 40 char SHA1 hash of value.
static force_inline void ast_slinear_saturated_add (short *input, short *value)
static force_inline void ast_slinear_saturated_divide (short *input, short *value)
static force_inline void ast_slinear_saturated_multiply (short *input, short *value)
void ast_uri_decode (char *s)
 Decode URI, URN, URL (overwrite string).
char * ast_uri_encode (char *string, char *outbuf, int buflen, int doreserved)
 Turn text string to URI-encoded XX version At this point, we're converting from ISO-8859-x (8-bit), not UTF8 as in the SIP protocol spec If doreserved == 1 we will convert reserved characters also. RFC 2396, section 2.4 outbuf needs to have more memory allocated than the instring to have room for the expansion. Every char that is converted is replaced by three ASCII characters.
int ast_utils_init (void)
int ast_wait_for_input (int fd, int ms)
int getloadavg (double *list, int nelem)
static force_inline int inaddrcmp (const struct sockaddr_in *sin1, const struct sockaddr_in *sin2)
int test_for_thread_safety (void)

Variables

unsigned int __unsigned_int_flags_dummy


Detailed Description

Utility functions.

Definition in file utils.h.


Define Documentation

#define ast_clear_flag ( p,
flag   ) 

#define ast_clear_flag_nonstd ( p,
flag   ) 

Value:

do { \
               ((p)->flags &= ~(flag)); \
               } while(0)

Definition at line 114 of file utils.h.

Referenced by build_transactions(), cache_lookup_internal(), dundi_lookup_local(), dundi_prop_precache(), and handle_command_response().

#define ast_copy_flags ( dest,
src,
flagz   ) 

#define ast_copy_flags_nonstd ( dest,
src,
flagz   ) 

Value:

do { \
               (dest)->flags &= ~(flagz); \
               (dest)->flags |= ((src)->flags & (flagz)); \
               } while (0)

Definition at line 118 of file utils.h.

#define AST_FLAGS_ALL   UINT_MAX

#define ast_pthread_create ( a,
b,
c,
 )     ast_pthread_create_stack(a,b,c,d,0)

#define ast_set2_flag ( p,
value,
flag   ) 

#define ast_set2_flag_nonstd ( p,
value,
flag   ) 

Definition at line 123 of file utils.h.

#define ast_set_flag ( p,
flag   ) 

Definition at line 69 of file utils.h.

Referenced by __ast_pbx_run(), __sip_reliable_xmit(), apply_peer(), ast_app_parse_options(), ast_cdr_detach(), ast_cdr_fork(), ast_cdr_reset(), ast_channel_bridge(), ast_channel_defer_dtmf(), ast_channel_spy_add(), ast_do_masquerade(), ast_hangup(), ast_request(), ast_rtp_raw_write(), ast_rtp_read(), ast_waitfor_nandfds(), authenticate_reply(), authenticate_request(), build_peer(), build_user(), builtin_atxfer(), channel_spy(), chanspy_exec(), check_access(), check_availability(), check_user_full(), check_via(), conf_exec(), create_addr_from_peer(), create_transaction(), decrypt_frame(), delete_users(), destroy_trans(), dial_exec_full(), dictate_exec(), do_parking_thread(), do_register(), dundi_encrypt(), dundi_lookup_local(), dundi_send(), expire_registry(), find_call(), find_user_realtime(), handle_command_response(), handle_common_options(), handle_request(), handle_request_bye(), handle_request_cancel(), handle_request_info(), handle_request_invite(), handle_request_options(), handle_request_refer(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_peerpoke(), handle_response_register(), iax2_predestroy(), iax2_provision(), iax2_prune_realtime(), launch_monitor_thread(), leave_voicemail(), linear_alloc(), load_config(), local_ast_moh_start(), macro_exec(), moh_register(), park_exec(), playtones_alloc(), post_cdr(), process_rfc3389(), process_sdp(), pvt_destructor(), qualify_peer(), queue_frame_to_spies(), realtime_peer(), realtime_user(), receive_message(), register_verify(), reload_config(), retrans_pkt(), set_config(), set_config_flags(), sip_call(), sip_dtmfmode(), sip_hangup(), sip_indicate(), sip_poke_peer(), sip_reg_timeout(), sip_send_mwi_to_peer(), sip_set_rtp_peer(), sip_write(), sipsock_read(), socket_read(), temp_peer(), tonepair_alloc(), transmit_register(), transmit_reinvite_with_sdp(), try_calling(), update_call_counter(), vm_exec(), vm_execmain(), and zt_read().

#define ast_set_flag_nonstd ( p,
flag   ) 

Value:

do { \
               ((p)->flags |= (flag)); \
               } while(0)

Definition at line 110 of file utils.h.

Referenced by dundi_lookup_internal(), dundi_query_eid_internal(), and handle_command_response().

#define AST_STACKSIZE   256 * 1024

Definition at line 226 of file utils.h.

Referenced by ast_pthread_create_stack().

#define ast_test_flag ( p,
flag   ) 

Definition at line 62 of file utils.h.

Referenced by __ast_pbx_run(), __do_deliver(), __iax2_show_peers(), __sip_ack(), __sip_destroy(), __sip_pretend_ack(), __sip_semi_ack(), __sip_show_channels(), __sip_xmit(), _sip_show_peer(), _sip_show_peers(), add_sdp(), agent_new(), app_exec(), ast_answer(), ast_autoservice_stop(), ast_call(), ast_cdr_answer(), ast_cdr_appenduserfield(), ast_cdr_busy(), ast_cdr_end(), ast_cdr_failed(), ast_cdr_fork(), ast_cdr_free(), ast_cdr_init(), ast_cdr_noanswer(), ast_cdr_reset(), ast_cdr_setaccount(), ast_cdr_setamaflags(), ast_cdr_setapp(), ast_cdr_setcid(), ast_cdr_setdestchan(), ast_cdr_setuserfield(), ast_cdr_start(), ast_cdr_update(), ast_channel_bridge(), ast_channel_defer_dtmf(), ast_channel_spy_add(), ast_channel_spy_free(), ast_channel_spy_read_frame(), ast_cli_netstats(), ast_do_masquerade(), ast_explicit_goto(), ast_feature_interpret(), ast_hangup(), ast_indicate(), ast_moh_files_next(), ast_queue_frame(), ast_read(), ast_readstring(), ast_readstring_full(), ast_rtp_bridge(), ast_rtp_raw_write(), ast_sendtext(), ast_serialize_showchan(), ast_setstate(), ast_softhangup_nolock(), ast_transfer(), ast_waitfordigit(), ast_waitfordigit_full(), ast_write(), authenticate_reply(), authenticate_request(), authenticate_verify(), build_peer(), build_user(), build_via(), chanspy_exec(), check_access(), check_auth(), check_pendings(), check_user_full(), check_via(), complete_sip_peer(), complete_sip_user(), conf_exec(), construct_rr(), copy_via_headers(), create_addr(), create_addr_from_peer(), decrypt_frame(), destroy_association(), destroy_trans(), dial_exec_full(), dictate_exec(), do_monitor(), dundi_encrypt(), dundi_exec(), dundi_helper(), dundi_lookup_exec(), dundi_lookup_local(), dundi_lookup_thread(), dundi_precache_thread(), dundi_query_thread(), dundi_rexmit(), dundi_send(), dundifunc_read(), expire_register(), expire_registry(), feature_exec_app(), find_cache(), find_conf(), find_user(), find_user_realtime(), forward_message(), free_user(), function_iaxpeer(), function_sippeer(), get_from_jb(), handle_command_response(), handle_frame(), handle_request(), handle_request_bye(), handle_request_cancel(), handle_request_info(), handle_request_invite(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_showchan(), iax2_bridge(), iax2_call(), iax2_destroy_helper(), iax2_devicestate(), iax2_getpeername(), iax2_getpeertrunk(), iax2_hangup(), iax2_predestroy(), iax2_prune_realtime(), iax2_request(), iax2_send(), iax2_show_channels(), iax2_show_peer(), iax2_show_users(), iax2_trunk_queue(), iax2_write(), initreqprep(), leave_voicemail(), macro_exec(), mixmonitor_exec(), mixmonitor_thread(), moh_classes_show(), moh_files_alloc(), moh_on_off(), notify_new_message(), page_exec(), parse_moved_contact(), parse_ok_contact(), parse_register_contact(), pbx_builtin_background(), pbx_builtin_waitexten(), play_message(), play_record_review(), post_cdr(), precache_transactions(), process_rfc3389(), process_sdp(), prune_users(), queue_frame_to_spies(), realtime_peer(), realtime_user(), reg_source_db(), register_verify(), registry_authrequest(), reqprep(), respprep(), retrans_pkt(), retrydial_exec(), schedule_delivery(), send_request(), send_response(), send_trunk(), sendmail(), set_config(), set_config_flags(), sip_addrcmp(), sip_alloc(), sip_debug_test_pvt(), sip_destroy_peer(), sip_destroy_user(), sip_dtmfmode(), sip_get_rtp_peer(), sip_get_vrtp_peer(), sip_hangup(), sip_indicate(), sip_new(), sip_prune_realtime(), sip_rtp_read(), sip_senddigit(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), sip_show_users(), sip_write(), sipsock_read(), socket_read(), spawn_mp3(), spy_detach(), start_spying(), startmon(), transmit_refer(), transmit_reinvite_with_sdp(), try_calling(), update_call_counter(), update_peer(), update_registry(), vm_exec(), vm_execmain(), vm_newuser(), and wait_for_answer().

#define ast_test_flag_nonstd ( p,
flag   ) 

Value:

({ \
               ((p)->flags & (flag)); \
               })

Definition at line 106 of file utils.h.

Referenced by cache_save_hint(), dundi_lookup_thread(), dundi_precache_thread(), and handle_command_response().

#define inet_ntoa   __dont__use__inet_ntoa__use__ast_inet_ntoa__instead__

Definition at line 214 of file utils.h.


Function Documentation

int ast_base64decode ( unsigned char *  dst,
const char *  src,
int  max 
)

Definition at line 319 of file utils.c.

Referenced by __ast_check_signature(), and ast_osp_validate().

00320 {
00321    int cnt = 0;
00322    unsigned int byte = 0;
00323    unsigned int bits = 0;
00324    int incnt = 0;
00325 #if 0
00326    unsigned char *odst = dst;
00327 #endif
00328    while(*src && (cnt < max)) {
00329       /* Shift in 6 bits of input */
00330       byte <<= 6;
00331       byte |= (b2a[(int)(*src)]) & 0x3f;
00332       bits += 6;
00333 #if 0
00334       printf("Add: %c %s\n", *src, binary(b2a[(int)(*src)] & 0x3f, 6));
00335 #endif
00336       src++;
00337       incnt++;
00338       /* If we have at least 8 bits left over, take that character 
00339          off the top */
00340       if (bits >= 8)  {
00341          bits -= 8;
00342          *dst = (byte >> bits) & 0xff;
00343 #if 0
00344          printf("Remove: %02x %s\n", *dst, binary(*dst, 8));
00345 #endif
00346          dst++;
00347          cnt++;
00348       }
00349    }
00350 #if 0
00351    dump(odst, cnt);
00352 #endif
00353    /* Dont worry about left over bits, they're extra anyway */
00354    return cnt;
00355 }

int ast_base64encode ( char *  dst,
const unsigned char *  src,
int  srclen,
int  max 
)

Definition at line 357 of file utils.c.

Referenced by __ast_sign(), ast_osp_lookup(), ast_osp_next(), and build_secret().

00358 {
00359    int cnt = 0;
00360    unsigned int byte = 0;
00361    int bits = 0;
00362    int index;
00363    int cntin = 0;
00364 #if 0
00365    char *odst = dst;
00366    dump(src, srclen);
00367 #endif
00368    /* Reserve one bit for end */
00369    max--;
00370    while((cntin < srclen) && (cnt < max)) {
00371       byte <<= 8;
00372 #if 0
00373       printf("Add: %02x %s\n", *src, binary(*src, 8));
00374 #endif
00375       byte |= *(src++);
00376       bits += 8;
00377       cntin++;
00378       while((bits >= 6) && (cnt < max)) {
00379          bits -= 6;
00380          /* We want only the top */
00381          index = (byte >> bits) & 0x3f;
00382          *dst = base64[index];
00383 #if 0
00384          printf("Remove: %c %s\n", *dst, binary(index, 6));
00385 #endif
00386          dst++;
00387          cnt++;
00388       }
00389    }
00390    if (bits && (cnt < max)) {
00391       /* Add one last character for the remaining bits, 
00392          padding the rest with 0 */
00393       byte <<= (6 - bits);
00394       index = (byte) & 0x3f;
00395       *(dst++) = base64[index];
00396       cnt++;
00397    }
00398    *dst = '\0';
00399    return cnt;
00400 }

void ast_enable_packet_fragmentation ( int  sock  ) 

Disable PMTU discovery on a socket.

Parameters:
sock The socket to manipulate
Returns:
Nothing
On Linux, UDP sockets default to sending packets with the Dont Fragment (DF) bit set. This is supposedly done to allow the application to do PMTU discovery, but Asterisk does not do this.

Because of this, UDP packets sent by Asterisk that are larger than the MTU of any hop in the path will be lost. This function can be called on a socket to ensure that the DF bit will not be set.

Definition at line 921 of file utils.c.

References ast_log(), and LOG_WARNING.

Referenced by ast_netsock_bindaddr(), and reload_config().

00922 {
00923 #ifdef __linux__
00924    int val = IP_PMTUDISC_DONT;
00925    
00926    if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
00927       ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
00928 #endif
00929 }

struct hostent* ast_gethostbyname ( const char *  host,
struct ast_hostent hp 
) [read]

Re-entrant (thread safe) version of gethostbyname that replaces the standard gethostbyname (which is not thread safe).

Definition at line 176 of file utils.c.

References ast_hostent::buf, ast_hostent::hp, and s.

Referenced by ast_dnsmgr_lookup(), ast_find_ourip(), ast_get_ip_or_srv(), ast_sip_ouraddrfor(), build_peer(), check_via(), create_addr(), festival_exec(), iax2_register(), iax_template_parse(), launch_netscript(), parse_ok_contact(), parse_register_contact(), process_sdp(), realtime_peer(), realtime_user(), refresh_list(), reload_config(), rpt_exec(), rtp_do_debug_ip(), set_config(), set_destination(), sip_devicestate(), and sip_do_debug_ip().

00177 {
00178    int res;
00179    int herrno;
00180    int dots=0;
00181    const char *s;
00182    struct hostent *result = NULL;
00183    /* Although it is perfectly legitimate to lookup a pure integer, for
00184       the sake of the sanity of people who like to name their peers as
00185       integers, we break with tradition and refuse to look up a
00186       pure integer */
00187    s = host;
00188    res = 0;
00189    while(s && *s) {
00190       if (*s == '.')
00191          dots++;
00192       else if (!isdigit(*s))
00193          break;
00194       s++;
00195    }
00196    if (!s || !*s) {
00197       /* Forge a reply for IP's to avoid octal IP's being interpreted as octal */
00198       if (dots != 3)
00199          return NULL;
00200       memset(hp, 0, sizeof(struct ast_hostent));
00201       hp->hp.h_addrtype = AF_INET;
00202       hp->hp.h_addr_list = (void *) hp->buf;
00203       hp->hp.h_addr = hp->buf + sizeof(void *);
00204       if (inet_pton(AF_INET, host, hp->hp.h_addr) > 0)
00205          return &hp->hp;
00206       return NULL;
00207       
00208    }
00209 #ifdef SOLARIS
00210    result = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &herrno);
00211 
00212    if (!result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
00213       return NULL;
00214 #else
00215    res = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &result, &herrno);
00216 
00217    if (res || !result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
00218       return NULL;
00219 #endif
00220    return &hp->hp;
00221 }

const char* ast_inet_ntoa ( char *  buf,
int  bufsiz,
struct in_addr  ia 
)

ast_inet_ntoa: Recursive thread safe replacement of inet_ntoa

Definition at line 486 of file utils.c.

Referenced by __iax2_show_peers(), __sip_show_channels(), __sip_xmit(), _sip_show_peer(), _sip_show_peers(), add_sdp(), ast_apply_ha(), ast_netsock_bindaddr(), ast_osp_validate(), ast_rtcp_read(), ast_rtp_bridge(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_sendcng(), ast_rtp_senddigit(), ast_sip_ouraddrfor(), attempt_transmit(), authenticate(), build_callid(), build_contact(), build_reply_digest(), build_rpid(), build_via(), calltoken_required(), check_access(), check_user_full(), check_via(), copy_via_headers(), create_addr_from_peer(), dump_addr(), dump_ipaddr(), dundi_rexmit(), dundi_show_peer(), dundi_show_peers(), dundi_show_trans(), dundi_showframe(), dundi_xmit(), external_rtp_create(), find_callno(), find_command(), find_peer(), find_subchannel_and_lock(), find_tpeer(), find_user(), function_iaxpeer(), function_sipchaninfo_read(), function_sippeer(), get_input(), handle_call_token(), handle_command_response(), handle_error(), handle_message(), handle_request(), handle_request_bye(), handle_request_register(), handle_request_subscribe(), handle_response(), handle_showmanconn(), iax2_ack_registry(), iax2_prov_app(), iax2_show_callnumber_usage(), iax2_show_channels(), iax2_show_peer(), iax2_show_registry(), iax2_trunk_queue(), iax_server(), iax_showframe(), initreqprep(), load_module(), mgcp_show_endpoints(), mgcpsock_read(), oh323_call(), oh323_set_rtp_peer(), parse_register_contact(), peercnt_add(), peercnt_modify(), peercnt_remove(), process_message(), process_rfc3389(), process_sdp(), raw_hangup(), realtime_peer(), realtime_update_peer(), realtime_user(), reg_source_db(), register_verify(), registry_rerequest(), reload_config(), resend_response(), retrans_pkt(), rpt_exec(), rtp_do_debug_ip(), sched_delay_remove(), send_dtmf(), send_packet(), send_request(), send_response(), send_trunk(), session_do(), set_config(), set_destination(), set_peercnt_limit(), setup_incoming_call(), sip_do_debug_ip(), sip_do_debug_peer(), sip_new(), sip_poke_peer(), sip_set_rtp_peer(), sip_show_channel(), sip_show_settings(), sipsock_read(), skinny_session(), skinny_show_devices(), socket_read(), timing_read(), transmit_notify_with_mwi(), and update_registry().

00487 {
00488    return inet_ntop(AF_INET, &ia, buf, bufsiz);
00489 }

void ast_md5_hash ( char *  output,
char *  input 
)

ast_md5_hash: Produce 16 char MD5 hash of value. ---

Definition at line 286 of file utils.c.

References MD5Final(), MD5Init(), and MD5Update().

Referenced by auth_exec(), build_reply_digest(), builtin_function_checkmd5(), builtin_function_md5(), check_auth(), md5_exec(), and md5check_exec().

00287 {
00288    struct MD5Context md5;
00289    unsigned char digest[16];
00290    char *ptr;
00291    int x;
00292 
00293    MD5Init(&md5);
00294    MD5Update(&md5, (unsigned char *)input, strlen(input));
00295    MD5Final(digest, &md5);
00296    ptr = output;
00297    for (x=0; x<16; x++)
00298       ptr += sprintf(ptr, "%2.2x", digest[x]);
00299 }

char* ast_process_quotes_and_slashes ( char *  start,
char  find,
char  replace_with 
)

Process a string to find and replace characters.

Parameters:
start The string to analyze
find The character to find
replace_with The character that will replace the one we are looking for

Definition at line 895 of file utils.c.

Referenced by __build_step(), handle_context_add_extension(), and pbx_load_module().

00896 {
00897    char *dataPut = start;
00898    int inEscape = 0;
00899    int inQuotes = 0;
00900 
00901    for (; *start; start++) {
00902       if (inEscape) {
00903          *dataPut++ = *start;       /* Always goes verbatim */
00904          inEscape = 0;
00905          } else {
00906          if (*start == '\\') {
00907             inEscape = 1;      /* Do not copy \ into the data */
00908          } else if (*start == '\'') {
00909             inQuotes = 1-inQuotes;   /* Do not copy ' into the data */
00910          } else {
00911             /* Replace , with |, unless in quotes */
00912             *dataPut++ = inQuotes ? *start : ((*start==find) ? replace_with : *start);
00913          }
00914       }
00915    }
00916    if (start != dataPut)
00917       *dataPut = 0;
00918    return dataPut;
00919 }

int ast_pthread_create_stack ( pthread_t *  thread,
pthread_attr_t *  attr,
void *(*)(void *)  start_routine,
void *  data,
size_t  stacksize 
)

Definition at line 501 of file utils.c.

References ast_log(), AST_STACKSIZE, LOG_WARNING, and pthread_create.

00502 {
00503    pthread_attr_t lattr;
00504    if (!attr) {
00505       pthread_attr_init(&lattr);
00506       attr = &lattr;
00507    }
00508 #ifdef __linux__
00509    /* On Linux, pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
00510       which is kind of useless. Change this here to
00511       PTHREAD_INHERIT_SCHED; that way the -p option to set realtime
00512       priority will propagate down to new threads by default.
00513       This does mean that callers cannot set a different priority using
00514       PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
00515       the priority afterwards with pthread_setschedparam(). */
00516    errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED);
00517    if (errno)
00518       ast_log(LOG_WARNING, "pthread_attr_setinheritsched returned non-zero: %s\n", strerror(errno));
00519 #endif
00520 
00521    if (!stacksize)
00522       stacksize = AST_STACKSIZE;
00523    errno = pthread_attr_setstacksize(attr, stacksize);
00524    if (errno)
00525       ast_log(LOG_WARNING, "pthread_attr_setstacksize returned non-zero: %s\n", strerror(errno));
00526    return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
00527 }

void ast_sha1_hash ( char *  output,
char *  input 
)

Produce 40 char SHA1 hash of value.

Definition at line 302 of file utils.c.

References SHA1Input(), SHA1Reset(), and SHA1Result().

Referenced by handle_call_token().

00303 {
00304    struct SHA1Context sha;
00305    char *ptr;
00306    int x;
00307    uint8_t Message_Digest[20];
00308 
00309    SHA1Reset(&sha);
00310    
00311    SHA1Input(&sha, (const unsigned char *) input, strlen(input));
00312 
00313    SHA1Result(&sha, Message_Digest);
00314    ptr = output;
00315    for (x = 0; x < 20; x++)
00316       ptr += sprintf(ptr, "%2.2x", Message_Digest[x]);
00317 }

static force_inline void ast_slinear_saturated_add ( short *  input,
short *  value 
) [static]

Definition at line 176 of file utils.h.

Referenced by ast_frame_slinear_sum().

00177 {
00178    int res;
00179 
00180    res = (int) *input + *value;
00181    if (res > 32767)
00182       *input = 32767;
00183    else if (res < -32767)
00184       *input = -32767;
00185    else
00186       *input = (short) res;
00187 }

static force_inline void ast_slinear_saturated_divide ( short *  input,
short *  value 
) [static]

Definition at line 202 of file utils.h.

Referenced by ast_frame_adjust_volume().

00203 {
00204    *input /= *value;
00205 }

static force_inline void ast_slinear_saturated_multiply ( short *  input,
short *  value 
) [static]

Definition at line 189 of file utils.h.

Referenced by ast_frame_adjust_volume().

00190 {
00191    int res;
00192 
00193    res = (int) *input * *value;
00194    if (res > 32767)
00195       *input = 32767;
00196    else if (res < -32767)
00197       *input = -32767;
00198    else
00199       *input = (short) res;
00200 }

void ast_uri_decode ( char *  s  ) 

Decode URI, URN, URL (overwrite string).

Parameters:
s String to be decoded

Definition at line 469 of file utils.c.

Referenced by builtin_function_uridecode(), check_user_full(), get_destination(), get_refer_info(), and register_verify().

00470 {
00471    char *o;
00472    unsigned int tmp;
00473 
00474    for (o = s; *s; s++, o++) {
00475       if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) {
00476          /* have '%', two chars and correct parsing */
00477          *o = tmp;
00478          s += 2;  /* Will be incremented once more when we break out */
00479       } else /* all other cases, just copy */
00480          *o = *s;
00481    }
00482    *o = '\0';
00483 }

char* ast_uri_encode ( char *  string,
char *  outbuf,
int  buflen,
int  doreserved 
)

Turn text string to URI-encoded XX version At this point, we're converting from ISO-8859-x (8-bit), not UTF8 as in the SIP protocol spec If doreserved == 1 we will convert reserved characters also. RFC 2396, section 2.4 outbuf needs to have more memory allocated than the instring to have room for the expansion. Every char that is converted is replaced by three ASCII characters.

ast_uri_encode

Parameters:
string String to be converted
outbuf Resulting encoded string
buflen Size of output buffer
doreserved Convert reserved characters

Definition at line 438 of file utils.c.

Referenced by builtin_function_uriencode(), and initreqprep().

00439 {
00440    char *reserved = ";/?:@&=+$, ";  /* Reserved chars */
00441 
00442    char *ptr  = string; /* Start with the string */
00443    char *out = NULL;
00444    char *buf = NULL;
00445 
00446    strncpy(outbuf, string, buflen);
00447 
00448    /* If there's no characters to convert, just go through and don't do anything */
00449    while (*ptr) {
00450       if (((unsigned char) *ptr) > 127 || (doreserved && strchr(reserved, *ptr)) ) {
00451          /* Oops, we need to start working here */
00452          if (!buf) {
00453             buf = outbuf;
00454             out = buf + (ptr - string) ;  /* Set output ptr */
00455          }
00456          out += sprintf(out, "%%%02x", (unsigned char) *ptr);
00457       } else if (buf) {
00458          *out = *ptr;   /* Continue copying the string */
00459          out++;
00460       } 
00461       ptr++;
00462    }
00463    if (buf)
00464       *out = '\0';
00465    return outbuf;
00466 }

int ast_utils_init ( void   ) 

Definition at line 491 of file utils.c.

References base64_init().

Referenced by main().

00492 {
00493    base64_init();
00494    return 0;
00495 }

int ast_wait_for_input ( int  fd,
int  ms 
)

Definition at line 529 of file utils.c.

References pollfd::events, pollfd::fd, poll(), POLLIN, and POLLPRI.

Referenced by ast_moh_destroy().

00530 {
00531    struct pollfd pfd[1];
00532    memset(pfd, 0, sizeof(pfd));
00533    pfd[0].fd = fd;
00534    pfd[0].events = POLLIN|POLLPRI;
00535    return poll(pfd, 1, ms);
00536 }

int getloadavg ( double *  list,
int  nelem 
)

Definition at line 883 of file utils.c.

Referenced by ast_readconfig(), and increase_call_count().

00884 {
00885    int i;
00886 
00887    for (i = 0; i < nelem; i++) {
00888       list[i] = 0.1;
00889    }
00890    return -1;
00891 }

static force_inline int inaddrcmp ( const struct sockaddr_in *  sin1,
const struct sockaddr_in *  sin2 
) [static]

Compares the source address and port of two sockaddr_in

Definition at line 220 of file utils.h.

Referenced by ast_netsock_find(), ast_rtp_bridge(), find_peer(), find_tpeer(), find_transaction(), handle_command_response(), iax2_ack_registry(), parse_register_contact(), registry_rerequest(), sip_addrcmp(), socket_read(), and update_registry().

00221 {
00222    return ((sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) 
00223       || (sin1->sin_port != sin2->sin_port));
00224 }

int test_for_thread_safety ( void   ) 

Definition at line 257 of file utils.c.

References ast_mutex_lock(), ast_mutex_unlock(), ast_pthread_create, and test_thread_body().

Referenced by main().

00258 { 
00259    ast_mutex_lock(&test_lock2);
00260    ast_mutex_lock(&test_lock);
00261    lock_count += 1;
00262    ast_mutex_lock(&test_lock);
00263    lock_count += 1;
00264    ast_pthread_create(&test_thread, NULL, test_thread_body, NULL); 
00265    usleep(100);
00266    if (lock_count != 2) 
00267       test_errors++;
00268    ast_mutex_unlock(&test_lock);
00269    lock_count -= 1;
00270    usleep(100); 
00271    if (lock_count != 1) 
00272       test_errors++;
00273    ast_mutex_unlock(&test_lock);
00274    lock_count -= 1;
00275    if (lock_count != 0) 
00276       test_errors++;
00277    ast_mutex_unlock(&test_lock2);
00278    usleep(100);
00279    if (lock_count != 0) 
00280       test_errors++;
00281    pthread_join(test_thread, NULL);
00282    return(test_errors);          /* return 0 on success. */
00283 }


Variable Documentation

Note:
   Note:
   It is very important to use only unsigned variables to hold
   bit flags, as otherwise you can fall prey to the compiler's
   sign-extension antics if you try to use the top two bits in
   your variable.

   The flag macros below use a set of compiler tricks to verify
   that the caller is using an "unsigned int" variable to hold
   the flags, and nothing else. If the caller uses any other
   type of variable, a warning message similar to this:

   warning: comparison of distinct pointer types lacks cast
   will be generated.

   The "dummy" variable below is used to make these comparisons.

   Also note that at -O2 or above, this type-safety checking
   does _not_ produce any additional object code at all.
 


Generated on Wed Oct 28 15:49:24 2009 for Asterisk - the Open Source PBX by  doxygen 1.5.6