Wed Aug 20 06:43:06 2008

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:

This graph shows which files directly or indirectly include this file:

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.
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)
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_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_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_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(), 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,
 )     ast_pthread_create_stack(a,b,c,d,0)

Definition at line 223 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(), 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(), test_for_thread_safety(), vpb_answer(), and zt_handle_event().

#define ast_set2_flag ( p,
value,
flag   ) 

Definition at line 93 of file utils.h.

Referenced by 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_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(), 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_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_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 222 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_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_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_user(), reg_source_db(), register_verify(), registry_authrequest(), reqprep(), respprep(), retrans_pkt(), retrydial_exec(), 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 210 of file utils.h.


Function Documentation

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

Definition at line 300 of file utils.c.

References MD5Context::bits.

Referenced by __ast_check_signature(), and ast_osp_validate().

00301 {
00302    int cnt = 0;
00303    unsigned int byte = 0;
00304    unsigned int bits = 0;
00305    int incnt = 0;
00306 #if 0
00307    unsigned char *odst = dst;
00308 #endif
00309    while(*src && (cnt < max)) {
00310       /* Shift in 6 bits of input */
00311       byte <<= 6;
00312       byte |= (b2a[(int)(*src)]) & 0x3f;
00313       bits += 6;
00314 #if 0
00315       printf("Add: %c %s\n", *src, binary(b2a[(int)(*src)] & 0x3f, 6));
00316 #endif
00317       src++;
00318       incnt++;
00319       /* If we have at least 8 bits left over, take that character 
00320          off the top */
00321       if (bits >= 8)  {
00322          bits -= 8;
00323          *dst = (byte >> bits) & 0xff;
00324 #if 0
00325          printf("Remove: %02x %s\n", *dst, binary(*dst, 8));
00326 #endif
00327          dst++;
00328          cnt++;
00329       }
00330    }
00331 #if 0
00332    dump(odst, cnt);
00333 #endif
00334    /* Dont worry about left over bits, they're extra anyway */
00335    return cnt;
00336 }

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

Definition at line 338 of file utils.c.

References MD5Context::bits.

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

00339 {
00340    int cnt = 0;
00341    unsigned int byte = 0;
00342    int bits = 0;
00343    int index;
00344    int cntin = 0;
00345 #if 0
00346    char *odst = dst;
00347    dump(src, srclen);
00348 #endif
00349    /* Reserve one bit for end */
00350    max--;
00351    while((cntin < srclen) && (cnt < max)) {
00352       byte <<= 8;
00353 #if 0
00354       printf("Add: %02x %s\n", *src, binary(*src, 8));
00355 #endif
00356       byte |= *(src++);
00357       bits += 8;
00358       cntin++;
00359       while((bits >= 6) && (cnt < max)) {
00360          bits -= 6;
00361          /* We want only the top */
00362          index = (byte >> bits) & 0x3f;
00363          *dst = base64[index];
00364 #if 0
00365          printf("Remove: %c %s\n", *dst, binary(index, 6));
00366 #endif
00367          dst++;
00368          cnt++;
00369       }
00370    }
00371    if (bits && (cnt < max)) {
00372       /* Add one last character for the remaining bits, 
00373          padding the rest with 0 */
00374       byte <<= (6 - bits);
00375       index = (byte) & 0x3f;
00376       *(dst++) = base64[index];
00377       cnt++;
00378    }
00379    *dst = '\0';
00380    return cnt;
00381 }

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 902 of file utils.c.

References ast_log(), and LOG_WARNING.

Referenced by ast_netsock_bindaddr(), and reload_config().

00903 {
00904 #ifdef __linux__
00905    int val = IP_PMTUDISC_DONT;
00906    
00907    if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
00908       ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
00909 #endif
00910 }

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

Definition at line 175 of file utils.c.

References 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().

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

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 467 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_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(), 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_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(), 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_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(), 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(), send_dtmf(), send_packet(), send_request(), send_response(), send_trunk(), set_config(), set_destination(), 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().

00468 {
00469    return inet_ntop(AF_INET, &ia, buf, bufsiz);
00470 }

void ast_md5_hash ( char *  output,
char *  input 
)

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

Definition at line 285 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().

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

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 876 of file utils.c.

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

00877 {
00878    char *dataPut = start;
00879    int inEscape = 0;
00880    int inQuotes = 0;
00881 
00882    for (; *start; start++) {
00883       if (inEscape) {
00884          *dataPut++ = *start;       /* Always goes verbatim */
00885          inEscape = 0;
00886          } else {
00887          if (*start == '\\') {
00888             inEscape = 1;      /* Do not copy \ into the data */
00889          } else if (*start == '\'') {
00890             inQuotes = 1-inQuotes;   /* Do not copy ' into the data */
00891          } else {
00892             /* Replace , with |, unless in quotes */
00893             *dataPut++ = inQuotes ? *start : ((*start==find) ? replace_with : *start);
00894          }
00895       }
00896    }
00897    if (start != dataPut)
00898       *dataPut = 0;
00899    return dataPut;
00900 }

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

