Utility functions. More...
#include "asterisk/network.h"#include <time.h>#include <unistd.h>#include <string.h>#include "asterisk/lock.h"#include "asterisk/logger.h"#include "asterisk/localtime.h"#include "asterisk/stringfields.h"#include "asterisk/strings.h"
Go to the source code of this file.
Data Structures | |
| struct | ast_eid |
| An Entity ID is essentially a MAC address, brief and unique. More... | |
| struct | ast_flags |
| Structure used to handle boolean flags. More... | |
| struct | ast_flags64 |
| Structure used to handle a large number of boolean flags == used only in app_dial? More... | |
| struct | ast_hostent |
| struct | ast_http_digest |
Defines | |
| #define | ARRAY_LEN(a) (size_t) (sizeof(a) / sizeof(0[a])) |
| #define | ast_align_for(offset, type) (((offset + __alignof__(type) - 1) / __alignof__(type)) * __alignof__(type)) |
| Increase offset so it is a multiple of the required alignment of type. | |
| #define | ast_alignof(type) __alignof__(type) |
| Return the number of bytes used in the alignment of type. | |
| #define | ast_alloca(size) __builtin_alloca(size) |
| call __builtin_alloca to ensure we get gcc builtin semantics | |
| #define | ast_assert(a) |
| #define | AST_BACKGROUND_STACKSIZE AST_STACKSIZE |
| #define | ast_clear_flag(p, flag) |
| #define | ast_clear_flag64(p, flag) |
| #define | ast_clear_flag_nonstd(p, flag) |
| #define | ast_copy_flags(dest, src, flagz) |
| #define | ast_copy_flags64(dest, src, flagz) |
| #define | ast_copy_flags_nonstd(dest, src, flagz) |
| #define | AST_FLAGS_ALL UINT_MAX |
| #define | ast_make_room_for(offset, type) (((offset + (2 * __alignof__(type) - 1)) / __alignof__(type)) * __alignof__(type)) |
| Increase offset by the required alignment of type and make sure it is a multiple of said alignment. | |
| #define | ast_pthread_create(a, b, c, d) |
| #define | ast_pthread_create_background(a, b, c, d) |
| #define | ast_pthread_create_detached(a, b, c, d) |
| #define | ast_pthread_create_detached_background(a, b, c, d) |
| #define | ast_set2_flag(p, value, flag) |
| #define | ast_set2_flag64(p, value, flag) |
| #define | ast_set2_flag_nonstd(p, value, flag) |
| #define | ast_set_flag(p, flag) |
| #define | ast_set_flag64(p, flag) |
| #define | ast_set_flag_nonstd(p, flag) |
| #define | ast_set_flags_to(p, flag, value) |
| #define | ast_set_flags_to64(p, flag, value) |
| #define | AST_STACKSIZE (((sizeof(void *) * 8 * 8) - 16) * 1024) |
| #define | ast_strdupa(s) |
| duplicate a string in memory from the stack | |
| #define | ast_test_flag(p, flag) |
| #define | ast_test_flag64(p, flag) |
| #define | ast_test_flag_nonstd(p, flag) ((p)->flags & (flag)) |
| #define | localtime_r __dont_use_localtime_r_use_ast_localtime_instead__ |
| #define | MAX(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a < __b) ? __b : __a);}) |
| #define | MIN(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a > __b) ? __b : __a);}) |
| #define | RAII_VAR(vartype, varname, initval, dtor) |
| Declare a variable that will call a destructor function when it goes out of scope. | |
Functions | |
| int | ast_base64decode (unsigned char *dst, const char *src, int max) |
| Decode data from base64. | |
| int | ast_base64encode (char *dst, const unsigned char *src, int srclen, int max) |
| Encode data in base64. | |
| int | ast_base64encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks) |
| encode text to BASE64 coding | |
| int | ast_careful_fwrite (FILE *f, int fd, const char *s, size_t len, int timeoutms) |
| Write data to a file stream with a timeout. | |
| int | ast_carefulwrite (int fd, char *s, int len, int timeoutms) |
| Try to write string, but wait no more than ms milliseconds before timing out. | |
| void | ast_do_crash (void) |
| Force a crash if DO_CRASH is defined. | |
| int | ast_eid_cmp (const struct ast_eid *eid1, const struct ast_eid *eid2) |
| Compare two EIDs. | |
| char * | ast_eid_to_str (char *s, int maxlen, struct ast_eid *eid) |
| void | ast_enable_packet_fragmentation (int sock) |
| Disable PMTU discovery on a socket. | |
| char * | ast_escape_quoted (const char *string, char *outbuf, int buflen) |
| Escape characters found in a quoted string. | |
| struct hostent * | ast_gethostbyname (const char *host, struct ast_hostent *hp) |
| Thread-safe gethostbyname function to use in Asterisk. | |
| void | ast_md5_hash (char *output, const char *input) |
| Produces MD5 hash based on input string. | |
| int | ast_mkdir (const char *path, int mode) |
| Recursively create directory path. | |
| int | ast_parse_digest (const char *digest, struct ast_http_digest *d, int request, int pedantic) |
| Parse digest authorization header. | |
| 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_detached_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn) |
| int | ast_pthread_create_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn) |
| long int | ast_random (void) |
| void | ast_register_thread (char *name) |
| void | ast_set_default_eid (struct ast_eid *eid) |
| Fill in an ast_eid with the default eid of this machine. | |
| void | ast_sha1_hash (char *output, const char *input) |
| Produces SHA1 hash based on input string. | |
| 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) |
| static force_inline void | ast_slinear_saturated_subtract (short *input, short *value) |
| int | ast_str_to_eid (struct ast_eid *eid, const char *s) |
| Convert a string into an EID. | |
| void | ast_unregister_thread (void *id) |
| void | ast_uri_decode (char *s) |
| Decode URI, URN, URL (overwrite string). | |
| char * | ast_uri_encode (const char *string, char *outbuf, int buflen, int do_special_char) |
| Turn text string to URI-encoded XX version. | |
| int | ast_utils_init (void) |
| char * | ast_utils_which (const char *binary, char *fullpath, size_t fullpath_size) |
| Resolve a binary to a full pathname. | |
| int | ast_wait_for_input (int fd, int ms) |
| int | ast_xml_escape (const char *string, char *outbuf, size_t buflen) |
| Escape reserved characters for use in XML. | |
Variables | |
| unsigned int | __unsigned_int_flags_dummy |
| uint64_t | __unsigned_int_flags_dummy64 |
| struct ast_eid | ast_eid_default |
| Global EID. | |
Utility functions.
Definition in file utils.h.
| #define ast_align_for | ( | offset, | |||
| type | ) | (((offset + __alignof__(type) - 1) / __alignof__(type)) * __alignof__(type)) |
Increase offset so it is a multiple of the required alignment of type.
| offset | The value that should be increased. | |
| type | The data type that offset should be aligned to. |
Many systems prefer integers to be stored on aligned on memory locations. This macro will increase an offset so a value of the supplied type can be safely be stored on such a memory location.
Examples: ast_align_for(0x17, int64_t) ==> 0x18 ast_align_for(0x18, int64_t) ==> 0x18 ast_align_for(0x19, int64_t) ==> 0x20
Don't mind the ugliness, the compiler will optimize it.
Definition at line 770 of file utils.h.
Referenced by __ast_string_field_ptr_build_va().
| #define ast_alignof | ( | type | ) | __alignof__(type) |
Return the number of bytes used in the alignment of type.
| type |
This is really just __alignof__(), but tucked away in this header so we don't have to look at the nasty underscores in the source.
Definition at line 750 of file utils.h.
Referenced by __ast_string_field_alloc_space(), and __ast_string_field_ptr_build_va().
| #define ast_alloca | ( | size | ) | __builtin_alloca(size) |
call __builtin_alloca to ensure we get gcc builtin semantics
| size | The size of the buffer we want allocated |
This macro will attempt to allocate memory from the stack. If it fails you won't get a NULL returned, but a SEGFAULT if you're lucky.
Definition at line 643 of file utils.h.
Referenced by __ast_verbose_ap(), _while_exec(), ael2_semantic_check(), aji_start_sasl(), alsa_card_init(), append_mailbox(), ast_control_streamfile(), ast_dsp_process(), ast_event_append_ie_str(), ast_event_check_subscriber(), ast_event_new(), ast_fileexists(), ast_lock_path_flock(), ast_lock_path_lockfile(), ast_mkdir(), ast_openstream_full(), ast_openvstream(), ast_pthread_create_detached_stack(), ast_pthread_create_stack(), ast_remotecontrol(), ast_say_counted_adjective(), ast_say_counted_noun(), ast_unlock_path_flock(), ast_unlock_path_lockfile(), ast_waitfor_nandfds(), ast_writefile(), astman_append_json(), builtin_automixmonitor(), builtin_automonitor(), callerid_feed(), callerid_feed_jp(), CB_ADD_LEN(), config_module(), cpeid_exec(), create_addr_from_peer(), cut_internal(), decode_frame(), dictate_exec(), dundi_decrypt(), dundi_encrypt(), dundi_precache_internal(), encrypt_frame(), feature_request_and_dial(), festival_exec(), find_table(), func_mchan_read(), function_fieldnum_helper(), function_fieldqty_helper(), handle_cli_config_reload(), handle_command_response(), handle_exec(), handle_memory_show_summary(), import_helper(), inprocess_count(), listfilter(), local_attended_transfer(), lua_get_variable(), lua_get_variable_value(), lua_read_extensions_file(), masquerade_colp_transfer(), mixmonitor_exec(), my_ast_get_channel_by_name_locked(), pbx_builtin_importvar(), pbx_load_module(), pbx_substitute_variables_helper_full(), queue_file(), realtime_exec(), replace(), shared_read(), shared_write(), shift_pop(), sip_addheader(), sms_generate(), socket_process(), sort_internal(), ssl_write(), state_notify_build_xml(), static_callback(), try_firmware(), unshift_push(), vm_change_password(), vm_delete(), and vm_play_folder_name_gr().
| #define ast_assert | ( | a | ) |
Definition at line 728 of file utils.h.
Referenced by __ast_string_field_alloc_space(), _ast_odbc_request_obj2(), ack_ticks(), agent_call(), append_ie(), ast_cc_is_recall(), ast_channel_change_linkedid(), ast_channel_get_cc_config_params(), ast_db_get(), ast_hangup(), ast_register_thread(), ast_rtcp_read(), ast_rtp_read(), ast_sched_del(), ast_udptl_read(), ast_xml_escape(), cc_generic_agent_start_monitoring(), cc_generic_agent_start_offer_timer(), cc_generic_monitor_cancel_available_timer(), check_callback_sanity(), create_jb(), create_new_sip_etag(), db_sync_thread(), determine_sip_publish_type(), find_timer(), handle_response_publish(), jb_get_and_deliver(), odbc_obj_connect(), parkinglot_destroy(), pthread_timer_ack(), publish_expire(), queue_exec(), ring_entry(), security_event_cb(), sip_cc_agent_init(), and sip_cc_monitor_unsuspend().
| #define ast_clear_flag | ( | p, | |||
| flag | ) |
Definition at line 77 of file utils.h.
Referenced by __analog_ss_thread(), __ast_pbx_run(), __ast_read(), __do_deliver(), __transmit_response(), action_redirect(), aji_create_client(), aji_filter_roster(), aji_load_config(), analog_ss_thread(), ast_audiohook_set_mute(), ast_autoservice_stop(), ast_bridge_call(), ast_cdr_reset(), ast_cdr_specialized_reset(), ast_channel_bridge(), ast_channel_undefer_dtmf(), ast_deactivate_generator(), ast_do_masquerade(), ast_generic_bridge(), ast_jb_destroy(), ast_jb_put(), ast_rtp_raw_write(), ast_sendtext(), ast_speech_start(), ast_tls_read_conf(), ast_translate(), ast_waitfor_nandfds(), ast_waitfordigit_full(), ast_write(), bridge_channel_feature(), bridge_p2p_rtp_write(), builtin_atxfer(), change_hold_state(), change_spy_mode(), channel_spy(), chanspy_exec(), check_goto_on_transfer(), check_pendings(), common_exec(), config_function_read(), config_text_file_load(), dahdi_read(), dahdiscan_exec(), dial_exec_full(), dictate_exec(), disa_exec(), dundi_lookup_local(), extenspy_exec(), forward_message(), handle_command_response(), handle_common_options(), handle_exec(), handle_request_bye(), handle_request_invite(), handle_request_refer(), handle_response(), handle_response_notify(), handle_speechrecognize(), handle_t38_options(), handle_verbose(), init_acf_query(), initialize_udptl(), internal_deactivate_generator(), linear_alloc(), load_config(), load_module(), load_moh_classes(), local_ast_moh_stop(), local_attended_transfer(), local_hangup(), main(), manage_parked_call(), manager_optimize_away(), odbc_load_module(), park_call_full(), parkandannounce_exec(), parse_options(), phone_read(), playtones_alloc(), process_sdp(), register_verify(), reload_config(), reset_transaction(), set_config(), set_config_flags(), setup_dahdi_int(), sip_call(), sip_dtmfmode(), sip_hangup(), sip_reload(), sip_set_rtp_peer(), socket_process(), speech_background(), try_calling(), update_call_counter(), update_connectedline(), and waitstream_core().
| #define ast_clear_flag64 | ( | p, | |||
| flag | ) |
Definition at line 134 of file utils.h.
Referenced by authenticate_verify(), build_peer(), build_user(), create_addr(), do_forward(), find_conf(), find_conf_realtime(), iax2_destroy_helper(), iax2_setoption(), set_config(), set_config_destroy(), socket_process(), and wait_for_answer().
| #define ast_clear_flag_nonstd | ( | p, | |||
| flag | ) |
do { \ ((p)->flags &= ~(flag)); \ } while(0)
Definition at line 180 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 84 of file utils.h.
Referenced by add_features_datastore(), agent_read(), aji_create_client(), aji_filter_roster(), ast_call_forward(), ast_cdr_reset(), ast_cdr_specialized_reset(), ast_frdup(), ast_frisolate(), build_peer(), builtin_atxfer(), cache_lookup_internal(), channel_spy(), check_peer_ok(), create_addr_from_peer(), dundi_lookup_local(), feature_interpret(), framein(), minivm_greet_exec(), minivm_record_exec(), parked_call_exec(), populate_defaults(), realtime_peer(), register_verify(), reload_config(), set_peer_defaults(), sip_alloc(), sip_poke_peer(), transmit_response_using_temp(), and vm_exec().
| #define ast_copy_flags64 | ( | dest, | |||
| src, | |||||
| flagz | ) |
Definition at line 141 of file utils.h.
Referenced by __find_callno(), build_peer(), build_user(), check_access(), create_addr(), dial_exec_full(), find_conf_realtime(), iax2_request(), realtime_peer(), and wait_for_answer().
| #define ast_copy_flags_nonstd | ( | dest, | |||
| src, | |||||
| flagz | ) |
| #define AST_FLAGS_ALL UINT_MAX |
Definition at line 196 of file utils.h.
Referenced by add_features_datastore(), aji_create_client(), ast_cdr_reset(), ast_cdr_specialized_reset(), builtin_atxfer(), cache_lookup_internal(), channel_spy(), chanspy_exec(), check_goto_on_transfer(), dahdiscan_exec(), disa_exec(), dundi_lookup_local(), extenspy_exec(), feature_interpret(), handle_queue_reload(), load_module(), load_moh_classes(), manager_queue_reload(), parked_call_exec(), parse_options(), populate_defaults(), reload(), reload_config(), and set_config_flags().
| #define ast_make_room_for | ( | offset, | |||
| type | ) | (((offset + (2 * __alignof__(type) - 1)) / __alignof__(type)) * __alignof__(type)) |
Increase offset by the required alignment of type and make sure it is a multiple of said alignment.
| offset | The value that should be increased. | |
| type | The data type that room should be reserved for. |
A use case for this is when prepending length fields of type int to a buffer. If you keep the offset a multiple of the alignment of the integer type, a next block of length+buffer will have the length field automatically aligned.
Examples: ast_make_room_for(0x17, int64_t) ==> 0x20 ast_make_room_for(0x18, int64_t) ==> 0x20 ast_make_room_for(0x19, int64_t) ==> 0x28
Don't mind the ugliness, the compiler will optimize it.
Definition at line 793 of file utils.h.
Referenced by __ast_string_field_alloc_space(), and __ast_string_field_ptr_build_va().
| #define ast_pthread_create | ( | a, | |||
| b, | |||||
| c, | |||||
| d | ) |
ast_pthread_create_stack(a, b, c, d, \ 0, __FILE__, __FUNCTION__, __LINE__, #c)
Definition at line 408 of file utils.h.
Referenced by accept_thread(), ast_bridge_impart(), ast_dial_run(), ast_features_init(), ast_taskprocessor_get(), bridge_call_thread_launch(), bridge_channel_join(), build_calendar(), handle_callforward_button(), handle_enbloc_call_message(), handle_offhook_message(), handle_soft_key_event_message(), handle_stimulus_message(), handle_transfer_button(), HandleCallOutgoing(), init_logger(), load_module(), multiplexed_add_or_remove(), restart_monitor(), setup_dahdi_int(), sla_load_config(), and start_poll_thread().
| #define ast_pthread_create_background | ( | a, | |||
| b, | |||||
| c, | |||||
| d | ) |
ast_pthread_create_stack(a, b, c, d, \ AST_BACKGROUND_STACKSIZE, \ __FILE__, __FUNCTION__, __LINE__, #c)
Definition at line 416 of file utils.h.
Referenced by add_notify(), aji_reload(), ast_autoservice_start(), ast_device_state_engine_init(), ast_enable_distributed_devstate(), ast_makesocket(), ast_safe_fork(), ast_sched_thread_create(), ast_tcptls_server_start(), astdb_init(), calendar_event_notify(), conf_run(), config_load(), do_monitor(), do_reload(), find_idle_thread(), init_app_class(), init_timing_thread(), load_module(), local_ast_moh_start(), restart_monitor(), restart_pktc_thread(), smdi_load(), start_network_thread(), and start_stream().
| #define ast_pthread_create_detached | ( | a, | |||
| b, | |||||
| c, | |||||
| d | ) |
ast_pthread_create_detached_stack(a, b, c, d, \ 0, __FILE__, __FUNCTION__, __LINE__, #c)
Definition at line 412 of file utils.h.
Referenced by __analog_handle_event(), action_originate(), analog_handle_init_event(), analog_ss_thread_start(), ast_pbx_outgoing_app(), ast_pbx_outgoing_exten(), ast_pbx_start(), dahdi_handle_event(), do_monitor(), dundi_answer_entity(), dundi_answer_query(), dundi_prop_precache(), handle_hd_hf(), handle_init_event(), launch_service(), main(), mwi_thread(), and spawn_dp_lookup().
| #define ast_pthread_create_detached_background | ( | a, | |||
| b, | |||||
| c, | |||||
| d | ) |
ast_pthread_create_detached_stack(a, b, c, d, \ AST_BACKGROUND_STACKSIZE, \ __FILE__, __FUNCTION__, __LINE__, #c)
Definition at line 421 of file utils.h.
Referenced by ast_cdr_submit_batch(), ast_tcptls_server_root(), cc_generic_agent_recall(), conf_run(), iax_park(), launch_monitor_thread(), listener(), load_module(), meetme_menu_admin_extended(), sip_park(), sip_pickup(), sip_prepare_socket(), sla_handle_dial_state_event(), and sla_station_exec().
| #define ast_set2_flag | ( | p, | |||
| value, | |||||
| flag | ) |
Definition at line 94 of file utils.h.
Referenced by __ast_pbx_run(), _macro_exec(), actual_load_config(), aji_create_client(), aji_load_config(), apply_general_options(), apply_option(), apply_outgoing(), ast_bridge_call(), ast_jb_read_conf(), ast_plc_reload(), ast_readconfig(), ast_tls_read_conf(), ast_translate(), build_peer(), dial_exec_full(), do_reload(), find_account(), find_user(), forkcdr_exec(), handle_common_options(), handle_t38_options(), load_config(), load_module(), load_moh_classes(), local_ast_moh_start(), reload_config(), and sip_setoption().
| #define ast_set2_flag64 | ( | p, | |||
| value, | |||||
| flag | ) |
Definition at line 151 of file utils.h.
Referenced by build_peer(), build_user(), check_access(), dial_exec_full(), and set_config().
| #define ast_set_flag | ( | p, | |||
| flag | ) |
Definition at line 70 of file utils.h.
Referenced by __analog_ss_thread(), __ast_pbx_run(), __ast_read(), __ast_request_and_dial(), __sip_subscribe_mwi_do(), _macro_exec(), action_redirect(), aji_create_client(), aji_load_config(), analog_ss_thread(), app_exec(), apply_peer(), ast_audiohook_set_mute(), ast_autoservice_start(), ast_bridge_call(), ast_bridge_features_set_flag(), ast_bridge_new(), ast_bridge_timelimit(), ast_call(), ast_cdr_detach(), ast_cdr_fork(), ast_cdr_merge(), ast_cdr_reset(), ast_cdr_specialized_reset(), ast_channel_bridge(), ast_channel_defer_dtmf(), ast_do_masquerade(), ast_do_pickup(), ast_generic_bridge(), ast_hangup(), ast_jb_do_usecheck(), ast_jb_put(), ast_rtp_change_source(), ast_rtp_local_bridge(), ast_rtp_raw_write(), ast_rtp_read(), ast_rtp_stop(), ast_rtp_update_source(), ast_speech_change_state(), AST_TEST_DEFINE(), ast_tls_read_conf(), ast_waitfor_nandfds(), ast_waitfordigit_full(), asyncgoto_exec(), bridge_channel_feature(), bridge_exec(), bridge_p2p_rtp_write(), build_peer(), builtin_atxfer(), builtin_blindtransfer(), cb_extensionstate(), cc_generic_agent_init(), change_hold_state(), change_spy_mode(), channel_spy(), chanspy_exec(), check_bridge(), check_peer_ok(), check_user_full(), check_via(), common_exec(), create_addr_from_peer(), create_transaction(), dahdiscan_exec(), destroy_trans(), dial_exec_full(), dictate_exec(), directory_exec(), disa_exec(), do_register(), dundi_encrypt(), dundi_lookup_local(), dundi_send(), extenspy_exec(), find_peer(), find_user_realtime(), free_vm_users(), handle_command_response(), handle_common_options(), handle_exec(), handle_invite_replaces(), handle_queue_reload(), handle_request_invite(), handle_request_refer(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_t38_options(), handle_verbose(), hangupcalls(), hanguptree(), init_acf_query(), init_app_class(), init_files_class(), interpret_t38_parameters(), launch_monitor_thread(), leave_voicemail(), linear_alloc(), load_config(), load_moh_classes(), local_alloc(), local_ast_moh_start(), local_attended_transfer(), local_call(), local_hangup(), login_exec(), main(), manage_parked_call(), manager_queue_reload(), manager_sipnotify(), minivm_greet_exec(), new_outgoing(), nocdr_exec(), odbc_load_module(), park_call_full(), parked_call_exec(), parse_options(), playtones_alloc(), post_cdr(), process_applicationmap_line(), process_cn_rfc3389(), process_crypto(), process_sdp(), qualify_peer(), record_exec(), register_verify(), reload_config(), ring_entry(), set_bridge_features_on_config(), set_config_flags(), set_insecure_flags(), sip_answer(), sip_call(), sip_cc_agent_init(), sip_cc_agent_respond(), sip_cc_monitor_request_cc(), sip_cli_notify(), sip_dtmfmode(), sip_hangup(), sip_indicate(), sip_park_thread(), sip_poke_peer(), sip_reinvite_retry(), sip_send_mwi_to_peer(), sip_sendhtml(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_write(), socket_process(), start_spying(), tonepair_alloc(), transmit_publish(), transmit_register(), transmit_reinvite_with_sdp(), try_calling(), update_call_counter(), update_connectedline(), vm_execmain(), volume_write(), and waitstream_core().
| #define ast_set_flag64 | ( | p, | |||
| flag | ) |
Definition at line 127 of file utils.h.
Referenced by authenticate_reply(), authenticate_request(), build_peer(), build_user(), check_access(), decrypt_frame(), dial_exec_full(), dial_trunk(), do_forward(), handle_cli_iax2_prune_realtime(), iax2_predestroy(), iax2_provision(), iax2_setoption(), iax2_start_transfer(), meetme_menu_admin_extended(), parse_options(), peer_delme_cb(), pvt_destructor(), realtime_peer(), realtime_user(), run_station(), set_config(), sla_station_exec(), sla_trunk_exec(), socket_process(), and user_delme_cb().
| #define ast_set_flag_nonstd | ( | p, | |||
| flag | ) |
do { \ ((p)->flags |= (flag)); \ } while(0)
Definition at line 176 of file utils.h.
Referenced by dundi_lookup_internal(), dundi_query_eid_internal(), and handle_command_response().
| #define ast_set_flags_to64 | ( | p, | |||
| flag, | |||||
| value | ) |
Definition at line 161 of file utils.h.
Referenced by build_peer(), build_user(), and set_config().
| #define AST_STACKSIZE (((sizeof(void *) * 8 * 8) - 16) * 1024) |
Definition at line 389 of file utils.h.
Referenced by ast_pthread_create_stack().
| #define ast_strdupa | ( | s | ) |
duplicate a string in memory from the stack
| s | The string to duplicate |
This macro will duplicate the given string. It returns a pointer to stack allocated memory for the new string.
Definition at line 653 of file utils.h.
Referenced by __ast_channel_alloc_ap(), __ast_play_and_record(), __dahdi_exception(), _ast_device_state(), _build_port_config(), _macro_exec(), _parse(), _sip_show_peers_one(), _while_exec(), acf_jabberreceive_read(), acf_meetme_info(), acf_odbc_write(), action_agents(), action_status(), actual_load_config(), add_agent(), add_peer_mailboxes(), add_realm_authentication(), add_redirect(), add_var(), admin_exec(), advanced_options(), aelsub_exec(), agent_hangup(), agi_exec_full(), agi_handle_command(), aji_join_exec(), aji_leave_exec(), aji_send_exec(), aji_sendgroup_exec(), aji_status_exec(), analog_exception(), answer_exec_enable(), app_exec(), append_mailbox(), append_mailbox_mapping(), append_var_and_value_to_filter(), apply_directmedia_ha(), apply_options(), aqm_exec(), array(), ast_aji_get_client(), ast_app_getdata(), ast_append_ha(), ast_async_goto(), ast_bridge_call(), ast_bridge_timelimit(), ast_build_timing(), ast_callerid_split(), ast_cdr_fork(), ast_cdr_setaccount(), ast_cdr_setpeeraccount(), ast_cel_report_event(), ast_channel_connected_line_macro(), ast_channel_redirecting_macro(), ast_channel_set_linkgroup(), ast_data_iterator_init(), ast_do_pickup(), ast_eivr_senddtmf(), ast_eivr_setvariable(), ast_el_add_history(), ast_event_append_ie_str(), ast_event_sub_append_ie_str(), ast_filehelper(), ast_format_str_reduce(), ast_func_read(), ast_func_read2(), ast_func_write(), ast_get_group(), ast_masq_park_call(), ast_masq_park_call_exten(), ast_mkdir(), ast_monitor_change_fname(), ast_monitor_start(), ast_netsock_bind(), ast_ouraddrfor(), ast_park_call_exten(), ast_parse_allow_disallow(), ast_parse_arg(), ast_playtones_start(), ast_register_file_version(), ast_rtp_read(), ast_sockaddr_parse(), ast_sockaddr_resolve(), ast_str_retrieve_variable(), ast_utils_which(), ast_writefile(), asyncgoto_exec(), auth_exec(), authenticate_reply(), authenticate_verify(), background_detect_exec(), bridge_exec(), bridge_play_sounds(), build_channels(), build_gateway(), build_mapping(), build_peer(), build_profile(), build_route(), build_user(), builtin_atxfer(), builtin_automixmonitor(), builtin_automonitor(), cache_get_callno_locked(), callerid_read(), callerid_write(), celgenuserevent_exec(), chanavail_exec(), change_callid_pvt(), channel_admin_exec(), channel_spy(), chanspy_exec(), check_access(), check_blacklist(), check_day(), check_dow(), check_goto_on_transfer(), check_month(), check_peer_ok(), check_switch_expr(), check_timerange(), check_user_full(), cli_odbc_read(), cli_odbc_write(), complete_meetmecmd_list(), complete_meetmecmd_mute_kick(), conf_exec(), conf_run(), conf_start_moh(), confbridge_exec(), config_function_read(), config_line(), config_module(), connectedline_read(), connectedline_write(), controlplayback_exec(), count_exec(), create_addr(), create_addr_from_peer(), create_dynamic_parkinglot(), create_followme_number(), create_queue_member(), create_vmaccount(), cut_internal(), dahdiras_exec(), dahdiscan_exec(), data_filter_add_nodes(), data_filter_alloc(), data_filter_generate(), data_provider_create(), data_provider_release(), data_result_generate(), data_result_get_node(), data_search_create(), data_search_generate(), data_search_get_node(), decrypt_frame(), del_exec(), deltree_exec(), determine_starting_point(), dial_exec_full(), dial_trunk(), dialgroup_refreshdb(), dialgroup_write(), dictate_exec(), directory_exec(), disa_exec(), dnsmgr_refresh(), do_bridge_masquerade(), do_immediate_setup(), do_notify(), do_say(), dundi_query_read(), dundi_result_read(), dundifunc_read(), enum_query_read(), enum_result_read(), ewscal_write_event(), exec_exec(), execif_exec(), extenspy_exec(), feature_check(), feature_interpret(), festival_exec(), fileexists_core(), find_conf_realtime(), find_generic_monitor_instance_list(), find_gtalk(), find_sdp(), find_table(), find_table_cb(), forkcdr_exec(), function_agent(), function_iaxpeer(), function_realtime_store(), generic_recall(), get_cid_name(), get_destination(), get_refer_info(), gosub_exec(), gosubif_exec(), gtalk_action(), gtalk_alloc(), gtalk_create_candidates(), gtalk_invite(), gtalk_request(), gtalk_update_externip(), handle_call_forward(), handle_cli_check_permissions(), handle_cli_dialplan_add_extension(), handle_cli_file_convert(), handle_common_options(), handle_debug_dialplan(), handle_mgcp_audit_endpoint(), handle_options(), handle_request_invite(), handle_request_notify(), handle_request_refer(), handle_response(), handle_show_dialplan(), handle_t38_options(), handle_verbose(), has_voicemail(), iax2_call(), iax2_devicestate(), iax2_prov_app(), iax2_request(), iconv_read(), init_acf_query(), init_jack_data(), insert_penaltychange(), is_prefix(), is_valid_dtmf(), isAnsweringMachine(), isexten_function_read(), ivr_dispatch(), jingle_request(), launch_ha_netscript(), launch_monitor_thread(), launch_netscript(), leave_voicemail(), load_channelvars(), load_config(), load_dynamic_module(), local_call(), local_devicestate(), log_exec(), logger_print_normal(), login_exec(), lua_get_variable_value(), lua_pbx_exec(), lua_set_variable_value(), macroif_exec(), main(), make_components(), make_email_file(), man_do_variable_value(), manage_parked_call(), match_ie_val(), match_sub_ie_val_to_event(), meetmemute(), metermaidstate(), mgcp_devicestate(), minivm_accmess_exec(), minivm_account_func_read(), minivm_counter_func_read(), minivm_counter_func_write(), minivm_greet_exec(), minivm_mwi_exec(), minivm_notify_exec(), minivm_record_exec(), misdn_call(), misdn_check_l2l1(), misdn_facility_exec(), misdn_request(), misdn_set_opt_exec(), mixmonitor_exec(), mkintf(), moh_handle_digit(), monitor_dial(), multicast_rtp_request(), notify_message(), notify_new_message(), odbc_log(), on_dns_update_mwi(), on_dns_update_peer(), on_dns_update_registry(), orig_app(), orig_exten(), originate_exec(), ospauth_exec(), ospfinished_exec(), osplookup_exec(), ospnext_exec(), oss_call(), oss_request(), page_exec(), park_call_exec(), park_space_reserve(), parkandannounce_exec(), parked_call_exec(), parse_allowed_methods(), parse_apps(), parse_cookies(), parse_empty_options(), parse_events(), parse_register_contact(), parse_session_expires(), parse_sip_options(), parse_uri_full(), party_id_write(), party_name_write(), party_number_write(), pbx_builtin_answer(), pbx_builtin_background(), pbx_builtin_execiftime(), pbx_builtin_gotoif(), pbx_builtin_gotoiftime(), pbx_builtin_importvar(), pbx_builtin_pushvar_helper(), pbx_builtin_resetcdr(), pbx_builtin_setvar(), pbx_builtin_setvar_helper(), pbx_builtin_setvar_multiple(), pbx_builtin_waitexten(), pbx_extension_helper(), pbx_find_extension(), pbx_parseable_goto(), peer_set_srcaddr(), pickup_exec(), pickupchan_exec(), play_message(), play_moh_exec(), playback_exec(), pqm_exec(), prep_email_sub_vars(), privacy_exec(), process_applicationmap_line(), process_dahdi(), process_echocancel(), process_sdp(), process_sdp_a_image(), process_sdp_o(), proxy_from_config(), ql_exec(), queue_exec(), queue_mwi_event(), queue_set_param(), rcvfax_exec(), read_exec(), readexten_exec(), readfile_exec(), realtime_common(), realtime_exec(), realtime_multi_curl(), realtime_multi_ldap(), realtime_multi_odbc(), realtime_multi_pgsql(), receivefax_exec(), record_exec(), redirecting_read(), redirecting_write(), register_verify(), registry_authrequest(), reload_config(), reload_followme(), reload_single_member(), resource_name_match(), retrydial_exec(), rqm_exec(), rtcp_do_debug_ip(), rtp_do_debug_ip(), saycountedadj_exec(), saycountednoun_exec(), sayunixtime_exec(), sdp_crypto_process(), senddtmf_exec(), sendfax_exec(), sendmail(), sendurl_exec(), set_config_flags(), set_hangup_source_and_cause(), setup_privacy_args(), setup_stunaddr(), sip_acf_channel_read(), sip_devicestate(), sip_get_cc_information(), sip_new(), sip_queue_hangup_cause(), sip_send_mwi_to_peer(), sip_show_settings(), sip_sipredirect(), sip_uri_cmp(), sip_uri_headers_cmp(), sip_uri_params_cmp(), skel_exec(), skinny_devicestate(), sla_add_trunk_to_station(), sla_check_device(), sla_queue_event_conf(), sla_ring_station(), sla_state(), sla_station_exec(), sla_trunk_exec(), smdi_msg_read(), smdi_msg_retrieve_read(), sms_exec(), sndfax_exec(), socket_process(), softhangup_exec(), sort_internal(), speech_background(), speech_load(), srv_result_read(), stackpeek_read(), start_moh_exec(), start_monitor_action(), start_monitor_exec(), state_notify_build_xml(), stun_monitor_request(), timezone_add(), transfer_exec(), transmit_invite(), try_calling(), tryexec_exec(), unistim_send_mwi_to_peer(), update_bridge_vars(), update_common_options(), update_registry(), upqm_exec(), userevent_exec(), verbose_exec(), vm_box_exists(), vm_check_password_shell(), vm_exec(), vm_execmain(), vmauthenticate(), vmsayname_exec(), wait_for_answer(), wait_for_winner(), waitstream_core(), xfer_park_call_helper(), xmldoc_get_syntax_fun(), and zapateller_exec().
| #define ast_test_flag | ( | p, | |||
| flag | ) |
Definition at line 63 of file utils.h.
Referenced by __ast_channel_masquerade(), __ast_pbx_run(), __ast_queue_frame(), __ast_read(), __sip_destroy(), __ssl_setup(), __transmit_response(), _ast_odbc_request_obj2(), _macro_exec(), _sip_show_peer(), _sip_show_peers_one(), acf_odbc_read(), action_login(), add_agent(), add_codec_to_sdp(), add_rpid(), add_sdp(), aji_build_publish_skeleton(), aji_cli_purge_pubsub_nodes(), aji_create_client(), aji_handle_pubsub_error(), aji_handle_subscribe(), aji_pruneregister(), aji_publish_device_state(), aji_pubsub_subscribe(), app_exec(), ast_audiohook_write_frame(), ast_autoservice_start(), ast_bridge_call(), ast_bridge_end_dtmf(), ast_bridge_merge(), ast_call(), ast_can_pickup(), ast_cdr_answer(), ast_cdr_appenduserfield(), ast_cdr_busy(), ast_cdr_end(), ast_cdr_failed(), ast_cdr_fork(), ast_cdr_init(), ast_cdr_merge(), ast_cdr_noanswer(), ast_cdr_reset(), ast_cdr_setaccount(), ast_cdr_setamaflags(), ast_cdr_setanswer(), ast_cdr_setapp(), ast_cdr_setcid(), ast_cdr_setdestchan(), ast_cdr_setdisposition(), ast_cdr_setpeeraccount(), ast_cdr_setuserfield(), ast_cdr_setvar(), ast_cdr_specialized_reset(), ast_cdr_start(), ast_cdr_update(), ast_channel_bridge(), ast_channel_defer_dtmf(), ast_config_internal_load(), ast_do_masquerade(), ast_explicit_goto(), ast_frisolate(), ast_generic_bridge(), ast_hangup(), ast_indicate_data(), ast_jb_destroy(), ast_jb_do_usecheck(), ast_jb_empty_and_reset(), ast_jb_get_and_deliver(), ast_jb_get_when_to_wakeup(), ast_jb_put(), AST_LIST_HEAD_NOLOCK(), ast_moh_files_next(), ast_pbx_run_args(), ast_pbx_start(), ast_quiet_chan(), ast_raw_answer(), ast_readstring_full(), ast_rtp_raw_write(), ast_sendtext(), ast_softhangup_nolock(), ast_streamfile(), AST_TEST_DEFINE(), ast_transfer(), ast_translate(), ast_waitfordigit_full(), ast_write(), auth_exec(), authenticate_verify(), bridge_channel_join(), bridge_check_dissolve(), bridge_exec(), bridge_p2p_rtp_write(), build_peer(), build_radius_record(), build_via(), builtin_atxfer(), call_forward_inherit(), callback_dialoptions(), cb_extensionstate(), cdr_read(), cdr_write(), change_hold_state(), channel_data_add_flags(), channel_spy(), chanspy_exec(), check_bridge(), check_peer_ok(), check_pendings(), check_post(), check_rtp_timeout(), check_user_full(), close_mailbox(), common_exec(), complete_sip_peer(), complete_sip_registered_peer(), confbridge_exec(), config_text_file_load(), connectedline_write(), controlplayback_exec(), copy_via_headers(), create_addr_from_peer(), create_jb(), destroy_trans(), dial_exec_full(), dialog_initialize_rtp(), dictate_exec(), directory_exec(), disa_exec(), display_nat_warning(), do_directory(), do_setnat(), dtmf_audiohook_write_list(), dundi_encrypt(), dundi_exec(), dundi_helper(), dundi_lookup_local(), dundi_lookup_thread(), dundi_precache_thread(), dundi_query_read(), dundi_query_thread(), dundi_rexmit(), dundi_send(), dundifunc_read(), eivr_comm(), enable_dsp_detect(), execute_cb(), expire_register(), extenspy_exec(), feature_exec_app(), feature_interpret_helper(), find_cache(), find_or_create(), find_user(), find_user_realtime(), forkcdr_exec(), forward_message(), free_user(), function_sippeer(), get_destination(), get_insecure_variable_from_config(), get_insecure_variable_from_sipregs(), get_rpid(), get_sip_pvt_byid_locked(), gosub_exec(), handle_cli_moh_show_classes(), handle_cli_wait_fullybooted(), handle_command_response(), handle_exec(), handle_frame(), handle_incoming(), handle_minivm_show_settings(), handle_options(), handle_request_bye(), handle_request_cancel(), handle_request_info(), handle_request_invite(), handle_request_refer(), handle_request_subscribe(), handle_response(), handle_response_invite(), handle_response_notify(), handle_show_settings(), handle_showchan(), handle_skinny_show_settings(), handle_speechrecognize(), handle_tcptls_connection(), hint_read(), iax2_write(), initialize_udptl(), initreqprep(), interpret_t38_parameters(), is_state_change_valid(), join_conference_bridge(), leave_conference_bridge(), leave_voicemail(), load_dynamic_module(), load_resource(), local_alloc(), local_ast_moh_start(), local_bridgedchannel(), local_call(), local_devicestate(), local_hangup(), local_indicate(), local_write(), main(), make_email_file(), manager_list_voicemail_users(), masq_park_call(), match_req_to_dialog(), menu_callback(), minivm_accmess_exec(), minivm_account_func_read(), minivm_greet_exec(), minivm_notify_exec(), minivm_record_exec(), mixmonitor_exec(), mixmonitor_thread(), mod_load_cmp(), moh_files_alloc(), moh_scan_files(), multicast_rtp_write(), notify_new_message(), odbc_load_module(), page_exec(), park_call_exec(), park_call_full(), park_space_reserve(), parse_moved_contact(), parse_register_contact(), pbx_builtin_background(), pbx_builtin_waitexten(), peer_ipcmp_cb(), pick_unlocked_cdr(), play_mailbox_owner(), play_message(), play_record_review(), post_cdr(), post_join_marked(), post_join_unmarked(), precache_transactions(), process_cn_rfc3389(), process_crypto(), process_sdp(), process_sdp_a_audio(), process_sdp_o(), process_text_line(), read_exec(), readexten_exec(), realtime_peer(), realtime_switch_common(), receivefax_exec(), record_exec(), redirecting_write(), reload_config(), reload_handler(), reload_queues(), reload_single_queue(), remote_bridge_loop(), remove_from_queue(), reqprep(), respprep(), retrans_pkt(), retrydial_exec(), select_entry(), select_item_pause(), send_request(), sendfax_exec(), sendmail(), sendurl_exec(), serialize_showchan(), set_address_from_contact(), set_config_flags(), set_pvt_allowed_methods(), set_t38_capabilities(), should_skip_dtmf(), show_channels_cb(), sip_alloc(), sip_answer(), sip_call(), sip_cc_agent_destructor(), sip_destroy_peer(), sip_dtmfmode(), sip_fixup(), sip_get_rtp_peer(), sip_get_trtp_peer(), sip_get_udptl_peer(), sip_get_vrtp_peer(), sip_hangup(), sip_indicate(), sip_nat_mode(), sip_new(), sip_prune_realtime(), sip_queryoption(), sip_read(), sip_real_dst(), sip_rtp_read(), sip_send_mwi_to_peer(), sip_senddigit_begin(), sip_senddigit_end(), sip_sendhtml(), sip_set_rtp_peer(), sip_set_udptl_peer(), sip_setoption(), sip_show_channel(), sip_show_settings(), sip_show_users(), sip_write(), sla_trunk_exec(), smdi_msg_find(), sms_exec(), socket_process(), socket_process_meta(), softhangup_exec(), spawn_mp3(), speech_background(), speech_read(), spy_generate(), start_spying(), startmon(), transmit_info_with_digit(), transmit_invite(), transmit_notify_with_mwi(), transmit_refer(), transmit_reinvite_with_sdp(), transmit_request_with_auth(), transmit_response_with_sdp(), transmit_state_notify(), try_calling(), update_call_counter(), update_connectedline(), update_peer(), update_redirecting(), update_registry(), vm_exec(), vm_execmain(), vm_instructions_en(), vm_intro(), vm_newuser(), volume_callback(), wait_for_winner(), waitstream_core(), and xfer_park_call_helper().
| #define ast_test_flag64 | ( | p, | |||
| flag | ) |
Definition at line 120 of file utils.h.
Referenced by __do_deliver(), __expire_registry(), __get_from_jb(), __iax2_show_peers(), action_meetmelist(), admin_exec(), ast_app_options2str64(), ast_cli_netstats(), authenticate_reply(), authenticate_request(), authenticate_verify(), build_peer(), build_user(), can_write(), check_access(), complete_iax2_peers(), conf_exec(), conf_run(), decrypt_frame(), dial_exec_full(), do_forward(), find_conf(), find_conf_realtime(), function_iaxpeer(), handle_cli_iax2_prune_realtime(), handle_cli_iax2_show_channels(), handle_cli_iax2_show_peer(), handle_cli_iax2_show_users(), iax2_bridge(), iax2_call(), iax2_destroy_helper(), iax2_getpeertrunk(), iax2_hangup(), iax2_indicate(), iax2_predestroy(), iax2_queryoption(), iax2_request(), iax2_send(), iax2_trunk_queue(), iax2_write(), log_jitterstats(), manager_iax2_show_peer_list(), meetme_menu_admin(), meetme_menu_admin_extended(), meetme_menu_normal(), meetme_show_cmd(), peers_data_provider_get(), prune_peers(), prune_users(), realtime_peer(), realtime_update_peer(), realtime_user(), reg_source_db(), register_verify(), retrydial_exec(), schedule_delivery(), send_trunk(), set_config(), setup_privacy_args(), socket_process(), update_registry(), user_set_kickme_cb(), user_set_muted_cb(), user_set_unmuted_cb(), users_data_provider_get(), valid_priv_reply(), and wait_for_answer().
| #define ast_test_flag_nonstd | ( | p, | |||
| flag | ) | ((p)->flags & (flag)) |
Definition at line 173 of file utils.h.
Referenced by cache_save_hint(), dundi_lookup_thread(), dundi_precache_thread(), and handle_command_response().
| #define localtime_r __dont_use_localtime_r_use_ast_localtime_instead__ |
| #define MAX | ( | a, | |||
| b | ) | ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a < __b) ? __b : __a);}) |
Definition at line 228 of file utils.h.
Referenced by __ast_answer(), ast_dsp_busydetect(), handle_request_invite_st(), handle_request_subscribe(), and handle_response_register().
| #define MIN | ( | a, | |||
| b | ) | ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a > __b) ? __b : __a);}) |
Definition at line 226 of file utils.h.
Referenced by autoanswer_complete(), calculate_local_max_datagram(), h263p_encap(), h264_encap(), interpret_t38_parameters(), mpeg4_encap(), process_db_keys(), sip_tls_read(), and start_session_timer().
| #define RAII_VAR | ( | vartype, | |||
| varname, | |||||
| initval, | |||||
| dtor | ) |
/* Prototype needed due to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36774 */ \ auto void _dtor_ ## varname (vartype * v); \ void _dtor_ ## varname (vartype * v) { dtor(*v); } \ vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
Declare a variable that will call a destructor function when it goes out of scope.
Resource Allocation Is Initialization (RAII) variable declaration.
| vartype | The type of the variable | |
| varname | The name of the variable | |
| initval | The initial value of the variable | |
| dtor | The destructor function of type' void func(vartype *)' |
void mything_cleanup(struct mything *t) { if (t) { ast_free(t->stuff); } } void do_stuff(const char *name) { RAII_VAR(struct mything *, thing, mything_alloc(name), mything_cleanup); ... }
void do_stuff(const char *name) { RAII_VAR(struct mything *, thing, find_mything(name), ao2_cleanup); if (!thing) { return; } if (error) { return; } do_stuff_with_thing(thing); }
Definition at line 896 of file utils.h.
Referenced by dial_trunk(), run_station(), sla_add_trunk_to_station(), sla_build_station(), sla_build_trunk(), sla_check_station_delay(), sla_handle_dial_state_event(), sla_state(), sla_station_exec(), and sla_trunk_exec().
| int ast_base64decode | ( | unsigned char * | dst, | |
| const char * | src, | |||
| int | max | |||
| ) |
Decode data from base64.
| dst | the destination buffer | |
| src | the source buffer | |
| max | The maximum number of bytes to write into the destination buffer. Note that this function will not ensure that the destination buffer is NULL terminated. So, in general, this parameter should be sizeof(dst) - 1. |
Definition at line 272 of file utils.c.
Referenced by aes_helper(), ast_check_signature(), base64_helper(), osp_validate_token(), sdp_crypto_process(), and sdp_crypto_setup().
00273 { 00274 int cnt = 0; 00275 unsigned int byte = 0; 00276 unsigned int bits = 0; 00277 int incnt = 0; 00278 while(*src && *src != '=' && (cnt < max)) { 00279 /* Shift in 6 bits of input */ 00280 byte <<= 6; 00281 byte |= (b2a[(int)(*src)]) & 0x3f; 00282 bits += 6; 00283 src++; 00284 incnt++; 00285 /* If we have at least 8 bits left over, take that character 00286 off the top */ 00287 if (bits >= 8) { 00288 bits -= 8; 00289 *dst = (byte >> bits) & 0xff; 00290 dst++; 00291 cnt++; 00292 } 00293 } 00294 /* Don't worry about left over bits, they're extra anyway */ 00295 return cnt; 00296 }
| int ast_base64encode | ( | char * | dst, | |
| const unsigned char * | src, | |||
| int | srclen, | |||
| int | max | |||
| ) |
Encode data in base64.
| dst | the destination buffer | |
| src | the source data to be encoded | |
| srclen | the number of bytes present in the source buffer | |
| max | the maximum number of bytes to write into the destination buffer, *including* the terminating NULL character. |
Definition at line 350 of file utils.c.
References ast_base64encode_full().
Referenced by aes_helper(), aji_start_sasl(), ast_sign(), base64_helper(), build_secret(), osp_check_destination(), and sdp_crypto_setup().
00351 { 00352 return ast_base64encode_full(dst, src, srclen, max, 0); 00353 }
| int ast_base64encode_full | ( | char * | dst, | |
| const unsigned char * | src, | |||
| int | srclen, | |||
| int | max, | |||
| int | linebreaks | |||
| ) |
encode text to BASE64 coding
Definition at line 299 of file utils.c.
Referenced by ast_base64encode().
00300 { 00301 int cnt = 0; 00302 int col = 0; 00303 unsigned int byte = 0; 00304 int bits = 0; 00305 int cntin = 0; 00306 /* Reserve space for null byte at end of string */ 00307 max--; 00308 while ((cntin < srclen) && (cnt < max)) { 00309 byte <<= 8; 00310 byte |= *(src++); 00311 bits += 8; 00312 cntin++; 00313 if ((bits == 24) && (cnt + 4 <= max)) { 00314 *dst++ = base64[(byte >> 18) & 0x3f]; 00315 *dst++ = base64[(byte >> 12) & 0x3f]; 00316 *dst++ = base64[(byte >> 6) & 0x3f]; 00317 *dst++ = base64[byte & 0x3f]; 00318 cnt += 4; 00319 col += 4; 00320 bits = 0; 00321 byte = 0; 00322 } 00323 if (linebreaks && (cnt < max) && (col == 64)) { 00324 *dst++ = '\n'; 00325 cnt++; 00326 col = 0; 00327 } 00328 } 00329 if (bits && (cnt + 4 <= max)) { 00330 /* Add one last character for the remaining bits, 00331 padding the rest with 0 */ 00332 byte <<= 24 - bits; 00333 *dst++ = base64[(byte >> 18) & 0x3f]; 00334 *dst++ = base64[(byte >> 12) & 0x3f]; 00335 if (bits == 16) 00336 *dst++ = base64[(byte >> 6) & 0x3f]; 00337 else 00338 *dst++ = '='; 00339 *dst++ = '='; 00340 cnt += 4; 00341 } 00342 if (linebreaks && (cnt < max)) { 00343 *dst++ = '\n'; 00344 cnt++; 00345 } 00346 *dst = '\0'; 00347 return cnt; 00348 }
| int ast_careful_fwrite | ( | FILE * | f, | |
| int | fd, | |||
| const char * | s, | |||
| size_t | len, | |||
| int | timeoutms | |||
| ) |
Write data to a file stream with a timeout.
| f | the file stream to write to | |
| fd | the file description to poll on to know when the file stream can be written to without blocking. | |
| s | the buffer to write from | |
| len | the number of bytes to write | |
| timeoutms | The maximum amount of time to block in this function trying to write, specified in milliseconds. |
| 0 | success | |
| -1 | error |
Definition at line 1329 of file utils.c.
References ast_log(), ast_tvdiff_ms(), ast_tvnow(), ast_wait_for_output(), errno, and LOG_ERROR.
Referenced by send_string().
01330 { 01331 struct timeval start = ast_tvnow(); 01332 int n = 0; 01333 int elapsed = 0; 01334 01335 while (len) { 01336 if (ast_wait_for_output(fd, timeoutms - elapsed)) { 01337 /* poll returned a fatal error, so bail out immediately. */ 01338 return -1; 01339 } 01340 01341 /* Clear any errors from a previous write */ 01342 clearerr(f); 01343 01344 n = fwrite(src, 1, len, f); 01345 01346 if (ferror(f) && errno != EINTR && errno != EAGAIN) { 01347 /* fatal error from fwrite() */ 01348 if (!feof(f)) { 01349 /* Don't spam the logs if it was just that the connection is closed. */ 01350 ast_log(LOG_ERROR, "fwrite() returned error: %s\n", strerror(errno)); 01351 } 01352 n = -1; 01353 break; 01354 } 01355 01356 /* Update for data already written to the socket */ 01357 len -= n; 01358 src += n; 01359 01360 elapsed = ast_tvdiff_ms(ast_tvnow(), start); 01361 if (elapsed >= timeoutms) { 01362 /* We've taken too long to write 01363 * This is only an error condition if we haven't finished writing. */ 01364 n = len ? -1 : 0; 01365 break; 01366 } 01367 } 01368 01369 while (fflush(f)) { 01370 if (errno == EAGAIN || errno == EINTR) { 01371 continue; 01372 } 01373 if (!feof(f)) { 01374 /* Don't spam the logs if it was just that the connection is closed. */ 01375 ast_log(LOG_ERROR, "fflush() returned error: %s\n", strerror(errno)); 01376 } 01377 n = -1; 01378 break; 01379 } 01380 01381 return n < 0 ? -1 : 0; 01382 }
| int ast_carefulwrite | ( | int | fd, | |
| char * | s, | |||
| int | len, | |||
| int | timeoutms | |||
| ) |
Try to write string, but wait no more than ms milliseconds before timing out.
Try to write string, but wait no more than ms milliseconds before timing out.
Definition at line 1288 of file utils.c.
References ast_log(), ast_tvdiff_ms(), ast_tvnow(), ast_wait_for_output(), errno, and LOG_ERROR.
Referenced by ast_agi_send(), and ast_cli().
01289 { 01290 struct timeval start = ast_tvnow(); 01291 int res = 0; 01292 int elapsed = 0; 01293 01294 while (len) { 01295 if (ast_wait_for_output(fd, timeoutms - elapsed)) { 01296 return -1; 01297 } 01298 01299 res = write(fd, s, len); 01300 01301 if (res < 0 && errno != EAGAIN && errno != EINTR) { 01302 /* fatal error from write() */ 01303 ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno)); 01304 return -1; 01305 } 01306 01307 if (res < 0) { 01308 /* It was an acceptable error */ 01309 res = 0; 01310 } 01311 01312 /* Update how much data we have left to write */ 01313 len -= res; 01314 s += res; 01315 res = 0; 01316 01317 elapsed = ast_tvdiff_ms(ast_tvnow(), start); 01318 if (elapsed >= timeoutms) { 01319 /* We've taken too long to write 01320 * This is only an error condition if we haven't finished writing. */ 01321 res = len ? -1 : 0; 01322 break; 01323 } 01324 } 01325 01326 return res; 01327 }
| void ast_do_crash | ( | void | ) |
Force a crash if DO_CRASH is defined.
Definition at line 2297 of file utils.c.
Referenced by my_do_crash().
Compare two EIDs.
Definition at line 320 of file netsock.c.
Referenced by aji_devstate_cb(), aji_handle_pubsub_event(), aji_mwi_cb(), ast_event_cb(), build_peer(), build_transactions(), destroy_trans(), dundi_answer_entity(), dundi_answer_query(), dundi_ie_append_eid_appropriately(), dundi_lookup_internal(), dundi_prop_precache(), dundi_query_thread(), evt_event_deliver_cb(), find_peer(), handle_command_response(), optimize_transactions(), and register_request().
| char* ast_eid_to_str | ( | char * | s, | |
| int | maxlen, | |||
| struct ast_eid * | eid | |||
| ) |
/brief Convert an EID to a string
Definition at line 222 of file netsock.c.
References ast_eid::eid.
Referenced by aji_publish_device_state(), aji_publish_mwi(), append_transaction(), ast_set_default_eid(), ast_str_retrieve_variable(), build_peer(), build_transactions(), cache_lookup(), cache_lookup_internal(), check_key(), complete_peer_helper(), destroy_trans(), do_autokill(), do_register(), do_register_expire(), dump_answer(), dump_eid(), dump_raw_ie(), dundi_answer_entity(), dundi_lookup_internal(), dundi_lookup_local(), dundi_lookup_thread(), dundi_precache_thread(), dundi_prop_precache(), dundi_query_thread(), dundi_send(), dundi_show_entityid(), dundi_show_peer(), dundi_show_peers(), dundi_show_requests(), handle_command_response(), handle_show_settings(), populate_addr(), register_request(), and update_key().
| void ast_enable_packet_fragmentation | ( | int | sock | ) |
Disable PMTU discovery on a socket.
| sock | The socket to manipulate |
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 2074 of file utils.c.
References ast_log(), and LOG_WARNING.
Referenced by ast_netsock_bindaddr(), and reload_config().
02075 { 02076 #if defined(HAVE_IP_MTU_DISCOVER) 02077 int val = IP_PMTUDISC_DONT; 02078 02079 if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val))) 02080 ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n"); 02081 #endif /* HAVE_IP_MTU_DISCOVER */ 02082 }
| char* ast_escape_quoted | ( | const char * | string, | |
| char * | outbuf, | |||
| int | buflen | |||
| ) |
Escape characters found in a quoted string.
| string | string to be escaped | |
| outbuf | resulting escaped string | |
| buflen | size of output buffer |
Definition at line 424 of file utils.c.
Referenced by initreqprep().
00425 { 00426 const char *ptr = string; 00427 char *out = outbuf; 00428 char *allow = "\t\v !"; /* allow LWS (minus \r and \n) and "!" */ 00429 00430 while (*ptr && out - outbuf < buflen - 1) { 00431 if (!(strchr(allow, *ptr)) 00432 && !(*ptr >= '#' && *ptr <= '[') /* %x23 - %x5b */ 00433 && !(*ptr >= ']' && *ptr <= '~') /* %x5d - %x7e */ 00434 && !((unsigned char) *ptr > 0x7f)) { /* UTF8-nonascii */ 00435 00436 if (out - outbuf >= buflen - 2) { 00437 break; 00438 } 00439 out += sprintf(out, "\\%c", (unsigned char) *ptr); 00440 } else { 00441 *out = *ptr; 00442 out++; 00443 } 00444 ptr++; 00445 } 00446 00447 if (buflen) { 00448 *out = '\0'; 00449 } 00450 00451 return outbuf; 00452 }
| struct hostent* ast_gethostbyname | ( | const char * | host, | |
| struct ast_hostent * | hp | |||
| ) | [read] |
Thread-safe gethostbyname function to use in Asterisk.
Definition at line 188 of file utils.c.
References ast_hostent::buf, and ast_hostent::hp.
Referenced by __ast_http_load(), app_exec(), ast_parse_arg(), build_peer(), config_load(), config_parse_variables(), create_addr(), festival_exec(), gtalk_load_config(), gtalk_update_stun(), iax_template_parse(), jingle_load_config(), jingle_update_stun(), launch_netscript(), process_sdp(), realtime_peer(), realtime_user(), reload_config(), and set_config().
00189 { 00190 int res; 00191 int herrno; 00192 int dots = 0; 00193 const char *s; 00194 struct hostent *result = NULL; 00195 /* Although it is perfectly legitimate to lookup a pure integer, for 00196 the sake of the sanity of people who like to name their peers as 00197 integers, we break with tradition and refuse to look up a 00198 pure integer */ 00199 s = host; 00200 res = 0; 00201 while (s && *s) { 00202 if (*s == '.') 00203 dots++; 00204 else if (!isdigit(*s)) 00205 break; 00206 s++; 00207 } 00208 if (!s || !*s) { 00209 /* Forge a reply for IP's to avoid octal IP's being interpreted as octal */ 00210 if (dots != 3) 00211 return NULL; 00212 memset(hp, 0, sizeof(struct ast_hostent)); 00213 hp->hp.h_addrtype = AF_INET; 00214 hp->hp.h_addr_list = (void *) hp->buf; 00215 hp->hp.h_addr = hp->buf + sizeof(void *); 00216 /* For AF_INET, this will always be 4 */ 00217 hp->hp.h_length = 4; 00218 if (inet_pton(AF_INET, host, hp->hp.h_addr) > 0) 00219 return &hp->hp; 00220 return NULL; 00221 00222 } 00223 #ifdef HAVE_GETHOSTBYNAME_R_5 00224 result = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &herrno); 00225 00226 if (!result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0]) 00227 return NULL; 00228 #else 00229 res = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &result, &herrno); 00230 00231 if (res || !result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0]) 00232 return NULL; 00233 #endif 00234 return &hp->hp; 00235 }
| void ast_md5_hash | ( | char * | output, | |
| const char * | input | |||
| ) |
Produces MD5 hash based on input string.
Definition at line 238 of file utils.c.
References MD5Final(), MD5Init(), and MD5Update().
Referenced by __init_manager(), auth_exec(), auth_http_callback(), build_reply_digest(), check_auth(), and md5().
00239 { 00240 struct MD5Context md5; 00241 unsigned char digest[16]; 00242 char *ptr; 00243 int x; 00244 00245 MD5Init(&md5); 00246 MD5Update(&md5, (const unsigned char *) input, strlen(input)); 00247 MD5Final(digest, &md5); 00248 ptr = output; 00249 for (x = 0; x < 16; x++) 00250 ptr += sprintf(ptr, "%2.2x", digest[x]); 00251 }
| int ast_mkdir | ( | const char * | path, | |
| int | mode | |||
| ) |
Recursively create directory path.
| path | The directory path to create | |
| mode | The permissions with which to try to create the directory |
Creates a directory path, creating parent directories as needed.
Definition at line 2084 of file utils.c.
References ast_alloca, ast_strdupa, errno, and len().
Referenced by ast_monitor_change_fname(), ast_monitor_start(), conf_run(), create_dirpath(), dictate_exec(), filename_parse(), init_logger(), load_module(), mixmonitor_exec(), record_exec(), reload_logger(), remove_from_queue(), setup_privacy_args(), sms_nextoutgoing(), sms_writefile(), testclient_exec(), testserver_exec(), and write_history().
02085 { 02086 char *ptr; 02087 int len = strlen(path), count = 0, x, piececount = 0; 02088 char *tmp = ast_strdupa(path); 02089 char **pieces; 02090 char *fullpath = ast_alloca(len + 1); 02091 int res = 0; 02092 02093 for (ptr = tmp; *ptr; ptr++) { 02094 if (*ptr == '/') 02095 count++; 02096 } 02097 02098 /* Count the components to the directory path */ 02099 pieces = ast_alloca(count * sizeof(*pieces)); 02100 for (ptr = tmp; *ptr; ptr++) { 02101 if (*ptr == '/') { 02102 *ptr = '\0'; 02103 pieces[piececount++] = ptr + 1; 02104 } 02105 } 02106 02107 *fullpath = '\0'; 02108 for (x = 0; x < piececount; x++) { 02109 /* This looks funky, but the buffer is always ideally-sized, so it's fine. */ 02110 strcat(fullpath, "/"); 02111 strcat(fullpath, pieces[x]); 02112 res = mkdir(fullpath, mode); 02113 if (res && errno != EEXIST) 02114 return errno; 02115 } 02116 return 0; 02117 }
| int ast_parse_digest | ( | const char * | digest, | |
| struct ast_http_digest * | d, | |||
| int | request, | |||
| int | pedantic | |||
| ) |
Parse digest authorization header.
Definition at line 2149 of file utils.c.
References ast_free, ast_log(), ast_skip_blanks(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_string_field_ptr_set, ast_string_field_set, ast_strlen_zero(), ast_unescape_c(), ast_http_digest::cnonce, ast_http_digest::domain, LOG_WARNING, ast_http_digest::nc, ast_http_digest::nonce, ast_http_digest::opaque, ast_http_digest::qop, ast_http_digest::realm, ast_http_digest::response, ast_http_digest::uri, and ast_http_digest::username.
Referenced by auth_http_callback().
02149 { 02150 char *c; 02151 struct ast_str *str = ast_str_create(16); 02152 02153 /* table of recognised keywords, and places where they should be copied */ 02154 const struct x { 02155 const char *key; 02156 const ast_string_field *field; 02157 } *i, keys[] = { 02158 { "username=", &d->username }, 02159 { "realm=", &d->realm }, 02160 { "nonce=", &d->nonce }, 02161 { "uri=", &d->uri }, 02162 { "domain=", &d->domain }, 02163 { "response=", &d->response }, 02164 { "cnonce=", &d->cnonce }, 02165 { "opaque=", &d->opaque }, 02166 /* Special cases that cannot be directly copied */ 02167 { "algorithm=", NULL }, 02168 { "qop=", NULL }, 02169 { "nc=", NULL }, 02170 { NULL, 0 }, 02171 }; 02172 02173 if (ast_strlen_zero(digest) || !d || !str) { 02174 ast_free(str); 02175 return -1; 02176 } 02177 02178 ast_str_set(&str, 0, "%s", digest); 02179 02180 c = ast_skip_blanks(ast_str_buffer(str)); 02181 02182 if (strncasecmp(c, "Digest ", strlen("Digest "))) { 02183 ast_log(LOG_WARNING, "Missing Digest.\n"); 02184 ast_free(str); 02185 return -1; 02186 } 02187 c += strlen("Digest "); 02188 02189 /* lookup for keys/value pair */ 02190 while (c && *c && *(c = ast_skip_blanks(c))) { 02191 /* find key */ 02192 for (i = keys; i->key != NULL; i++) { 02193 char *src, *separator; 02194 int unescape = 0; 02195 if (strncasecmp(c, i->key, strlen(i->key)) != 0) { 02196 continue; 02197 } 02198 02199 /* Found. Skip keyword, take text in quotes or up to the separator. */ 02200 c += strlen(i->key); 02201 if (*c == '"') { 02202 src = ++c; 02203 separator = "\""; 02204 unescape = 1; 02205 } else { 02206 src = c; 02207 separator = ","; 02208 } 02209 strsep(&c, separator); /* clear separator and move ptr */ 02210 if (unescape) { 02211 ast_unescape_c(src); 02212 } 02213 if (i->field) { 02214 ast_string_field_ptr_set(d, i->field, src); 02215 } else { 02216 /* Special cases that require additional procesing */ 02217 if (!strcasecmp(i->key, "algorithm=")) { 02218 if (strcasecmp(src, "MD5")) { 02219 ast_log(LOG_WARNING, "Digest algorithm: \"%s\" not supported.\n", src); 02220 ast_free(str); 02221 return -1; 02222 } 02223 } else if (!strcasecmp(i->key, "qop=") && !strcasecmp(src, "auth")) { 02224 d->qop = 1; 02225 } else if (!strcasecmp(i->key, "nc=")) { 02226 unsigned long u; 02227 if (sscanf(src, "%30lx", &u) != 1) { 02228 ast_log(LOG_WARNING, "Incorrect Digest nc value: \"%s\".\n", src); 02229 ast_free(str); 02230 return -1; 02231 } 02232 ast_string_field_set(d, nc, src); 02233 } 02234 } 02235 break; 02236 } 02237 if (i->key == NULL) { /* not found, try ',' */ 02238 strsep(&c, ","); 02239 } 02240 } 02241 ast_free(str); 02242 02243 /* Digest checkout */ 02244 if (ast_strlen_zero(d->realm) || ast_strlen_zero(d->nonce)) { 02245 /* "realm" and "nonce" MUST be always exist */ 02246 return -1; 02247 } 02248 02249 if (!request) { 02250 /* Additional check for Digest response */ 02251 if (ast_strlen_zero(d->username) || ast_strlen_zero(d->uri) || ast_strlen_zero(d->response)) { 02252 return -1; 02253 } 02254 02255 if (pedantic && d->qop && (ast_strlen_zero(d->cnonce) || ast_strlen_zero(d->nc))) { 02256 return -1; 02257 } 02258 } 02259 02260 return 0; 02261 }
| 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 1617 of file utils.c.
01618 { 01619 char *dataPut = start; 01620 int inEscape = 0; 01621 int inQuotes = 0; 01622 01623 for (; *start; start++) { 01624 if (inEscape) { 01625 *dataPut++ = *start; /* Always goes verbatim */ 01626 inEscape = 0; 01627 } else { 01628 if (*start == '\\') { 01629 inEscape = 1; /* Do not copy \ into the data */ 01630 } else if (*start == '\'') { 01631 inQuotes = 1 - inQuotes; /* Do not copy ' into the data */ 01632 } else { 01633 /* Replace , with |, unless in quotes */ 01634 *dataPut++ = inQuotes ? *start : ((*start == find) ? replace_with : *start); 01635 } 01636 } 01637 } 01638 if (start != dataPut) 01639 *dataPut = 0; 01640 return dataPut; 01641 }
| int ast_pthread_create_detached_stack | ( | pthread_t * | thread, | |
| pthread_attr_t * | attr, | |||
| void *(*)(void *) | start_routine, | |||
| void * | data, | |||
| size_t | stacksize, | |||
| const char * | file, | |||
| const char * | caller, | |||
| int | line, | |||
| const char * | start_fn | |||
| ) |
Definition at line 1201 of file utils.c.
References ast_alloca, ast_log(), ast_pthread_create_stack(), errno, LOG_WARNING, and thr_arg::start_routine.
01204 { 01205 unsigned char attr_destroy = 0; 01206 int res; 01207 01208 if (!attr) { 01209 attr = ast_alloca(sizeof(*attr)); 01210 pthread_attr_init(attr); 01211 attr_destroy = 1; 01212 } 01213 01214 if ((errno = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED))) 01215 ast_log(LOG_WARNING, "pthread_attr_setdetachstate: %s\n", strerror(errno)); 01216 01217 res = ast_pthread_create_stack(thread, attr, start_routine, data, 01218 stacksize, file, caller, line, start_fn); 01219 01220 if (attr_destroy) 01221 pthread_attr_destroy(attr); 01222 01223 return res; 01224 }
| int ast_pthread_create_stack | ( | pthread_t * | thread, | |
| pthread_attr_t * | attr, | |||
| void *(*)(void *) | start_routine, | |||
| void * | data, | |||
| size_t | stacksize, | |||
| const char * | file, | |||
| const char * | caller, | |||
| int | line, | |||
| const char * | start_fn | |||
| ) |
Definition at line 1153 of file utils.c.
References ast_alloca, ast_asprintf, ast_log(), ast_malloc, AST_STACKSIZE, thr_arg::data, dummy_start(), errno, LOG_WARNING, thr_arg::name, pthread_create, and thr_arg::start_routine.
Referenced by ast_pthread_create_detached_stack().
01156 { 01157 #if !defined(LOW_MEMORY) 01158 struct thr_arg *a; 01159 #endif 01160 01161 if (!attr) { 01162 attr = ast_alloca(sizeof(*attr)); 01163 pthread_attr_init(attr); 01164 } 01165 01166 #ifdef __linux__ 01167 /* On Linux, pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED, 01168 which is kind of useless. Change this here to 01169 PTHREAD_INHERIT_SCHED; that way the -p option to set realtime 01170 priority will propagate down to new threads by default. 01171 This does mean that callers cannot set a different priority using 01172 PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set 01173 the priority afterwards with pthread_setschedparam(). */ 01174 if ((errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED))) 01175 ast_log(LOG_WARNING, "pthread_attr_setinheritsched: %s\n", strerror(errno)); 01176 #endif 01177 01178 if (!stacksize) 01179 stacksize = AST_STACKSIZE; 01180 01181 if ((errno = pthread_attr_setstacksize(attr, stacksize ? stacksize : AST_STACKSIZE))) 01182 ast_log(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(errno)); 01183 01184 #if !defined(LOW_MEMORY) 01185 if ((a = ast_malloc(sizeof(*a)))) { 01186 a->start_routine = start_routine; 01187 a->data = data; 01188 start_routine = dummy_start; 01189 if (ast_asprintf(&a->name, "%-20s started at [%5d] %s %s()", 01190 start_fn, line, file, caller) < 0) { 01191 a->name = NULL; 01192 } 01193 data = a; 01194 } 01195 #endif /* !LOW_MEMORY */ 01196 01197 return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */ 01198 }
| long int ast_random | ( | void | ) |
Definition at line 1593 of file utils.c.
References ast_mutex_lock, ast_mutex_unlock, and randomlock.
Referenced by acf_rand_exec(), action_challenge(), add_sdp(), agent_new(), agi_handle_command(), ast_lock_path_lockfile(), ast_moh_files_next(), ast_rtp_change_source(), ast_rtp_new(), ast_udptl_new_with_bindaddr(), auth_http_callback(), authenticate_request(), build_gateway(), build_iv(), build_localtag_registry(), build_rand_pad(), build_reply_digest(), calc_metric(), calc_rxstamp(), caldav_write_event(), callno_hash(), create_channel_name(), generate_exchange_uuid(), generate_random_string(), generic_http_callback(), get_trans_id(), gtalk_alloc(), gtalk_create_candidates(), gtalk_new(), handle_incoming(), handle_response_invite(), iax2_key_rotate(), iax2_start_transfer(), jingle_alloc(), jingle_create_candidates(), jingle_new(), load_module(), make_email_file(), make_our_tag(), moh_files_alloc(), multicast_rtp_new(), ogg_vorbis_rewrite(), osp_create_uuid(), page_exec(), park_space_reserve(), process_weights(), reg_source_db(), registry_authrequest(), reqprep(), say_periodic_announcement(), sendmail(), set_nonce_randdata(), sip_alloc(), socket_read(), start_rtp(), stun_req_id(), transmit_invite(), transmit_register(), transmit_response_using_temp(), try_calling(), and try_firmware().
01594 { 01595 long int res; 01596 #ifdef HAVE_DEV_URANDOM 01597 if (dev_urandom_fd >= 0) { 01598 int read_res = read(dev_urandom_fd, &res, sizeof(res)); 01599 if (read_res > 0) { 01600 long int rm = RAND_MAX; 01601 res = res < 0 ? ~res : res; 01602 rm++; 01603 return res % rm; 01604 } 01605 } 01606 #endif 01607 #ifdef linux 01608 res = random(); 01609 #else 01610 ast_mutex_lock(&randomlock); 01611 res = random(); 01612 ast_mutex_unlock(&randomlock); 01613 #endif 01614 return res; 01615 }
| void ast_register_thread | ( | char * | name | ) |
Definition at line 400 of file asterisk.c.
References ast_assert, ast_calloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, and multi_thread_safe.
Referenced by dummy_start().
00401 { 00402 struct thread_list_t *new = ast_calloc(1, sizeof(*new)); 00403 00404 if (!new) 00405 return; 00406 00407 ast_assert(multi_thread_safe); 00408 new->id = pthread_self(); 00409 new->name = name; /* steal the allocated memory for the thread name */ 00410 AST_RWLIST_WRLOCK(&thread_list); 00411 AST_RWLIST_INSERT_HEAD(&thread_list, new, list); 00412 AST_RWLIST_UNLOCK(&thread_list); 00413 }
| void ast_set_default_eid | ( | struct ast_eid * | eid | ) |
Fill in an ast_eid with the default eid of this machine.
Definition at line 239 of file netsock.c.
References ARRAY_LEN, ast_debug, ast_eid_to_str(), and ast_eid::eid.
Referenced by ast_readconfig().
00240 { 00241 #if defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_IFRU_IFRU_HWADDR) 00242 int s, x = 0; 00243 char eid_str[20]; 00244 struct ifreq ifr; 00245 static const unsigned int MAXIF = 10; 00246 00247 s = socket(AF_INET, SOCK_STREAM, 0); 00248 if (s < 0) 00249 return; 00250 for (x = 0; x < MAXIF; x++) { 00251 static const char *prefixes[] = { "eth", "em" }; 00252 unsigned int i; 00253 00254 for (i = 0; i < ARRAY_LEN(prefixes); i++) { 00255 memset(&ifr, 0, sizeof(ifr)); 00256 snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s%d", prefixes[i], x); 00257 if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { 00258 break; 00259 } 00260 } 00261 00262 if (i == ARRAY_LEN(prefixes)) { 00263 /* Try pciX#[1..N] */ 00264 for (i = 0; i < MAXIF; i++) { 00265 memset(&ifr, 0, sizeof(ifr)); 00266 snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "pci%u#%u", x, i); 00267 if (!ioctl(s, SIOCGIFHWADDR, &ifr)) { 00268 break; 00269 } 00270 } 00271 if (i == MAXIF) { 00272 continue; 00273 } 00274 } 00275 00276 memcpy(eid, ((unsigned char *)&ifr.ifr_hwaddr) + 2, sizeof(*eid)); 00277 ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr.ifr_name); 00278 close(s); 00279 return; 00280 } 00281 close(s); 00282 #else 00283 #if defined(ifa_broadaddr) && !defined(SOLARIS) 00284 char eid_str[20]; 00285 struct ifaddrs *ifap; 00286 00287 if (getifaddrs(&ifap) == 0) { 00288 struct ifaddrs *p; 00289 for (p = ifap; p; p = p->ifa_next) { 00290 if ((p->ifa_addr->sa_family == AF_LINK) && !(p->ifa_flags & IFF_LOOPBACK) && (p->ifa_flags & IFF_RUNNING)) { 00291 struct sockaddr_dl* sdp = (struct sockaddr_dl*) p->ifa_addr; 00292 memcpy(&(eid->eid), sdp->sdl_data + sdp->sdl_nlen, 6); 00293 ast_debug(1, "Seeding global EID '%s' from '%s' using 'getifaddrs'\n", ast_eid_to_str(eid_str, sizeof(eid_str), eid), p->ifa_name); 00294 freeifaddrs(ifap); 00295 return; 00296 } 00297 } 00298 freeifaddrs(ifap); 00299 } 00300 #endif 00301 #endif 00302 ast_debug(1, "No ethernet interface found for seeding global EID. You will have to set it manually.\n"); 00303 }
| void ast_sha1_hash | ( | char * | output, | |
| const char * | input | |||
| ) |
Produces SHA1 hash based on input string.
Definition at line 254 of file utils.c.
References SHA1Input(), SHA1Reset(), and SHA1Result().
Referenced by aji_act_hook(), handle_call_token(), jabber_make_auth(), and sha1().
00255 { 00256 struct SHA1Context sha; 00257 char *ptr; 00258 int x; 00259 uint8_t Message_Digest[20]; 00260 00261 SHA1Reset(&sha); 00262 00263 SHA1Input(&sha, (const unsigned char *) input, strlen(input)); 00264 00265 SHA1Result(&sha, Message_Digest); 00266 ptr = output; 00267 for (x = 0; x < 20; x++) 00268 ptr += sprintf(ptr, "%2.2x", Message_Digest[x]); 00269 }
| static force_inline void ast_slinear_saturated_add | ( | short * | input, | |
| short * | value | |||
| ) | [static] |
Definition at line 303 of file utils.h.
Referenced by ast_frame_slinear_sum(), audio_audiohook_write_list(), audiohook_read_frame_both(), and softmix_bridge_thread().
| static force_inline void ast_slinear_saturated_divide | ( | short * | input, | |
| short * | value | |||
| ) | [static] |
Definition at line 342 of file utils.h.
Referenced by ast_frame_adjust_volume(), and audiohook_read_frame_both().
| static force_inline void ast_slinear_saturated_multiply | ( | short * | input, | |
| short * | value | |||
| ) | [static] |
Definition at line 329 of file utils.h.
Referenced by ast_frame_adjust_volume(), and audiohook_read_frame_both().
| static force_inline void ast_slinear_saturated_subtract | ( | short * | input, | |
| short * | value | |||
| ) | [static] |
| int ast_str_to_eid | ( | struct ast_eid * | eid, | |
| const char * | s | |||
| ) |
Convert a string into an EID.
This function expects an EID in the format: 00:11:22:33:44:55
Definition at line 305 of file netsock.c.
References ast_eid::eid.
Referenced by aji_handle_pubsub_event(), ast_readconfig(), build_peer(), dundi_do_query(), and set_config().
00306 { 00307 unsigned int eid_int[6]; 00308 int x; 00309 00310 if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2], 00311 &eid_int[3], &eid_int[4], &eid_int[5]) != 6) 00312 return -1; 00313 00314 for (x = 0; x < 6; x++) 00315 eid->eid[x] = eid_int[x]; 00316 00317 return 0; 00318 }
| void ast_unregister_thread | ( | void * | id | ) |
Definition at line 415 of file asterisk.c.
References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, thread_list_t::id, ast_atexit::list, and thread_list_t::name.
Referenced by dummy_start().
00416 { 00417 struct thread_list_t *x; 00418 00419 AST_RWLIST_WRLOCK(&thread_list); 00420 AST_RWLIST_TRAVERSE_SAFE_BEGIN(&thread_list, x, list) { 00421 if ((void *) x->id == id) { 00422 AST_RWLIST_REMOVE_CURRENT(list); 00423 break; 00424 } 00425 } 00426 AST_RWLIST_TRAVERSE_SAFE_END; 00427 AST_RWLIST_UNLOCK(&thread_list); 00428 if (x) { 00429 ast_free(x->name); 00430 ast_free(x); 00431 } 00432 }
| void ast_uri_decode | ( | char * | s | ) |
Decode URI, URN, URL (overwrite string).
| s | String to be decoded |
Definition at line 455 of file utils.c.
Referenced by acf_curl_helper(), config_curl(), get_destination(), get_name_and_number(), get_refer_info(), handle_request_invite(), http_decode(), parse_moved_contact(), realtime_curl(), realtime_multi_curl(), sip_new(), sip_uri_cmp(), and uridecode().
00456 { 00457 char *o; 00458 unsigned int tmp; 00459 00460 for (o = s; *s; s++, o++) { 00461 if (*s == '%' && s[1] != '\0' && s[2] != '\0' && sscanf(s + 1, "%2x", &tmp) == 1) { 00462 /* have '%', two chars and correct parsing */ 00463 *o = tmp; 00464 s += 2; /* Will be incremented once more when we break out */ 00465 } else /* all other cases, just copy */ 00466 *o = *s; 00467 } 00468 *o = '\0'; 00469 }
| char* ast_uri_encode | ( | const char * | string, | |
| char * | outbuf, | |||
| int | buflen, | |||
| int | do_special_char | |||
| ) |
Turn text string to URI-encoded XX version.
| string | String to be converted | |
| outbuf | Resulting encoded string | |
| buflen | Size of output buffer | |
| do_special_char | Convert all non alphanum characters execept those in the mark set as defined by rfc 3261 section 25.1 |
Definition at line 391 of file utils.c.
Referenced by add_rpid(), build_contact(), config_curl(), destroy_curl(), initreqprep(), launch_asyncagi(), realtime_curl(), realtime_multi_curl(), require_curl(), store_curl(), update2_curl(), update_curl(), and uriencode().
00392 { 00393 const char *ptr = string; /* Start with the string */ 00394 char *out = outbuf; 00395 const char *mark = "-_.!~*'()"; /* no encode set, RFC 2396 section 2.3, RFC 3261 sec 25 */ 00396 00397 while (*ptr && out - outbuf < buflen - 1) { 00398 if ((const signed char) *ptr < 32 || *ptr == 0x7f || *ptr == '%' || 00399 (do_special_char && 00400 !(*ptr >= '0' && *ptr <= '9') && /* num */ 00401 !(*ptr >= 'A' && *ptr <= 'Z') && /* ALPHA */ 00402 !(*ptr >= 'a' && *ptr <= 'z') && /* alpha */ 00403 !strchr(mark, *ptr))) { /* mark set */ 00404 if (out - outbuf >= buflen - 3) { 00405 break; 00406 } 00407 00408 out += sprintf(out, "%%%02X", (unsigned char) *ptr); 00409 } else { 00410 *out = *ptr; /* Continue copying the string */ 00411 out++; 00412 } 00413 ptr++; 00414 } 00415 00416 if (buflen) { 00417 *out = '\0'; 00418 } 00419 00420 return outbuf; 00421 }
| int ast_utils_init | ( | void | ) |
Definition at line 2126 of file utils.c.
References ARRAY_LEN, ast_cli_register_multiple(), ast_register_atexit(), and base64_init().
Referenced by main().
02127 { 02128 #ifdef HAVE_DEV_URANDOM 02129 dev_urandom_fd = open("/dev/urandom", O_RDONLY); 02130 #endif 02131 base64_init(); 02132 #ifdef DEBUG_THREADS 02133 #if !defined(LOW_MEMORY) 02134 ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli)); 02135 ast_register_atexit(utils_shutdown); 02136 #endif 02137 #endif 02138 return 0; 02139 }
| char* ast_utils_which | ( | const char * | binary, | |
| char * | fullpath, | |||
| size_t | fullpath_size | |||
| ) |
Resolve a binary to a full pathname.
| binary | Name of the executable to resolve | |
| fullpath | Buffer to hold the complete pathname | |
| fullpath_size | Size of fullpath |
| NULL | binary was not found or the environment variable PATH is not set |
Definition at line 2279 of file utils.c.
References ast_strdupa.
Referenced by ast_bt_get_symbols().
02280 { 02281 const char *envPATH = getenv("PATH"); 02282 char *tpath, *path; 02283 struct stat unused; 02284 if (!envPATH) { 02285 return NULL; 02286 } 02287 tpath = ast_strdupa(envPATH); 02288 while ((path = strsep(&tpath, ":"))) { 02289 snprintf(fullpath, fullpath_size, "%s/%s", path, binary); 02290 if (!stat(fullpath, &unused)) { 02291 return fullpath; 02292 } 02293 } 02294 return NULL; 02295 }
| int ast_wait_for_input | ( | int | fd, | |
| int | ms | |||
| ) |
Definition at line 1226 of file utils.c.
References ast_poll.
Referenced by action_waitevent(), ast_tcptls_server_root(), dahdi_test_timer(), get_input(), moh_class_destructor(), sip_tcp_read(), and sip_tls_read().
01227 { 01228 struct pollfd pfd[1]; 01229 memset(pfd, 0, sizeof(pfd)); 01230 pfd[0].fd = fd; 01231 pfd[0].events = POLLIN|POLLPRI; 01232 return ast_poll(pfd, 1, ms); 01233 }
| int ast_xml_escape | ( | const char * | string, | |
| char * | outbuf, | |||
| size_t | buflen | |||
| ) |
Escape reserved characters for use in XML.
ast_xml_escape If outbuf is too short, the output string will be truncated. Regardless, the output will always be null terminated.
| string | String to be converted | |
| outbuf | Resulting encoded string | |
| buflen | Size of output buffer |
Definition at line 471 of file utils.c.
References ast_assert, entity, and len().
Referenced by state_notify_build_xml().
00472 { 00473 char *dst = outbuf; 00474 char *end = outbuf + buflen - 1; /* save one for the null terminator */ 00475 00476 /* Handle the case for the empty output buffer */ 00477 if (buflen == 0) { 00478 return -1; 00479 } 00480 00481 /* Escaping rules from http://www.w3.org/TR/REC-xml/#syntax */ 00482 /* This also prevents partial entities at the end of a string */ 00483 while (*string && dst < end) { 00484 const char *entity = NULL; 00485 int len = 0; 00486 00487 switch (*string) { 00488 case '<': 00489 entity = "<"; 00490 len = 4; 00491 break; 00492 case '&': 00493 entity = "&"; 00494 len = 5; 00495 break; 00496 case '>': 00497 /* necessary if ]]> is in the string; easier to escape them all */ 00498 entity = ">"; 00499 len = 4; 00500 break; 00501 case '\'': 00502 /* necessary in single-quoted strings; easier to escape them all */ 00503 entity = "'"; 00504 len = 6; 00505 break; 00506 case '"': 00507 /* necessary in double-quoted strings; easier to escape them all */ 00508 entity = """; 00509 len = 6; 00510 break; 00511 default: 00512 *dst++ = *string++; 00513 break; 00514 } 00515 00516 if (entity) { 00517 ast_assert(len == strlen(entity)); 00518 if (end - dst < len) { 00519 /* no room for the entity; stop */ 00520 break; 00521 } 00522 /* just checked for length; strcpy is fine */ 00523 strcpy(dst, entity); 00524 dst += len; 00525 ++string; 00526 } 00527 } 00528 /* Write null terminator */ 00529 *dst = '\0'; 00530 /* If any chars are left in string, return failure */ 00531 return *string == '\0' ? 0 : -1; 00532 }
| 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.
| uint64_t __unsigned_int_flags_dummy64 |
| struct ast_eid ast_eid_default |
Global EID.
This is set in asterisk.conf, or determined automatically by taking the mac address of an Ethernet interface on the system.
Definition at line 192 of file asterisk.c.
Referenced by aji_devstate_cb(), aji_handle_pubsub_event(), aji_mwi_cb(), aji_publish_device_state(), aji_publish_mwi(), ast_event_append_eid(), ast_event_cb(), ast_readconfig(), ast_str_retrieve_variable(), evt_event_deliver_cb(), handle_show_settings(), and set_config().
1.6.1