Asterisk.org: Developer Documentation (28 Oct 2009)

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

Definition at line 76 of file utils.h.

Referenced by ast_app_parse_options(), ast_bridge_call(), ast_cdr_reset(), ast_channel_bridge(), ast_channel_spy_add(), ast_channel_spy_read_frame(), ast_channel_undefer_dtmf(), ast_deactivate_generator(), ast_read(), ast_sendtext(), ast_waitfor_nandfds(), ast_write(), authenticate_verify(), build_peer(), build_user(), builtin_atxfer(), channel_spy(), chanspy_exec(), check_goto_on_transfer(), check_pendings(), create_addr(), dictate_exec(), do_parking_thread(), dundi_lookup_local(), find_conf(), forward_message(), handle_command_response(), handle_common_options(), handle_request_invite(), handle_request_subscribe(), linear_alloc(), local_ast_moh_stop(), phone_read(), playtones_alloc(), process_sdp(), queue_frame_to_spies(), register_verify(), reload_config(), reset_transaction(), set_config_flags(), sip_dtmfmode(), sip_hangup(), socket_read(), update_call_counter(), wait_for_answer(), and zt_read().

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

Definition at line 83 of file utils.h.

Referenced by agent_read(), ast_cdr_reset(), ast_do_masquerade(), ast_feature_interpret(), build_peer(), build_user(), cache_lookup_internal(), check_access(), check_user_full(), create_addr(), create_addr_from_peer(), dial_exec_full(), dundi_lookup_local(), find_callno(), iax2_request(), populate_defaults(), realtime_peer(), register_verify(), sip_alloc(), sip_poke_peer(), temp_peer(), transmit_response_using_temp(), vm_exec(), and wait_for_answer().

#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

Definition at line 130 of file utils.h.

Referenced by ast_app_parse_options(), ast_cdr_reset(), ast_feature_interpret(), builtin_atxfer(), cache_lookup_internal(), chanspy_exec(), check_goto_on_transfer(), dundi_lookup_local(), populate_defaults(), reload_config(), and set_config_flags().

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

Definition at line 227 of file utils.h.

Referenced by accept_thread(), action_originate(), ast_autoservice_start(), ast_bridge_call_thread_launch(), ast_cdr_submit_batch(), ast_device_state_engine_init(), ast_makesocket(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_start(), conf_run(), do_reload(), dundi_answer_entity(), dundi_answer_query(), dundi_prop_precache(), function_autopatchup(), handle_hd_hf(), handle_init_event(), handle_message(), iax_park(), init_manager(), launch_monitor_thread(), launch_page(), launch_service(), listener(), load_module(), main(), moh_register(), reload_config(), restart_monitor(), rpt(), rpt_master(), rpt_telemetry(), show_console(), sip_park(), spawn_dp_lookup(), start_network_thread(), statechange_queue(), store_config(), test_for_thread_safety(), vpb_answer(), vpb_call(), and zt_handle_event().

#define ast_set2_flag | ( | p,
|  | value,
|  | flag |  | ) |

Definition at line 93 of file utils.h.

Referenced by __ast_pbx_run(), apply_option(), build_peer(), build_user(), check_access(), dial_exec_full(), find_user(), forkcdr_exec(), handle_common_options(), load_config(), load_moh_classes(), macro_exec(), reload_config(), and set_config().

#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

unsigned int __unsigned_int_flags_dummy

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.