Definition at line 482 of file utils.c.

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

00483 {
00484    pthread_attr_t lattr;
00485    if (!attr) {
00486       pthread_attr_init(&lattr);
00487       attr = &lattr;
00488    }
00489 #ifdef __linux__
00490    /* On Linux, pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
00491       which is kind of useless. Change this here to
00492       PTHREAD_INHERIT_SCHED; that way the -p option to set realtime
00493       priority will propagate down to new threads by default.
00494       This does mean that callers cannot set a different priority using
00495       PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
00496       the priority afterwards with pthread_setschedparam(). */
00497    errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED);
00498    if (errno)
00499       ast_log(LOG_WARNING, "pthread_attr_setinheritsched returned non-zero: %s\n", strerror(errno));
00500 #endif
00501 
00502    if (!stacksize)
00503       stacksize = AST_STACKSIZE;
00504    errno = pthread_attr_setstacksize(attr, stacksize);
00505    if (errno)
00506       ast_log(LOG_WARNING, "pthread_attr_setstacksize returned non-zero: %s\n", strerror(errno));
00507    return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
00508 }

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

Definition at line 172 of file utils.h.

Referenced by ast_frame_slinear_sum().

00173 {
00174    int res;
00175 
00176    res = (int) *input + *value;
00177    if (res > 32767)
00178       *input = 32767;
00179    else if (res < -32767)
00180       *input = -32767;
00181    else
00182       *input = (short) res;
00183 }

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

Definition at line 198 of file utils.h.

Referenced by ast_frame_adjust_volume().

00199 {
00200    *input /= *value;
00201 }

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

Definition at line 185 of file utils.h.

Referenced by ast_frame_adjust_volume().

00186 {
00187    int res;
00188 
00189    res = (int) *input * *value;
00190    if (res > 32767)
00191       *input = 32767;
00192    else if (res < -32767)
00193       *input = -32767;
00194    else
00195       *input = (short) res;
00196 }

void ast_uri_decode ( char *  s  ) 

Decode URI, URN, URL (overwrite string).

Parameters:
s String to be decoded

Definition at line 450 of file utils.c.

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

00451 {
00452    char *o;
00453    unsigned int tmp;
00454 
00455    for (o = s; *s; s++, o++) {
00456       if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) {
00457          /* have '%', two chars and correct parsing */
00458          *o = tmp;
00459          s += 2;  /* Will be incremented once more when we break out */
00460       } else /* all other cases, just copy */
00461          *o = *s;
00462    }
00463    *o = '\0';
00464 }

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 419 of file utils.c.

Referenced by builtin_function_uriencode(), and initreqprep().

00420 {
00421    char *reserved = ";/?:@&=+$, ";  /* Reserved chars */
00422 
00423    char *ptr  = string; /* Start with the string */
00424    char *out = NULL;
00425    char *buf = NULL;
00426 
00427    strncpy(outbuf, string, buflen);
00428 
00429    /* If there's no characters to convert, just go through and don't do anything */
00430    while (*ptr) {
00431       if (((unsigned char) *ptr) > 127 || (doreserved && strchr(reserved, *ptr)) ) {
00432          /* Oops, we need to start working here */
00433          if (!buf) {
00434             buf = outbuf;
00435             out = buf + (ptr - string) ;  /* Set output ptr */
00436          }
00437          out += sprintf(out, "%%%02x", (unsigned char) *ptr);
00438       } else if (buf) {
00439          *out = *ptr;   /* Continue copying the string */
00440          out++;
00441       } 
00442       ptr++;
00443    }
00444    if (buf)
00445       *out = '\0';
00446    return outbuf;
00447 }

int ast_utils_init ( void   ) 

Definition at line 472 of file utils.c.

References base64_init().

Referenced by main().

00473 {
00474    base64_init();
00475    return 0;
00476 }

int ast_wait_for_input ( int  fd,
int  ms 
)

Definition at line 510 of file utils.c.

References poll(), POLLIN, and POLLPRI.

Referenced by ast_moh_destroy().

00511 {
00512    struct pollfd pfd[1];
00513    memset(pfd, 0, sizeof(pfd));
00514    pfd[0].fd = fd;
00515    pfd[0].events = POLLIN|POLLPRI;
00516    return poll(pfd, 1, ms);
00517 }

<