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

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 |
Definition in file utils.h.
| #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 | ) |
| #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_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 |
| #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__ |
| 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.
| sock | The socket to manipulate |
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().
| 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.
| 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] |
| 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] |
| void ast_uri_decode | ( | char * | s | ) |
Decode URI, URN, URL (overwrite string).
| 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
| 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 }
| unsigned int __unsigned_int_flags_dummy |
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.
1.5.6