Asterisk - The Open Source Telephony Project GIT-master-67613d1
Data Structures | Macros | Enumerations | Functions | Variables
utils.h File Reference

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"
Include dependency graph for utils.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
 

Macros

#define ARRAY_IN_BOUNDS(v, a)   IN_BOUNDS((int) (v), 0, ARRAY_LEN(a) - 1)
 Checks to see if value is within the bounds of the given array. More...
 
#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. More...
 
#define ast_alignof(type)   __alignof__(type)
 Return the number of bytes used in the alignment of type. More...
 
#define ast_assert(a)
 
#define ast_assert_return(a, ...)
 
#define AST_BACKGROUND_STACKSIZE   ast_background_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_fd_clear_flags(fd, flags)    __ast_fd_set_flags((fd), (flags), AST_FD_FLAG_CLEAR, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Clear flags on the given file descriptor. More...
 
#define ast_fd_set_flags(fd, flags)    __ast_fd_set_flags((fd), (flags), AST_FD_FLAG_SET, __FILE__, __LINE__, __PRETTY_FUNCTION__)
 Set flags on the given file descriptor. More...
 
#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. More...
 
#define ast_pipe_nonblock(filedes)   pipe2((filedes), O_NONBLOCK)
 Create a non-blocking pipe. More...
 
#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_random_double()   (((double)ast_random()) / RAND_MAX)
 Returns a random number between 0.0 and 1.0, inclusive. More...
 
#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_socket_nonblock(domain, type, protocol)   socket((domain), (type) | SOCK_NONBLOCK, (protocol))
 Create a non-blocking socket. More...
 
#define AST_STACKSIZE   (((sizeof(void *) * 8 * 8) - 16) * 1024)
 
#define AST_STACKSIZE_LOW   (((sizeof(void *) * 8 * 2) - 16) * 1024)
 
#define ast_test_flag(p, flag)
 
#define ast_test_flag64(p, flag)
 
#define ast_test_flag_nonstd(p, flag)    ((p)->flags & (flag))
 
#define AST_URI_ALPHANUM   (1 << 0)
 
#define AST_URI_LEGACY_SPACE   (1 << 2)
 
#define AST_URI_MARK   (1 << 1)
 
#define AST_URI_SIP_USER_UNRESERVED   (1 << 20)
 
#define AST_URI_UNRESERVED   (AST_URI_ALPHANUM | AST_URI_MARK)
 
#define DO_CRASH_NORETURN
 
#define IN_BOUNDS(v, min, max)   ((v) >= (min)) && ((v) <= (max))
 Checks to see if value is within the given bounds. More...
 
#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. More...
 
#define SWAP(a, b)   do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
 

Enumerations

enum  ast_fd_flag_operation { AST_FD_FLAG_SET , AST_FD_FLAG_CLEAR }
 

Functions

void DO_CRASH_NORETURN __ast_assert_failed (int condition, const char *condition_str, const char *file, int line, const char *function)
 
int __ast_fd_set_flags (int fd, int flags, enum ast_fd_flag_operation op, const char *file, int lineno, const char *function)
 
int ast_background_stacksize (void)
 
int ast_base64_encode_file (FILE *inputfile, FILE *outputfile, const char *endl)
 Performs a base 64 encode algorithm on the contents of a File. More...
 
int ast_base64_encode_file_path (const char *filename, FILE *outputfile, const char *endl)
 Performs a base 64 encode algorithm on the contents of a File. More...
 
int ast_base64decode (unsigned char *dst, const char *src, int max)
 Decode data from base64. More...
 
char * ast_base64decode_string (const char *src)
 Same as ast_base64decode, but does the math for you and returns a decoded string. More...
 
int ast_base64encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64. More...
 
int ast_base64encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
 encode text to BASE64 coding More...
 
char * ast_base64encode_string (const char *src)
 Same as ast_base64encode, but does hte math for you and returns an encoded string. More...
 
int ast_base64url_decode (unsigned char *dst, const char *src, int max)
 Decode data from base64 URL. More...
 
char * ast_base64url_decode_string (const char *src)
 Decode string from base64 URL. More...
 
int ast_base64url_encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64 URL. More...
 
int ast_base64url_encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
 Same as ast_base64encode_full but for base64 URL. More...
 
char * ast_base64url_encode_string (const char *src)
 Encode string in base64 URL. More...
 
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. More...
 
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. More...
 
int ast_check_command_in_path (const char *cmd)
 Test for the presence of an executable command in $PATH. More...
 
int ast_check_ipv6 (void)
 Test that an OS supports IPv6 Networking. More...
 
int ast_compare_versions (const char *version1, const char *version2)
 Compare 2 major.minor.patch.extra version strings. More...
 
char * ast_crypt (const char *key, const char *salt)
 Asterisk wrapper around crypt(3). More...
 
char * ast_crypt_encrypt (const char *key)
 Asterisk wrapper around crypt(3) for encrypting passwords. More...
 
int ast_crypt_validate (const char *key, const char *expected)
 Asterisk wrapper around crypt(3) for validating passwords. More...
 
void DO_CRASH_NORETURN ast_do_crash (void)
 Force a crash if DO_CRASH is defined. More...
 
int ast_eid_cmp (const struct ast_eid *eid1, const struct ast_eid *eid2)
 Compare two EIDs. More...
 
int ast_eid_is_empty (const struct ast_eid *eid)
 Check if EID is empty. More...
 
char * ast_eid_to_str (char *s, int maxlen, struct ast_eid *eid)
 Convert an EID to a string. More...
 
void ast_enable_packet_fragmentation (int sock)
 Disable PMTU discovery on a socket. More...
 
char * ast_escape_quoted (const char *string, char *outbuf, int buflen)
 Escape characters found in a quoted string. More...
 
char * ast_escape_semicolons (const char *string, char *outbuf, int buflen)
 Escape semicolons found in a string. More...
 
int ast_file_is_readable (const char *filename)
 Test that a file exists and is readable by the effective user. More...
 
int ast_get_tid (void)
 Get current thread ID. More...
 
struct hostent * ast_gethostbyname (const char *host, struct ast_hostent *hp)
 Thread-safe gethostbyname function to use in Asterisk. More...
 
void ast_md5_hash (char *output, const char *input)
 Produces MD5 hash based on input string. More...
 
int ast_mkdir (const char *path, int mode)
 Recursively create directory path. More...
 
int ast_parse_digest (const char *digest, struct ast_http_digest *d, int request, int pedantic)
 Parse digest authorization header. More...
 
char * ast_process_quotes_and_slashes (char *start, char find, char replace_with)
 Process a string to find and replace characters. More...
 
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_replace_subargument_delimiter (char *s)
 Replace '^' in a string with ','. More...
 
int ast_safe_mkdir (const char *base_path, const char *path, int mode)
 Recursively create directory path, but only if it resolves within the given base_path. More...
 
void ast_set_default_eid (struct ast_eid *eid)
 Fill in an ast_eid with the default eid of this machine. More...
 
void ast_sha1_hash (char *output, const char *input)
 Produces SHA1 hash based on input string. More...
 
void ast_sha1_hash_uint (uint8_t *digest, const char *input)
 Produces SHA1 hash based on input string, stored in uint8_t array. More...
 
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_divide_float (short *input, float *value)
 
static force_inline void ast_slinear_saturated_multiply (short *input, short *value)
 
static force_inline void ast_slinear_saturated_multiply_float (short *input, float *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. More...
 
int ast_thread_is_user_interface (void)
 Indicates whether the current thread is a user interface. More...
 
int ast_thread_user_interface_set (int is_user_interface)
 Set the current thread's user interface status. More...
 
void ast_unescape_quoted (char *quote_str)
 Unescape quotes in a string. More...
 
void ast_unregister_thread (void *id)
 
void ast_uri_decode (char *s, struct ast_flags spec)
 Decode URI, URN, URL (overwrite string) More...
 
char * ast_uri_encode (const char *string, char *outbuf, int buflen, struct ast_flags spec)
 Turn text string to URI-encoded XX version. More...
 
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. More...
 
int ast_wait_for_input (int fd, int ms)
 
int ast_wait_for_output (int fd, int ms)
 
int ast_xml_escape (const char *string, char *outbuf, size_t buflen)
 Escape reserved characters for use in XML. More...
 

Variables

unsigned int __unsigned_int_flags_dummy
 
uint64_t __unsigned_int_flags_dummy64
 
struct ast_eid ast_eid_default
 Global EID. More...
 
const struct ast_flags ast_uri_http
 
const struct ast_flags ast_uri_http_legacy
 
const struct ast_flags ast_uri_sip_user
 

Detailed Description

Utility functions.

Definition in file utils.h.

Macro Definition Documentation

◆ ARRAY_IN_BOUNDS

#define ARRAY_IN_BOUNDS (   v,
  a 
)    IN_BOUNDS((int) (v), 0, ARRAY_LEN(a) - 1)

Checks to see if value is within the bounds of the given array.

Parameters
vthe value to check
athe array to bound check
Return values
0if value out of bounds
non-zerootherwise

Definition at line 687 of file utils.h.

◆ ARRAY_LEN

#define ARRAY_LEN (   a)    (size_t) (sizeof(a) / sizeof(0[a]))
Examples
app_skel.c.

Definition at line 666 of file utils.h.

◆ ast_align_for

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

Parameters
offsetThe value that should be increased.
typeThe data type that offset should be aligned to.
Returns
The smallest multiple of alignof(type) larger than or equal to offset.
See also
ast_make_room_for()

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 785 of file utils.h.

◆ ast_alignof

#define ast_alignof (   type)    __alignof__(type)

Return the number of bytes used in the alignment of type.

Parameters
type
Returns
The number of bytes required for alignment.

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 765 of file utils.h.

◆ ast_assert

#define ast_assert (   a)

Definition at line 739 of file utils.h.

◆ ast_assert_return

#define ast_assert_return (   a,
  ... 
)
Value:
({ \
if (__builtin_expect(!(a), 1)) { \
return __VA_ARGS__; \
}\
})
static struct test_val a

Definition at line 740 of file utils.h.

◆ AST_BACKGROUND_STACKSIZE

#define AST_BACKGROUND_STACKSIZE   ast_background_stacksize()

Definition at line 571 of file utils.h.

◆ ast_clear_flag

#define ast_clear_flag (   p,
  flag 
)

Definition at line 77 of file utils.h.

◆ ast_clear_flag64

#define ast_clear_flag64 (   p,
  flag 
)

Definition at line 134 of file utils.h.

◆ ast_clear_flag_nonstd

#define ast_clear_flag_nonstd (   p,
  flag 
)
Value:
do { \
((p)->flags &= ~(flag)); \
} while(0)
long int flag
Definition: f2c.h:83

Definition at line 180 of file utils.h.

◆ ast_copy_flags

#define ast_copy_flags (   dest,
  src,
  flagz 
)

Definition at line 84 of file utils.h.

◆ ast_copy_flags64

#define ast_copy_flags64 (   dest,
  src,
  flagz 
)

Definition at line 141 of file utils.h.

◆ ast_copy_flags_nonstd

#define ast_copy_flags_nonstd (   dest,
  src,
  flagz 
)
Value:
do { \
(dest)->flags &= ~(flagz); \
(dest)->flags |= ((src)->flags & (flagz)); \
} while (0)

Definition at line 184 of file utils.h.

◆ ast_fd_clear_flags

#define ast_fd_clear_flags (   fd,
  flags 
)     __ast_fd_set_flags((fd), (flags), AST_FD_FLAG_CLEAR, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Clear flags on the given file descriptor.

Since
13.19

If getting or setting flags of the given file descriptor fails, logs an error message.

Parameters
fdFile descriptor to clear flags on
flagsThe flag(s) to clear
Return values
-1on error
0if successful

Definition at line 1055 of file utils.h.

◆ ast_fd_set_flags

#define ast_fd_set_flags (   fd,
  flags 
)     __ast_fd_set_flags((fd), (flags), AST_FD_FLAG_SET, __FILE__, __LINE__, __PRETTY_FUNCTION__)

Set flags on the given file descriptor.

Since
13.19

If getting or setting flags of the given file descriptor fails, logs an error message.

Parameters
fdFile descriptor to set flags on
flagsThe flag(s) to set
Return values
-1on error
0if successful

Definition at line 1039 of file utils.h.

◆ AST_FLAGS_ALL

#define AST_FLAGS_ALL   UINT_MAX

Definition at line 196 of file utils.h.

◆ ast_make_room_for

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

Parameters
offsetThe value that should be increased.
typeThe data type that room should be reserved for.
Returns
The smallest multiple of alignof(type) larger than or equal to offset plus alignof(type).
See also
ast_align_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 808 of file utils.h.

◆ ast_pipe_nonblock

#define ast_pipe_nonblock (   filedes)    pipe2((filedes), O_NONBLOCK)

Create a non-blocking pipe.

Since
13.25

Wrapper around pipe(2) that sets the O_NONBLOCK flag on the resulting file descriptors.

For parameter and return information, see the man page for pipe(2).

Definition at line 1090 of file utils.h.

◆ ast_pthread_create

#define ast_pthread_create (   a,
  b,
  c,
  d 
)
Value:
0, __FILE__, __FUNCTION__, __LINE__, #c)
static struct test_val b
static struct test_val d
static struct test_val c
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)
Definition: utils.c:1625

Definition at line 584 of file utils.h.

◆ ast_pthread_create_background

#define ast_pthread_create_background (   a,
  b,
  c,
  d 
)
Value:
__FILE__, __FUNCTION__, __LINE__, #c)
#define AST_BACKGROUND_STACKSIZE
Definition: utils.h:571

Definition at line 592 of file utils.h.

◆ ast_pthread_create_detached

#define ast_pthread_create_detached (   a,
  b,
  c,
  d 
)
Value:
0, __FILE__, __FUNCTION__, __LINE__, #c)
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)
Definition: utils.c:1673

Definition at line 588 of file utils.h.

◆ ast_pthread_create_detached_background

#define ast_pthread_create_detached_background (   a,
  b,
  c,
  d 
)
Value:
__FILE__, __FUNCTION__, __LINE__, #c)

Definition at line 597 of file utils.h.

◆ ast_random_double

#define ast_random_double ( )    (((double)ast_random()) / RAND_MAX)

Returns a random number between 0.0 and 1.0, inclusive.

Since
12

Definition at line 624 of file utils.h.

◆ ast_set2_flag

#define ast_set2_flag (   p,
  value,
  flag 
)

Definition at line 94 of file utils.h.

◆ ast_set2_flag64

#define ast_set2_flag64 (   p,
  value,
  flag 
)

Definition at line 151 of file utils.h.

◆ ast_set2_flag_nonstd

#define ast_set2_flag_nonstd (   p,
  value,
  flag 
)

Definition at line 189 of file utils.h.

◆ ast_set_flag

#define ast_set_flag (   p,
  flag 
)

Definition at line 70 of file utils.h.

◆ ast_set_flag64

#define ast_set_flag64 (   p,
  flag 
)

Definition at line 127 of file utils.h.

◆ ast_set_flag_nonstd

#define ast_set_flag_nonstd (   p,
  flag 
)
Value:
do { \
((p)->flags |= (flag)); \
} while(0)

Definition at line 176 of file utils.h.

◆ ast_set_flags_to

#define ast_set_flags_to (   p,
  flag,
  value 
)

Definition at line 104 of file utils.h.

◆ ast_set_flags_to64

#define ast_set_flags_to64 (   p,
  flag,
  value 
)

Definition at line 161 of file utils.h.

◆ ast_socket_nonblock

#define ast_socket_nonblock (   domain,
  type,
  protocol 
)    socket((domain), (type) | SOCK_NONBLOCK, (protocol))

Create a non-blocking socket.

Since
13.25

Wrapper around socket(2) that sets the O_NONBLOCK flag on the resulting socket.

For parameter and return information, see the man page for socket(2).

Definition at line 1073 of file utils.h.

◆ AST_STACKSIZE

#define AST_STACKSIZE   (((sizeof(void *) * 8 * 8) - 16) * 1024)

Definition at line 565 of file utils.h.

◆ AST_STACKSIZE_LOW

#define AST_STACKSIZE_LOW   (((sizeof(void *) * 8 * 2) - 16) * 1024)

Definition at line 566 of file utils.h.

◆ ast_test_flag

#define ast_test_flag (   p,
  flag 
)
Examples
app_skel.c.

Definition at line 63 of file utils.h.

◆ ast_test_flag64

#define ast_test_flag64 (   p,
  flag 
)

Definition at line 120 of file utils.h.

◆ ast_test_flag_nonstd

#define ast_test_flag_nonstd (   p,
  flag 
)     ((p)->flags & (flag))

Definition at line 173 of file utils.h.

◆ AST_URI_ALPHANUM

#define AST_URI_ALPHANUM   (1 << 0)

Definition at line 364 of file utils.h.

◆ AST_URI_LEGACY_SPACE

#define AST_URI_LEGACY_SPACE   (1 << 2)

Definition at line 367 of file utils.h.

◆ AST_URI_MARK

#define AST_URI_MARK   (1 << 1)

Definition at line 365 of file utils.h.

◆ AST_URI_SIP_USER_UNRESERVED

#define AST_URI_SIP_USER_UNRESERVED   (1 << 20)

Definition at line 369 of file utils.h.

◆ AST_URI_UNRESERVED

#define AST_URI_UNRESERVED   (AST_URI_ALPHANUM | AST_URI_MARK)

Definition at line 366 of file utils.h.

◆ DO_CRASH_NORETURN

#define DO_CRASH_NORETURN

Definition at line 717 of file utils.h.

◆ IN_BOUNDS

#define IN_BOUNDS (   v,
  min,
  max 
)    ((v) >= (min)) && ((v) <= (max))

Checks to see if value is within the given bounds.

Parameters
vthe value to check
minminimum lower bound (inclusive)
maxmaximum upper bound (inclusive)
Return values
0if value out of bounds
non-zerootherwise

Definition at line 677 of file utils.h.

◆ localtime_r

#define localtime_r   __dont_use_localtime_r_use_ast_localtime_instead__

Definition at line 521 of file utils.h.

◆ MAX

#define MAX (   a,
  b 
)    ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a < __b) ? __b : __a);})

Definition at line 233 of file utils.h.

◆ MIN

#define MIN (   a,
  b 
)    ({ typeof(a) __a = (a); typeof(b) __b = (b); ((__a > __b) ? __b : __a);})

Definition at line 231 of file utils.h.

◆ RAII_VAR

#define RAII_VAR (   vartype,
  varname,
  initval,
  dtor 
)
Value:
auto void _dtor_ ## varname (vartype * v); \
void _dtor_ ## varname (vartype * v) { dtor(*v); } \
vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
static void * cleanup(void *unused)
Definition: pbx_realtime.c:124

Declare a variable that will call a destructor function when it goes out of scope.

Resource Allocation Is Initialization (RAII) variable declaration.

Since
11.0
Parameters
vartypeThe type of the variable
varnameThe name of the variable
initvalThe initial value of the variable
dtorThe 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);
...
}
#define ast_free(a)
Definition: astmm.h:180
static const char name[]
Definition: format_mp3.c:68
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941
Note
This macro is especially useful for working with ao2 objects. A common idiom would be a function that needed to look up an ao2 object and might have several error conditions after the allocation that would normally need to unref the ao2 object. With RAII_VAR, it is possible to just return and leave the cleanup to the destructor function. For example:
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);
}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
int error(const char *format,...)
Definition: utils/frame.c:999
Examples
app_skel.c.

Definition at line 941 of file utils.h.

◆ SWAP

#define SWAP (   a,
  b 
)    do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)

Definition at line 235 of file utils.h.

Enumeration Type Documentation

◆ ast_fd_flag_operation

Enumerator
AST_FD_FLAG_SET 
AST_FD_FLAG_CLEAR 

Definition at line 1021 of file utils.h.

1021 {
1024};
@ AST_FD_FLAG_SET
Definition: utils.h:1022
@ AST_FD_FLAG_CLEAR
Definition: utils.h:1023

Function Documentation

◆ __ast_assert_failed()

void DO_CRASH_NORETURN __ast_assert_failed ( int  condition,
const char *  condition_str,
const char *  file,
int  line,
const char *  function 
)

Definition at line 2816 of file utils.c.

2817{
2818 /*
2819 * Attempt to put it into the logger, but hope that at least
2820 * someone saw the message on stderr ...
2821 */
2822 fprintf(stderr, "FRACK!, Failed assertion %s (%d) at line %d in %s of %s\n",
2823 condition_str, condition, line, function, file);
2824 ast_log(__LOG_ERROR, file, line, function, "FRACK!, Failed assertion %s (%d)\n",
2825 condition_str, condition);
2826
2827 /* Generate a backtrace for the assert */
2829
2830 /*
2831 * Give the logger a chance to get the message out, just in case
2832 * we abort(), or Asterisk crashes due to whatever problem just
2833 * happened after we exit ast_assert().
2834 */
2835 usleep(1);
2836 ast_do_crash();
2837}
#define ast_log
Definition: astobj2.c:42
#define __LOG_ERROR
void ast_log_backtrace(void)
Log a backtrace of the current thread's execution stack to the Asterisk log.
Definition: logger.c:2498
void DO_CRASH_NORETURN ast_do_crash(void)
Force a crash if DO_CRASH is defined.
Definition: utils.c:2804

References __LOG_ERROR, ast_do_crash(), ast_log, ast_log_backtrace(), and make_ari_stubs::file.

Referenced by __ao2_container_clone(), __ao2_iterator_next(), __ao2_link(), __ao2_ref(), internal_ao2_traverse(), and log_bad_ao2().

◆ __ast_fd_set_flags()

int __ast_fd_set_flags ( int  fd,
int  flags,
enum ast_fd_flag_operation  op,
const char *  file,
int  lineno,
const char *  function 
)

Definition at line 3150 of file utils.c.

3152{
3153 int f;
3154
3155 f = fcntl(fd, F_GETFL);
3156 if (f == -1) {
3157 ast_log(__LOG_ERROR, file, lineno, function,
3158 "Failed to get fcntl() flags for file descriptor: %s\n", strerror(errno));
3159 return -1;
3160 }
3161
3162 switch (op) {
3163 case AST_FD_FLAG_SET:
3164 if ((f & flags) == flags) {
3165 /* There is nothing to set */
3166 return 0;
3167 }
3168 f |= flags;
3169 break;
3170 case AST_FD_FLAG_CLEAR:
3171 if (!(f & flags)) {
3172 /* There is nothing to clear */
3173 return 0;
3174 }
3175 f &= ~flags;
3176 break;
3177 default:
3178 ast_assert(0);
3179 break;
3180 }
3181
3182 f = fcntl(fd, F_SETFL, f);
3183 if (f == -1) {
3184 ast_log(__LOG_ERROR, file, lineno, function,
3185 "Failed to set fcntl() flags for file descriptor: %s\n", strerror(errno));
3186 return -1;
3187 }
3188
3189 return 0;
3190}
int errno
#define ast_assert(a)
Definition: utils.h:739

References __LOG_ERROR, ast_assert, AST_FD_FLAG_CLEAR, AST_FD_FLAG_SET, ast_log, errno, and make_ari_stubs::file.

◆ ast_background_stacksize()

int ast_background_stacksize ( void  )

Definition at line 1616 of file utils.c.

1617{
1618#if !defined(LOW_MEMORY)
1619 return AST_STACKSIZE;
1620#else
1621 return AST_STACKSIZE_LOW;
1622#endif
1623}
#define AST_STACKSIZE
Definition: utils.h:565
#define AST_STACKSIZE_LOW
Definition: utils.h:566

References AST_STACKSIZE, and AST_STACKSIZE_LOW.

◆ ast_base64_encode_file()

int ast_base64_encode_file ( FILE *  inputfile,
FILE *  outputfile,
const char *  endl 
)

Performs a base 64 encode algorithm on the contents of a File.

Parameters
inputfileA FILE handle to the input file to be encoded. Must be readable. This handle is not automatically closed.
outputfileA FILE handle to the output file to receive the base 64 encoded contents of the input file, identified by filename.
endlThe line ending to use (e.g. either "\n" or "\r\n")
Returns
zero on success, -1 on error.

Definition at line 648 of file utils.c.

649{
650 static const unsigned char dtable[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
651 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
652 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0',
653 '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
654 int i, hiteof = 0;
655 struct baseio bio;
656
657 memset(&bio, 0, sizeof(bio));
658 bio.iocp = BASEMAXINLINE;
659
660 while (!hiteof){
661 unsigned char igroup[3], ogroup[4];
662 int c, n;
663
664 memset(igroup, 0, sizeof(igroup));
665
666 for (n = 0; n < 3; n++) {
667 if ((c = inchar(&bio, inputfile)) == EOF) {
668 hiteof = 1;
669 break;
670 }
671
672 igroup[n] = (unsigned char) c;
673 }
674
675 if (n > 0) {
676 ogroup[0]= dtable[igroup[0] >> 2];
677 ogroup[1]= dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];
678 ogroup[2]= dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];
679 ogroup[3]= dtable[igroup[2] & 0x3F];
680
681 if (n < 3) {
682 ogroup[3] = '=';
683
684 if (n < 2) {
685 ogroup[2] = '=';
686 }
687 }
688
689 for (i = 0; i < 4; i++) {
690 ochar(&bio, ogroup[i], outputfile, endl);
691 }
692 }
693 }
694
695 if (fputs(endl, outputfile) == EOF) {
696 return 0;
697 }
698
699 return 1;
700}
Structure used for base64 encoding.
Definition: utils.c:579
static int inchar(struct baseio *bio, FILE *fi)
utility used by base_encode()
Definition: utils.c:615
#define BASEMAXINLINE
Definition: utils.c:576
static int ochar(struct baseio *bio, int c, FILE *so, const char *endl)
utility used by base_encode()
Definition: utils.c:629

References BASEMAXINLINE, c, inchar(), baseio::iocp, and ochar().

Referenced by ast_base64_encode_file_path().

◆ ast_base64_encode_file_path()

int ast_base64_encode_file_path ( const char *  filename,
FILE *  outputfile,
const char *  endl 
)

Performs a base 64 encode algorithm on the contents of a File.

Parameters
filenameThe path to the file to be encoded. Must be readable, file is opened in read mode.
outputfileA FILE handle to the output file to receive the base 64 encoded contents of the input file, identified by filename.
endlThe line ending to use (e.g. either "\n" or "\r\n")
Returns
zero on success, -1 on error.

Definition at line 702 of file utils.c.

703{
704 FILE *fi;
705 int res;
706
707 if (!(fi = fopen(filename, "rb"))) {
708 ast_log(AST_LOG_WARNING, "Failed to open file: %s: %s\n", filename, strerror(errno));
709 return -1;
710 }
711
712 res = ast_base64_encode_file(fi, outputfile, endl);
713
714 fclose(fi);
715
716 return res;
717}
#define AST_LOG_WARNING
int ast_base64_encode_file(FILE *inputfile, FILE *outputfile, const char *endl)
Performs a base 64 encode algorithm on the contents of a File.
Definition: utils.c:648

References ast_base64_encode_file(), ast_log, AST_LOG_WARNING, and errno.

Referenced by add_email_attachment(), and sendmail().

◆ ast_base64decode()

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

Decode data from base64.

Parameters
dstthe destination buffer
srcthe source buffer
maxThe 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.

Decode data from base64.

Definition at line 296 of file utils.c.

297{
298 int cnt = 0;
299 unsigned int byte = 0;
300 unsigned int bits = 0;
301 int incnt = 0;
302 while(*src && *src != '=' && (cnt < max)) {
303 /* Shift in 6 bits of input */
304 byte <<= 6;
305 byte |= (b2a[(int)(*src)]) & 0x3f;
306 bits += 6;
307 src++;
308 incnt++;
309 /* If we have at least 8 bits left over, take that character
310 off the top */
311 if (bits >= 8) {
312 bits -= 8;
313 *dst = (byte >> bits) & 0xff;
314 dst++;
315 cnt++;
316 }
317 }
318 /* Don't worry about left over bits, they're extra anyway */
319 return cnt;
320}
#define max(a, b)
Definition: f2c.h:198
static char b2a[256]
Definition: utils.c:82

References b2a, and max.

Referenced by action_messagesend(), aes_helper(), ast_base64decode_string(), ast_check_signature(), ast_http_get_auth(), AST_TEST_DEFINE(), base64_helper(), crypto_init_keys(), custom_presence_callback(), presence_write(), and res_sdp_crypto_parse_offer().

◆ ast_base64decode_string()

char * ast_base64decode_string ( const char *  src)

Same as ast_base64decode, but does the math for you and returns a decoded string.

Note
The returned string will need to be freed later and IS NULL terminated
Parameters
srcThe source buffer
Return values
NULLon failure
Returns
Decoded string on success

Same as ast_base64decode, but does the math for you and returns a decoded string.

Definition at line 323 of file utils.c.

324{
325 size_t encoded_len;
326 size_t decoded_len;
327 int padding = 0;
328 unsigned char *decoded_string;
329
330 if (ast_strlen_zero(src)) {
331 return NULL;
332 }
333
334 encoded_len = strlen(src);
335 if (encoded_len > 2 && src[encoded_len - 1] == '=') {
336 padding++;
337 if (src[encoded_len - 2] == '=') {
338 padding++;
339 }
340 }
341
342 decoded_len = (encoded_len / 4 * 3) - padding;
343 decoded_string = ast_malloc(decoded_len + 1);
344 if (!decoded_string) {
345 return NULL;
346 }
347
348 ast_base64decode(decoded_string, src, decoded_len);
349 decoded_string[decoded_len] = '\0';
350
351 return (char *)decoded_string;
352}
#define ast_malloc(len)
A wrapper for malloc()
Definition: astmm.h:191
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
int ast_base64decode(unsigned char *dst, const char *src, int max)
decode BASE64 encoded text
Definition: utils.c:296

References ast_base64decode(), ast_malloc, ast_strlen_zero(), and NULL.

◆ ast_base64encode()

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

Encode data in base64.

Parameters
dstthe destination buffer
srcthe source data to be encoded
srclenthe number of bytes present in the source buffer
maxthe maximum number of bytes to write into the destination buffer, including the terminating NULL character.

Definition at line 406 of file utils.c.

407{
408 return ast_base64encode_full(dst, src, srclen, max, 0);
409}
int ast_base64encode_full(char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
encode text to BASE64 coding
Definition: utils.c:355

References ast_base64encode_full(), and max.

Referenced by aes_helper(), ast_base64encode_string(), ast_sign(), AST_TEST_DEFINE(), base64_helper(), build_secret(), crypto_init_keys(), presence_read(), websocket_client_create_key(), websocket_combine_key(), and xmpp_client_authenticate_sasl().

◆ ast_base64encode_full()

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

encode text to BASE64 coding

Definition at line 355 of file utils.c.

356{
357 int cnt = 0;
358 int col = 0;
359 unsigned int byte = 0;
360 int bits = 0;
361 int cntin = 0;
362 /* Reserve space for null byte at end of string */
363 max--;
364 while ((cntin < srclen) && (cnt < max)) {
365 byte <<= 8;
366 byte |= *(src++);
367 bits += 8;
368 cntin++;
369 if ((bits == 24) && (cnt + 4 <= max)) {
370 *dst++ = base64[(byte >> 18) & 0x3f];
371 *dst++ = base64[(byte >> 12) & 0x3f];
372 *dst++ = base64[(byte >> 6) & 0x3f];
373 *dst++ = base64[byte & 0x3f];
374 cnt += 4;
375 col += 4;
376 bits = 0;
377 byte = 0;
378 }
379 if (linebreaks && (cnt < max) && (col == 64)) {
380 *dst++ = '\n';
381 cnt++;
382 col = 0;
383 }
384 }
385 if (bits && (cnt + 4 <= max)) {
386 /* Add one last character for the remaining bits,
387 padding the rest with 0 */
388 byte <<= 24 - bits;
389 *dst++ = base64[(byte >> 18) & 0x3f];
390 *dst++ = base64[(byte >> 12) & 0x3f];
391 if (bits == 16)
392 *dst++ = base64[(byte >> 6) & 0x3f];
393 else
394 *dst++ = '=';
395 *dst++ = '=';
396 cnt += 4;
397 }
398 if (linebreaks && (cnt < max)) {
399 *dst++ = '\n';
400 cnt++;
401 }
402 *dst = '\0';
403 return cnt;
404}
static char base64[64]
Definition: utils.c:80

References base64, and max.

Referenced by ast_base64encode().

◆ ast_base64encode_string()

char * ast_base64encode_string ( const char *  src)

Same as ast_base64encode, but does hte math for you and returns an encoded string.

Note
The returned string will need to be freed later
Parameters
srcThe source buffer
Return values
NULLon failure
Returns
Encoded string on success

Same as ast_base64encode, but does hte math for you and returns an encoded string.

Definition at line 412 of file utils.c.

413{
414 size_t encoded_len;
415 char *encoded_string;
416
417 if (ast_strlen_zero(src)) {
418 return NULL;
419 }
420
421 encoded_len = ((strlen(src) * 4 / 3 + 3) & ~3) + 1;
422 encoded_string = ast_calloc(1, encoded_len);
423
424 ast_base64encode(encoded_string, (const unsigned char *)src, strlen(src), encoded_len);
425
426 return encoded_string;
427}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max)
Encode data in base64.
Definition: utils.c:406

References ast_base64encode(), ast_calloc, ast_strlen_zero(), and NULL.

◆ ast_base64url_decode()

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

Decode data from base64 URL.

Parameters
dstThe destination buffer
srcThe source buffer
maxThe 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 429 of file utils.c.

430{
431 int cnt = 0;
432 unsigned int byte = 0;
433 unsigned int bits = 0;
434
435 while (*src && (cnt < max)) {
436 byte <<= 6;
437 byte |= (b2a_url[(int)(*src)]) & 0x3f;
438 bits += 6;
439 src++;
440 if (bits >= 8) {
441 bits -= 8;
442 *dst = (byte >> bits) & 0xff;
443 dst++;
444 cnt++;
445 }
446 }
447 return cnt;
448}
static char b2a_url[256]
Definition: utils.c:83

References b2a_url, and max.

Referenced by ast_base64url_decode_string().

◆ ast_base64url_decode_string()

char * ast_base64url_decode_string ( const char *  src)

Decode string from base64 URL.

Note
The returned string will need to be freed later
Parameters
srcThe source buffer
Return values
NULLon failure
Returns
Decoded string on success

Definition at line 450 of file utils.c.

451{
452 size_t decoded_len;
453 unsigned char *decoded_string;
454
455 if (ast_strlen_zero(src)) {
456 return NULL;
457 }
458
459 decoded_len = strlen(src) * 3 / 4;
460 decoded_string = ast_malloc(decoded_len + 1);
461 if (!decoded_string) {
462 return NULL;
463 }
464
465 ast_base64url_decode(decoded_string, src, decoded_len);
466 decoded_string[decoded_len] = '\0';
467
468 return (char *)decoded_string;
469}
int ast_base64url_decode(unsigned char *dst, const char *src, int max)
Decode data from base64 URL.
Definition: utils.c:429

References ast_base64url_decode(), ast_malloc, ast_strlen_zero(), and NULL.

◆ ast_base64url_encode()

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

Encode data in base64 URL.

Parameters
dstThe destination buffer
srcThe source data to be encoded
srclenThe number of bytes present in the source buffer
maxThe maximum number of bytes to write into the destination buffer, including the terminating NULL character

Definition at line 518 of file utils.c.

519{
520 return ast_base64url_encode_full(dst, src, srclen, max, 0);
521}
int ast_base64url_encode_full(char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
Same as ast_base64encode_full but for base64 URL.
Definition: utils.c:471

References ast_base64url_encode_full(), and max.

Referenced by ast_base64url_encode_string().

◆ ast_base64url_encode_full()

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

Same as ast_base64encode_full but for base64 URL.

Parameters
dstThe destination buffer
srcThe source buffer
srclenThe number of bytes present in the source buffer
maxThe maximum number of bytes to write into the destination buffer, including the terminating NULL character.
linebreaksSet to 1 if there should be linebreaks inserted in the result

Definition at line 471 of file utils.c.

472{
473 int cnt = 0;
474 int col = 0;
475 unsigned int byte = 0;
476 int bits = 0;
477 int cntin = 0;
478
479 max--;
480 while ((cntin < srclen) && (cnt < max)) {
481 byte <<= 8;
482 byte |= *(src++);
483 bits += 8;
484 cntin++;
485 if ((bits == 24) && (cnt + 4 <= max)) {
486 *dst++ = base64url[(byte >> 18) & 0x3f];
487 *dst++ = base64url[(byte >> 12) & 0x3f];
488 *dst++ = base64url[(byte >> 6) & 0x3f];
489 *dst++ = base64url[(byte) & 0x3f];
490 cnt += 4;
491 col += 4;
492 bits = 0;
493 byte = 0;
494 }
495 if (linebreaks && (cnt < max) && (col == 64)) {
496 *dst++ = '\n';
497 cnt++;
498 col = 0;
499 }
500 }
501 if (bits && (cnt + 4 <= max)) {
502 byte <<= 24 - bits;
503 *dst++ = base64url[(byte >> 18) & 0x3f];
504 *dst++ = base64url[(byte >> 12) & 0x3f];
505 if (bits == 16) {
506 *dst++ = base64url[(byte >> 6) & 0x3f];
507 }
508 cnt += 4;
509 }
510 if (linebreaks && (cnt < max)) {
511 *dst++ = '\n';
512 cnt++;
513 }
514 *dst = '\0';
515 return cnt;
516}
static char base64url[64]
Definition: utils.c:81

References base64url, and max.

Referenced by ast_base64url_encode().

◆ ast_base64url_encode_string()

char * ast_base64url_encode_string ( const char *  src)

Encode string in base64 URL.

Note
The returned string will need to be freed later
Parameters
srcThe source data to be encoded
Return values
NULLon failure
Returns
Encoded string on success

Definition at line 523 of file utils.c.

524{
525 size_t encoded_len;
526 char *encoded_string;
527
528 if (ast_strlen_zero(src)) {
529 return NULL;
530 }
531
532 encoded_len = ((strlen(src) * 4 / 3 + 3) & ~3) + 1;
533 encoded_string = ast_malloc(encoded_len);
534
535 ast_base64url_encode(encoded_string, (const unsigned char *)src, strlen(src), encoded_len);
536
537 return encoded_string;
538}
int ast_base64url_encode(char *dst, const unsigned char *src, int srclen, int max)
Encode data in base64 URL.
Definition: utils.c:518

References ast_base64url_encode(), ast_malloc, ast_strlen_zero(), and NULL.

◆ ast_careful_fwrite()

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.

Parameters
fthe file stream to write to
fdthe file description to poll on to know when the file stream can be written to without blocking.
sthe buffer to write from
lenthe number of bytes to write
timeoutmsThe maximum amount of time to block in this function trying to write, specified in milliseconds.
Note
This function assumes that the associated file stream has been set up as non-blocking.
Return values
0success
-1error

◆ ast_carefulwrite()

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.

Note
If you are calling ast_carefulwrite, it is assumed that you are calling it on a file descriptor that DOES have NONBLOCK set. This way, there is only one system call made to do a write, unless we actually have a need to wait. This way, we get better performance.

Try to write string, but wait no more than ms milliseconds before timing out.

Note
The code assumes that the file descriptor has NONBLOCK set, so there is only one system call made to do a write, unless we actually have a need to wait. This way, we get better performance. If the descriptor is blocking, all assumptions on the guaranteed detail do not apply anymore.

Definition at line 1771 of file utils.c.

1772{
1773 struct timeval start = ast_tvnow();
1774 int res = 0;
1775 int elapsed = 0;
1776
1777 while (len) {
1778 if (wait_for_output(fd, timeoutms - elapsed)) {
1779 return -1;
1780 }
1781
1782 res = write(fd, s, len);
1783
1784 if (res < 0 && errno != EAGAIN && errno != EINTR) {
1785 /* fatal error from write() */
1786 if (errno == EPIPE) {
1787#ifndef STANDALONE
1788 ast_debug(1, "write() failed due to reading end being closed: %s\n", strerror(errno));
1789#endif
1790 } else {
1791 ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno));
1792 }
1793 return -1;
1794 }
1795
1796 if (res < 0) {
1797 /* It was an acceptable error */
1798 res = 0;
1799 }
1800
1801 /* Update how much data we have left to write */
1802 len -= res;
1803 s += res;
1804 res = 0;
1805
1806 elapsed = ast_tvdiff_ms(ast_tvnow(), start);
1807 if (elapsed >= timeoutms) {
1808 /* We've taken too long to write
1809 * This is only an error condition if we haven't finished writing. */
1810 res = len ? -1 : 0;
1811 break;
1812 }
1813 }
1814
1815 return res;
1816}
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_ERROR
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:107
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:159
static int wait_for_output(int fd, int timeoutms)
Definition: utils.c:1718

References ast_debug, ast_log, ast_tvdiff_ms(), ast_tvnow(), errno, len(), LOG_ERROR, and wait_for_output().

Referenced by ast_agi_send(), ast_cli(), and cleanup_module().

◆ ast_check_command_in_path()

int ast_check_command_in_path ( const char *  cmd)

Test for the presence of an executable command in $PATH.

Parameters
cmdName of command to locate.
Return values
True(non-zero) if command is in $PATH.
False(zero) command not found.

Definition at line 3263 of file utils.c.

3264{
3265 char *token, *saveptr, *path = getenv("PATH");
3266 char filename[PATH_MAX];
3267 int len;
3268
3269 if (path == NULL) {
3270 return 0;
3271 }
3272
3273 path = ast_strdup(path);
3274 if (path == NULL) {
3275 return 0;
3276 }
3277
3278 token = strtok_r(path, ":", &saveptr);
3279 while (token != NULL) {
3280 len = snprintf(filename, sizeof(filename), "%s/%s", token, cmd);
3281 if (len < 0 || len >= sizeof(filename)) {
3282 ast_log(LOG_WARNING, "Path constructed with '%s' too long; skipping\n", token);
3283 continue;
3284 }
3285
3286 if (access(filename, X_OK) == 0) {
3287 ast_free(path);
3288 return 1;
3289 }
3290
3291 token = strtok_r(NULL, ":", &saveptr);
3292 }
3293 ast_free(path);
3294 return 0;
3295}
#define PATH_MAX
Definition: asterisk.h:40
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
#define LOG_WARNING

References ast_free, ast_log, ast_strdup, len(), LOG_WARNING, NULL, and PATH_MAX.

Referenced by AST_TEST_DEFINE().

◆ ast_check_ipv6()

int ast_check_ipv6 ( void  )

Test that an OS supports IPv6 Networking.

Since
13.14.0
Return values
True(non-zero) if the IPv6 supported.
False(zero) if the OS doesn't support IPv6.

Definition at line 2792 of file utils.c.

2793{
2794 int udp6_socket = socket(AF_INET6, SOCK_DGRAM, 0);
2795
2796 if (udp6_socket < 0) {
2797 return 0;
2798 }
2799
2800 close(udp6_socket);
2801 return 1;
2802}

Referenced by load_module().

◆ ast_compare_versions()

int ast_compare_versions ( const char *  version1,
const char *  version2 
)

Compare 2 major.minor.patch.extra version strings.

Since
13.7.0
Parameters
version1
version2
Return values
negativeif version 1 < version 2.
0if version 1 = version 2.
positiveif version 1 > version 2.

Definition at line 3124 of file utils.c.

3125{
3126 unsigned int major[2] = { 0 };
3127 unsigned int minor[2] = { 0 };
3128 unsigned int patch[2] = { 0 };
3129 unsigned int extra[2] = { 0 };
3130 int res;
3131
3132 sscanf(version1, "%u.%u.%u.%u", &major[0], &minor[0], &patch[0], &extra[0]);
3133 sscanf(version2, "%u.%u.%u.%u", &major[1], &minor[1], &patch[1], &extra[1]);
3134
3135 res = major[0] - major[1];
3136 if (res) {
3137 return res;
3138 }
3139 res = minor[0] - minor[1];
3140 if (res) {
3141 return res;
3142 }
3143 res = patch[0] - patch[1];
3144 if (res) {
3145 return res;
3146 }
3147 return extra[0] - extra[1];
3148}

Referenced by transport_apply().

◆ ast_crypt()

char * ast_crypt ( const char *  key,
const char *  salt 
)

Asterisk wrapper around crypt(3).

The interpretation of the salt (which determines the password hashing algorithm) is system specific. Application code should prefer to use ast_crypt_encrypt() or ast_crypt_validate().

The returned string is heap allocated, and should be freed with ast_free().

Parameters
keyUser's password to crypt.
saltSalt to crypt with.
Returns
Crypted password.
Return values
NULLon error.

Definition at line 121 of file crypt.c.

122{
123 struct crypt_data data = {};
124 const char *crypted = crypt_r(key, salt, &data);
125
126 /* Crypt may return success even if it doesn't recognize the salt. But
127 * in those cases it always mangles the salt in some way.
128 */
129 if (!crypted || !ast_begins_with(crypted, salt)) {
130 return NULL;
131 }
132
133 return ast_strdup(crypted);
134}
static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)
Checks whether a string begins with another.
Definition: strings.h:97

References ast_begins_with(), ast_strdup, and NULL.

Referenced by ast_crypt_encrypt().

◆ ast_crypt_encrypt()

char * ast_crypt_encrypt ( const char *  key)

Asterisk wrapper around crypt(3) for encrypting passwords.

This function will generate a random salt and encrypt the given password.

The returned string is heap allocated, and should be freed with ast_free().

Parameters
keyUser's password to crypt.
Returns
Crypted password.
Return values
NULLon error.

Definition at line 190 of file crypt.c.

191{
192 char salt[MAX_SALT_LEN] = {};
193 while (gen_salt(salt, sizeof(salt)) == 0) {
194 char *crypted = ast_crypt(key, salt);
195 if (crypted) {
196 return crypted;
197 }
198 }
199 return NULL;
200}
static int gen_salt(char *current_salt, size_t maxlen)
Generates a salt to try with crypt.
Definition: crypt.c:72
#define MAX_SALT_LEN
Max length of a salt string.
Definition: crypt.c:43
char * ast_crypt(const char *key, const char *salt)
Asterisk wrapper around crypt(3).
Definition: crypt.c:121

References ast_crypt(), gen_salt(), MAX_SALT_LEN, and NULL.

Referenced by ari_mkpasswd(), and AST_TEST_DEFINE().

◆ ast_crypt_validate()

int ast_crypt_validate ( const char *  key,
const char *  expected 
)

Asterisk wrapper around crypt(3) for validating passwords.

Parameters
keyUser's password to validate.
expectedExpected result from crypt.
Return values
True(non-zero) if key matches expected.
False(zero) if key doesn't match.

Definition at line 136 of file crypt.c.

137{
138 struct crypt_data data = {};
139 return strcmp(expected, crypt_r(key, expected, &data)) == 0;
140}

Referenced by ast_ari_config_validate_user(), and AST_TEST_DEFINE().

◆ ast_do_crash()

void DO_CRASH_NORETURN ast_do_crash ( void  )

Force a crash if DO_CRASH is defined.

Note
If DO_CRASH is not defined then the function returns.

Definition at line 2804 of file utils.c.

2805{
2806#if defined(DO_CRASH)
2807 abort();
2808 /*
2809 * Just in case abort() doesn't work or something else super
2810 * silly, and for Qwell's amusement.
2811 */
2812 *((int *) 0) = 0;
2813#endif /* defined(DO_CRASH) */
2814}

Referenced by __ast_assert_failed().

◆ ast_eid_cmp()

int ast_eid_cmp ( const struct ast_eid eid1,
const struct ast_eid eid2 
)

◆ ast_eid_is_empty()

int ast_eid_is_empty ( const struct ast_eid eid)

Check if EID is empty.

Return values
1if the EID is empty
0otherwise
Since
13.12.0

Definition at line 3099 of file utils.c.

3100{
3101 struct ast_eid empty_eid;
3102
3103 memset(&empty_eid, 0, sizeof(empty_eid));
3104 return memcmp(eid, &empty_eid, sizeof(empty_eid)) ? 0 : 1;
3105}
static dundi_eid empty_eid
Definition: pbx_dundi.c:214
An Entity ID is essentially a MAC address, brief and unique.
Definition: utils.h:813
unsigned char eid[6]
Definition: utils.h:814

References ast_eid::eid, and empty_eid.

Referenced by load_module(), and set_config().

◆ ast_eid_to_str()

char * ast_eid_to_str ( char *  s,
int  maxlen,
struct ast_eid eid 
)

Convert an EID to a string.

Since
1.6.1

Definition at line 2839 of file utils.c.

2840{
2841 int x;
2842 char *os = s;
2843 if (maxlen < 18) {
2844 if (s && (maxlen > 0)) {
2845 *s = '\0';
2846 }
2847 } else {
2848 for (x = 0; x < 5; x++) {
2849 sprintf(s, "%02hhx:", eid->eid[x]);
2850 s += 3;
2851 }
2852 sprintf(s, "%02hhx", eid->eid[5]);
2853 }
2854 return os;
2855}

References ast_eid::eid.

Referenced by app_send(), append_transaction(), ast_ari_asterisk_get_info(), ast_ari_asterisk_ping(), ast_set_default_eid(), ast_str_retrieve_variable(), AST_TEST_DEFINE(), asterisk_publication_send_refresh(), asterisk_publisher_devstate_cb(), asterisk_publisher_mwistate_cb(), bridges_scrape_cb(), build_peer(), build_transactions(), cache_lookup(), cache_lookup_internal(), channels_scrape_cb(), check_key(), complete_peer_helper(), cpg_deliver_cb(), destroy_trans(), do_autokill(), do_register(), do_register_expire(), dump_answer(), dump_eid(), 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_cache(), dundi_show_entityid(), dundi_show_hints(), dundi_show_peer(), dundi_show_peers(), dundi_show_requests(), endpoints_scrape_cb(), handle_command_response(), handle_show_settings(), populate_addr(), prometheus_config_post_apply(), publish_cluster_discovery_to_stasis_full(), publish_device_state_to_stasis(), publish_mwi_to_stasis(), publish_to_corosync(), register_request(), update_key(), xmpp_pubsub_publish_device_state(), and xmpp_pubsub_publish_mwi().

◆ ast_enable_packet_fragmentation()

void ast_enable_packet_fragmentation ( int  sock)

Disable PMTU discovery on a socket.

Parameters
sockThe 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 2469 of file utils.c.

2470{
2471#if defined(HAVE_IP_MTU_DISCOVER)
2472 int val = IP_PMTUDISC_DONT;
2473
2474 if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
2475 ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
2476#endif /* HAVE_IP_MTU_DISCOVER */
2477}
Definition: ast_expr2.c:325

References ast_log, and LOG_WARNING.

Referenced by ast_netsock_bindaddr().

◆ ast_escape_quoted()

char * ast_escape_quoted ( const char *  string,
char *  outbuf,
int  buflen 
)

Escape characters found in a quoted string.

Note
This function escapes quoted characters based on the 'qdtext' set of allowed characters from RFC 3261 section 25.1.
Parameters
stringstring to be escaped
outbufresulting escaped string
buflensize of output buffer
Returns
a pointer to the escaped string

Definition at line 781 of file utils.c.

782{
783 const char *ptr = string;
784 char *out = outbuf;
785 char *allow = "\t\v !"; /* allow LWS (minus \r and \n) and "!" */
786
787 while (*ptr && out - outbuf < buflen - 1) {
788 if (!(strchr(allow, *ptr))
789 && !(*ptr >= '#' && *ptr <= '[') /* %x23 - %x5b */
790 && !(*ptr >= ']' && *ptr <= '~') /* %x5d - %x7e */
791 && !((unsigned char) *ptr > 0x7f)) { /* UTF8-nonascii */
792
793 if (out - outbuf >= buflen - 2) {
794 break;
795 }
796 out += sprintf(out, "\\%c", (unsigned char) *ptr);
797 } else {
798 *out = *ptr;
799 out++;
800 }
801 ptr++;
802 }
803
804 if (buflen) {
805 *out = '\0';
806 }
807
808 return outbuf;
809}
const char * string
Definition: presencestate.c:71
FILE * out
Definition: utils/frame.c:33

References out, and string.

Referenced by ast_callerid_merge(), ast_sip_modify_id_header(), AST_TEST_DEFINE(), channel_read_pjsip(), create_new_id_hdr(), print_escaped_uri(), and refer_send().

◆ ast_escape_semicolons()

char * ast_escape_semicolons ( const char *  string,
char *  outbuf,
int  buflen 
)

Escape semicolons found in a string.

Parameters
stringstring to be escaped
outbufresulting escaped string
buflensize of output buffer
Returns
a pointer to the escaped string

Definition at line 811 of file utils.c.

812{
813 const char *ptr = string;
814 char *out = outbuf;
815
816 if (string == NULL || outbuf == NULL) {
817 ast_assert(string != NULL && outbuf != NULL);
818 return NULL;
819 }
820
821 while (*ptr && out - outbuf < buflen - 1) {
822 if (*ptr == ';') {
823 if (out - outbuf >= buflen - 2) {
824 break;
825 }
826 strcpy(out, "\\;");
827 out += 2;
828 } else {
829 *out = *ptr;
830 out++;
831 }
832 ptr++;
833 }
834
835 if (buflen) {
836 *out = '\0';
837 }
838
839 return outbuf;
840}

References ast_assert, NULL, out, and string.

Referenced by ast_config_text_file_save2(), handle_cli_dialplan_save(), and test_semi().

◆ ast_file_is_readable()

int ast_file_is_readable ( const char *  filename)

Test that a file exists and is readable by the effective user.

Since
13.7.0
Parameters
filenameFile to test.
Return values
True(non-zero) if the file exists and is readable.
False(zero) if the file either doesn't exists or is not readable.

Definition at line 3107 of file utils.c.

3108{
3109#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
3110#if defined(HAVE_EUIDACCESS) && !defined(HAVE_EACCESS)
3111#define eaccess euidaccess
3112#endif
3113 return eaccess(filename, R_OK) == 0;
3114#else
3115 int fd = open(filename, O_RDONLY | O_NONBLOCK);
3116 if (fd < 0) {
3117 return 0;
3118 }
3119 close(fd);
3120 return 1;
3121#endif
3122}

Referenced by add_email_attachment(), as_check_common_config(), ast_media_cache_retrieve(), ast_rtp_dtls_cfg_parse(), retrieve_cert_from_cache(), transport_tls_file_handler(), and vs_check_common_config().

◆ ast_get_tid()

int ast_get_tid ( void  )

Get current thread ID.

Returns
the ID if platform is supported, else -1

Definition at line 2752 of file utils.c.

2753{
2754 int ret = -1;
2755#if defined (__linux) && defined(SYS_gettid)
2756 ret = syscall(SYS_gettid); /* available since Linux 1.4.11 */
2757#elif defined(__sun)
2758 ret = pthread_self();
2759#elif defined(__APPLE__)
2760 ret = mach_thread_self();
2761 mach_port_deallocate(mach_task_self(), ret);
2762#elif defined(__FreeBSD__)
2763 long lwpid;
2764 thr_self(&lwpid);
2765 ret = lwpid;
2766#elif defined(__NetBSD__)
2767 ret = _lwp_self();
2768#elif defined(__OpenBSD__)
2769 ret = getthrid();
2770#endif
2771 return ret;
2772}

Referenced by __ao2_ref(), ast_hangup(), ast_register_thread(), dummy_start(), format_log_message_ap(), and internal_ao2_alloc().

◆ ast_gethostbyname()

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

Thread-safe gethostbyname function to use in Asterisk.

Deprecated:
Replaced by ast_sockaddr_resolve() and ast_sockaddr_resolve_first_af()
Note
To be removed in Asterisk 23.

Thread-safe gethostbyname function to use in Asterisk.

Definition at line 199 of file utils.c.

200{
201#ifndef HAVE_GETHOSTBYNAME_R_5
202 int res;
203#endif
204 int herrno;
205 int dots = 0;
206 const char *s;
207 struct hostent *result = NULL;
208 /* Although it is perfectly legitimate to lookup a pure integer, for
209 the sake of the sanity of people who like to name their peers as
210 integers, we break with tradition and refuse to look up a
211 pure integer */
212 s = host;
213 while (s && *s) {
214 if (*s == '.')
215 dots++;
216 else if (!isdigit(*s))
217 break;
218 s++;
219 }
220 if (!s || !*s) {
221 /* Forge a reply for IP's to avoid octal IP's being interpreted as octal */
222 if (dots != 3)
223 return NULL;
224 memset(hp, 0, sizeof(struct ast_hostent));
225 hp->hp.h_addrtype = AF_INET;
226 hp->hp.h_addr_list = (void *) hp->buf;
227 hp->hp.h_addr = hp->buf + sizeof(void *);
228 /* For AF_INET, this will always be 4 */
229 hp->hp.h_length = 4;
230 if (inet_pton(AF_INET, host, hp->hp.h_addr) > 0)
231 return &hp->hp;
232 return NULL;
233
234 }
235#ifdef HAVE_GETHOSTBYNAME_R_5
236 result = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &herrno);
237
238 if (!result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
239 return NULL;
240#else
241 res = gethostbyname_r(host, &hp->hp, hp->buf, sizeof(hp->buf), &result, &herrno);
242
243 if (res || !result || !hp->hp.h_addr_list || !hp->hp.h_addr_list[0])
244 return NULL;
245#endif
246 return &hp->hp;
247}
static PGresult * result
Definition: cel_pgsql.c:84
char buf[1024]
Definition: utils.h:210
struct hostent hp
Definition: utils.h:209

References ast_hostent::buf, ast_hostent::hp, NULL, and result.

◆ ast_md5_hash()

void ast_md5_hash ( char *  output,
const char *  input 
)

Produces MD5 hash based on input string.

Produces MD5 hash based on input string.

Definition at line 250 of file utils.c.

251{
252 struct MD5Context md5;
253 unsigned char digest[16];
254 char *ptr;
255 int x;
256
257 MD5Init(&md5);
258 MD5Update(&md5, (const unsigned char *) input, strlen(input));
259 MD5Final(digest, &md5);
260 ptr = output;
261 for (x = 0; x < 16; x++)
262 ptr += sprintf(ptr, "%02hhx", digest[x]);
263}
static int input(yyscan_t yyscanner)
Definition: ast_expr2f.c:1570
static int md5(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition: func_md5.c:52
void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len)
Definition: md5.c:72
void MD5Init(struct MD5Context *context)
Definition: md5.c:57
void MD5Final(unsigned char digest[16], struct MD5Context *context)
Definition: md5.c:120
Definition: md5.h:26

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

Referenced by __init_manager(), ast_sip_location_create_contact(), AST_TEST_DEFINE(), auth_exec(), auth_http_callback(), build_nonce(), md5(), and permanent_uri_handler().

◆ ast_mkdir()

int ast_mkdir ( const char *  path,
int  mode 
)

Recursively create directory path.

Parameters
pathThe directory path to create
modeThe permissions with which to try to create the directory
Return values
0on success
Returns
error code otherwise

Creates a directory path, creating parent directories as needed.

Definition at line 2479 of file utils.c.

2480{
2481 char *ptr;
2482 int len = strlen(path), count = 0, x, piececount = 0;
2483 char *tmp = ast_strdupa(path);
2484 char **pieces;
2485 char *fullpath = ast_alloca(len + 1);
2486 int res = 0;
2487
2488 for (ptr = tmp; *ptr; ptr++) {
2489 if (*ptr == '/')
2490 count++;
2491 }
2492
2493 /* Count the components to the directory path */
2494 pieces = ast_alloca(count * sizeof(*pieces));
2495 for (ptr = tmp; *ptr; ptr++) {
2496 if (*ptr == '/') {
2497 *ptr = '\0';
2498 pieces[piececount++] = ptr + 1;
2499 }
2500 }
2501
2502 *fullpath = '\0';
2503 for (x = 0; x < piececount; x++) {
2504 /* This looks funky, but the buffer is always ideally-sized, so it's fine. */
2505 strcat(fullpath, "/");
2506 strcat(fullpath, pieces[x]);
2507 res = mkdir(fullpath, mode);
2508 if (res && errno != EEXIST)
2509 return errno;
2510 }
2511 return 0;
2512}
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
static int tmp()
Definition: bt_open.c:389

References ast_alloca, ast_strdupa, errno, len(), and tmp().

Referenced by ast_file_fdtemp(), ast_logger_rotate_channel(), conf_rec_name(), conf_run(), create_destination_directory(), create_dirpath(), dictate_exec(), filename_parse(), init_logger(), load_module(), reload_logger(), remove_from_queue(), setup_privacy_args(), sms_nextoutgoing(), sms_writefile(), test_vm_api_create_voicemail_folder(), testclient_exec(), testserver_exec(), and write_history().

◆ ast_parse_digest()

int ast_parse_digest ( const char *  digest,
struct ast_http_digest d,
int  request,
int  pedantic 
)

Parse digest authorization header.

Returns
-1 if we have no auth or something wrong with digest.
Note
This function may be used for Digest request and responce header. request arg is set to nonzero, if we parse Digest Request. pedantic arg can be set to nonzero if we need to do addition Digest check.
Returns
Returns -1 if we have no auth or something wrong with digest.
Note
This function may be used for Digest request and responce header. request arg is set to nonzero, if we parse Digest Request. pedantic arg can be set to nonzero if we need to do addition Digest check.

Definition at line 2638 of file utils.c.

2638 {
2639 char *c;
2640 struct ast_str *str = ast_str_create(16);
2641
2642 /* table of recognised keywords, and places where they should be copied */
2643 const struct x {
2644 const char *key;
2645 const ast_string_field *field;
2646 } *i, keys[] = {
2647 { "username=", &d->username },
2648 { "realm=", &d->realm },
2649 { "nonce=", &d->nonce },
2650 { "uri=", &d->uri },
2651 { "domain=", &d->domain },
2652 { "response=", &d->response },
2653 { "cnonce=", &d->cnonce },
2654 { "opaque=", &d->opaque },
2655 /* Special cases that cannot be directly copied */
2656 { "algorithm=", NULL },
2657 { "qop=", NULL },
2658 { "nc=", NULL },
2659 { NULL, 0 },
2660 };
2661
2662 if (ast_strlen_zero(digest) || !d || !str) {
2663 ast_free(str);
2664 return -1;
2665 }
2666
2667 ast_str_set(&str, 0, "%s", digest);
2668
2670
2671 if (strncasecmp(c, "Digest ", strlen("Digest "))) {
2672 ast_log(LOG_WARNING, "Missing Digest.\n");
2673 ast_free(str);
2674 return -1;
2675 }
2676 c += strlen("Digest ");
2677
2678 /* lookup for keys/value pair */
2679 while (c && *c && *(c = ast_skip_blanks(c))) {
2680 /* find key */
2681 for (i = keys; i->key != NULL; i++) {
2682 char *src, *separator;
2683 int unescape = 0;
2684 if (strncasecmp(c, i->key, strlen(i->key)) != 0) {
2685 continue;
2686 }
2687
2688 /* Found. Skip keyword, take text in quotes or up to the separator. */
2689 c += strlen(i->key);
2690 if (*c == '"') {
2691 src = ++c;
2692 separator = "\"";
2693 unescape = 1;
2694 } else {
2695 src = c;
2696 separator = ",";
2697 }
2698 strsep(&c, separator); /* clear separator and move ptr */
2699 if (unescape) {
2700 ast_unescape_c(src);
2701 }
2702 if (i->field) {
2703 ast_string_field_ptr_set(d, i->field, src);
2704 } else {
2705 /* Special cases that require additional processing */
2706 if (!strcasecmp(i->key, "algorithm=")) {
2707 if (strcasecmp(src, "MD5")) {
2708 ast_log(LOG_WARNING, "Digest algorithm: \"%s\" not supported.\n", src);
2709 ast_free(str);
2710 return -1;
2711 }
2712 } else if (!strcasecmp(i->key, "qop=") && !strcasecmp(src, "auth")) {
2713 d->qop = 1;
2714 } else if (!strcasecmp(i->key, "nc=")) {
2715 unsigned long u;
2716 if (sscanf(src, "%30lx", &u) != 1) {
2717 ast_log(LOG_WARNING, "Incorrect Digest nc value: \"%s\".\n", src);
2718 ast_free(str);
2719 return -1;
2720 }
2721 ast_string_field_set(d, nc, src);
2722 }
2723 }
2724 break;
2725 }
2726 if (i->key == NULL) { /* not found, try ',' */
2727 strsep(&c, ",");
2728 }
2729 }
2730 ast_free(str);
2731
2732 /* Digest checkout */
2733 if (ast_strlen_zero(d->realm) || ast_strlen_zero(d->nonce)) {
2734 /* "realm" and "nonce" MUST be always exist */
2735 return -1;
2736 }
2737
2738 if (!request) {
2739 /* Additional check for Digest response */
2740 if (ast_strlen_zero(d->username) || ast_strlen_zero(d->uri) || ast_strlen_zero(d->response)) {
2741 return -1;
2742 }
2743
2744 if (pedantic && d->qop && (ast_strlen_zero(d->cnonce) || ast_strlen_zero(d->nc))) {
2745 return -1;
2746 }
2747 }
2748
2749 return 0;
2750}
const char * str
Definition: app_jack.c:147
static int request(void *obj)
Definition: chan_pjsip.c:2601
char * strsep(char **str, const char *delims)
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
const char * ast_string_field
Definition: stringfields.h:190
#define ast_string_field_ptr_set(x, ptr, data)
Set a field to a simple string value.
Definition: stringfields.h:475
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1113
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:161
Support for dynamic strings.
Definition: strings.h:623
char * ast_unescape_c(char *src)
Convert some C escape sequences.
Definition: utils.c:1983

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(), c, d, LOG_WARNING, NULL, request(), str, and strsep().

Referenced by auth_http_callback().

◆ ast_process_quotes_and_slashes()

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

Process a string to find and replace characters.

Parameters
startThe string to analyze
findThe character to find
replace_withThe character that will replace the one we are looking for

Definition at line 2352 of file utils.c.

2353{
2354 char *dataPut = start;
2355 int inEscape = 0;
2356 int inQuotes = 0;
2357
2358 for (; *start; start++) {
2359 if (inEscape) {
2360 *dataPut++ = *start; /* Always goes verbatim */
2361 inEscape = 0;
2362 } else {
2363 if (*start == '\\') {
2364 inEscape = 1; /* Do not copy \ into the data */
2365 } else if (*start == '\'') {
2366 inQuotes = 1 - inQuotes; /* Do not copy ' into the data */
2367 } else {
2368 /* Replace , with |, unless in quotes */
2369 *dataPut++ = inQuotes ? *start : ((*start == find) ? replace_with : *start);
2370 }
2371 }
2372 }
2373 if (start != dataPut)
2374 *dataPut = 0;
2375 return dataPut;
2376}

◆ ast_pthread_create_detached_stack()

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

1676{
1677 unsigned char attr_destroy = 0;
1678 int res;
1679
1680 if (!attr) {
1681 attr = ast_alloca(sizeof(*attr));
1682 pthread_attr_init(attr);
1683 attr_destroy = 1;
1684 }
1685
1686 if ((errno = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED)))
1687 ast_log(LOG_WARNING, "pthread_attr_setdetachstate: %s\n", strerror(errno));
1688
1689 res = ast_pthread_create_stack(thread, attr, start_routine, data,
1690 stacksize, file, caller, line, start_fn);
1691
1692 if (attr_destroy)
1693 pthread_attr_destroy(attr);
1694
1695 return res;
1696}
pthread_t thread
Definition: app_sla.c:329
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)
Definition: utils.c:1625

References ast_alloca, ast_log, ast_pthread_create_stack(), thr_arg::data, errno, make_ari_stubs::file, LOG_WARNING, thr_arg::start_routine, and thread.

◆ ast_pthread_create_stack()

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

1628{
1629#if !defined(LOW_MEMORY)
1630 struct thr_arg *a;
1631#endif
1632
1633 if (!attr) {
1634 attr = ast_alloca(sizeof(*attr));
1635 pthread_attr_init(attr);
1636 }
1637
1638#if defined(__linux__) || defined(__FreeBSD__)
1639 /* On Linux and FreeBSD , pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
1640 which is kind of useless. Change this here to
1641 PTHREAD_INHERIT_SCHED; that way the -p option to set realtime
1642 priority will propagate down to new threads by default.
1643 This does mean that callers cannot set a different priority using
1644 PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
1645 the priority afterwards with pthread_setschedparam(). */
1646 if ((errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED)))
1647 ast_log(LOG_WARNING, "pthread_attr_setinheritsched: %s\n", strerror(errno));
1648#endif
1649
1650 if (!stacksize)
1651 stacksize = AST_STACKSIZE;
1652
1653 if ((errno = pthread_attr_setstacksize(attr, stacksize ? stacksize : AST_STACKSIZE)))
1654 ast_log(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(errno));
1655
1656#if !defined(LOW_MEMORY)
1657 if ((a = ast_malloc(sizeof(*a)))) {
1658 a->start_routine = start_routine;
1659 a->data = data;
1661 if (ast_asprintf(&a->name, "%-20s started at [%5d] %s %s()",
1662 start_fn, line, file, caller) < 0) {
1663 a->name = NULL;
1664 }
1665 data = a;
1666 }
1667#endif /* !LOW_MEMORY */
1668
1669 return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
1670}
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
#define pthread_create
Definition: lock.h:642
const char * name
void * data
Definition: utils.c:1562
void *(* start_routine)(void *)
Definition: utils.c:1561
static void * dummy_start(void *data)
Definition: utils.c:1573

References a, ast_alloca, ast_asprintf, ast_log, ast_malloc, AST_STACKSIZE, thr_arg::data, dummy_start(), errno, make_ari_stubs::file, LOG_WARNING, test_val::name, NULL, pthread_create, thr_arg::start_routine, and thread.

Referenced by ast_pthread_create_detached_stack().

◆ ast_random()

long int ast_random ( void  )
Examples
app_skel.c.

Definition at line 2312 of file utils.c.

2313{
2314 long int res;
2315
2316 if (dev_urandom_fd >= 0) {
2317 int read_res = read(dev_urandom_fd, &res, sizeof(res));
2318 if (read_res > 0) {
2319 long int rm = RAND_MAX;
2320 res = res < 0 ? ~res : res;
2321 rm++;
2322 return res % rm;
2323 }
2324 }
2325
2326 /* XXX - Thread safety really depends on the libc, not the OS.
2327 *
2328 * But... popular Linux libc's (uClibc, glibc, eglibc), all have a
2329 * somewhat thread safe random(3) (results are random, but not
2330 * reproducible). The libc's for other systems (BSD, et al.), not so
2331 * much.
2332 */
2333#ifdef linux
2334 res = random();
2335#else
2337 res = random();
2339#endif
2340 return res;
2341}
#define ast_mutex_unlock(a)
Definition: lock.h:190
#define ast_mutex_lock(a)
Definition: lock.h:189
static int dev_urandom_fd
Definition: utils.c:938
static ast_mutex_t randomlock
Definition: utils.c:2309

References ast_mutex_lock, ast_mutex_unlock, dev_urandom_fd, and randomlock.

Referenced by acf_rand_exec(), action_challenge(), agi_handle_command(), app_exec(), ast_generate_random_string(), ast_lock_path_lockfile(), ast_moh_files_next(), ast_rtp_change_source(), ast_rtp_new(), AST_TEST_DEFINE(), ast_udptl_new_with_bindaddr(), astobj2_test_1_helper(), auth_http_callback(), authenticate_request(), build_iv(), build_rand_pad(), calc_metric(), calc_rxstamp(), caldav_write_event(), create_channel_name(), create_local_sdp(), dns_srv_sort(), generate_parked_user(), generate_random_string(), generic_http_callback(), get_trans_id(), get_unused_callno(), handle_cli_sched_bench(), iax2_key_rotate(), jingle_add_ice_udp_candidates_to_transport(), jingle_alloc(), jingle_new(), load_module(), make_email_file(), mbl_new(), moh_files_alloc(), multicast_rtp_new(), ogg_vorbis_rewrite(), page_exec(), process_weights(), registry_authrequest(), reschedule_reinvite(), rtp_allocate_transport(), say_periodic_announcement(), sendmail(), sip_outbound_registration_perform(), socket_read(), sorcery_memory_cache_thrash_retrieve(), sorcery_memory_cache_thrash_update(), stun_req_id(), test_ao2_find_w_no_flags(), test_ao2_find_w_OBJ_KEY(), test_ao2_find_w_OBJ_PARTIAL_KEY(), test_ao2_find_w_OBJ_POINTER(), test_files_get_one(), try_firmware(), websocket_client_create_key(), and websocket_mask_payload().

◆ ast_register_thread()

void ast_register_thread ( char *  name)

Definition at line 414 of file asterisk.c.

415{
416 struct thread_list_t *new = ast_calloc(1, sizeof(*new));
417
418 if (!new)
419 return;
420
422 new->id = pthread_self();
423 new->lwp = ast_get_tid();
424 new->name = name; /* steal the allocated memory for the thread name */
428}
static int multi_thread_safe
Definition: asterisk.c:388
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
Definition: linkedlists.h:52
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
Definition: linkedlists.h:151
#define AST_RWLIST_INSERT_HEAD
Definition: linkedlists.h:718
int ast_get_tid(void)
Get current thread ID.
Definition: utils.c:2752

References ast_assert, ast_calloc, ast_get_tid(), AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, multi_thread_safe, and name.

Referenced by dummy_start().

◆ ast_replace_subargument_delimiter()

void ast_replace_subargument_delimiter ( char *  s)

Replace '^' in a string with ','.

Parameters
sString within which to replace characters

Definition at line 2343 of file utils.c.

2344{
2345 for (; *s; s++) {
2346 if (*s == '^') {
2347 *s = ',';
2348 }
2349 }
2350}

Referenced by app_exec(), ast_bridge_set_after_go_on(), dial_exec_full(), originate_exec(), page_exec(), and queue_exec().

◆ ast_safe_mkdir()

int ast_safe_mkdir ( const char *  base_path,
const char *  path,
int  mode 
)

Recursively create directory path, but only if it resolves within the given base_path.

If base_path does not exist, it will not be created and this function returns EPERM.

Parameters
base_path
pathThe directory path to create
modeThe permissions with which to try to create the directory
Return values
0on success
Returns
an error code otherwise

Definition at line 2584 of file utils.c.

2585{
2586 RAII_VAR(char *, absolute_base_path, NULL, ast_std_free);
2587 RAII_VAR(char *, p, NULL, ast_free);
2588
2589 if (base_path == NULL || path == NULL) {
2590 errno = EFAULT;
2591 return errno;
2592 }
2593
2594 p = ast_strdup(path);
2595 if (p == NULL) {
2596 errno = ENOMEM;
2597 return errno;
2598 }
2599
2600 absolute_base_path = realpath(base_path, NULL);
2601 if (absolute_base_path == NULL) {
2602 return errno;
2603 }
2604
2605 return safe_mkdir(absolute_base_path, p, mode);
2606}
void ast_std_free(void *ptr)
Definition: astmm.c:1734
static int safe_mkdir(const char *base_path, char *path, int mode)
Definition: utils.c:2514

References ast_free, ast_std_free(), ast_strdup, errno, NULL, RAII_VAR, and safe_mkdir().

Referenced by AST_TEST_DEFINE(), stasis_app_control_record(), and stasis_app_stored_recording_copy().

◆ ast_set_default_eid()

void ast_set_default_eid ( struct ast_eid eid)

Fill in an ast_eid with the default eid of this machine.

Since
1.6.1

Definition at line 3001 of file utils.c.

3002{
3003 int s;
3004 int i;
3005 struct ifreq *ifr;
3006 struct ifreq *ifrp;
3007 struct ifconf ifc;
3008 char *buf = NULL;
3009 char eid_str[20];
3010 int bufsz, num_interfaces;
3011 unsigned char empty_mac[6] = {0, 0, 0, 0, 0, 0};
3012 unsigned char full_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
3013
3014 s = socket(AF_INET, SOCK_STREAM, 0);
3015 if (s < 0) {
3016 ast_log(LOG_WARNING, "Unable to open socket for seeding global EID. "
3017 "You will have to set it manually.\n");
3018 return;
3019 }
3020
3021 ifc.ifc_len = 0;
3022 ifc.ifc_buf = NULL;
3023 if (ioctl(s, SIOCGIFCONF, &ifc) || ifc.ifc_len <= 0) {
3024 ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
3025 "You will have to set it manually.\n");
3026 close(s);
3027 return;
3028 }
3029 bufsz = ifc.ifc_len;
3030
3031 if (!(buf = ast_malloc(bufsz))) {
3032 ast_log(LOG_WARNING, "Unable to allocate memory for seeding global EID. "
3033 "You will have to set it manually.\n");
3034 close(s);
3035 return;
3036 }
3037
3038 ifc.ifc_buf = buf;
3039 if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
3040 ast_log(LOG_WARNING, "Unable to retrieve ethernet interfaces for seeding global EID. "
3041 "You will have to set it manually.\n");
3042 ast_free(buf);
3043 close(s);
3044 return;
3045 }
3046
3047 ifrp = ifc.ifc_req;
3048 num_interfaces = ifc.ifc_len / sizeof(*ifr);
3049
3050 for (i = 0; i < num_interfaces; i++) {
3051 ifr = &ifrp[i];
3052 if (!ioctl(s, SIOCGIFHWADDR, ifr)) {
3053 unsigned char *hwaddr = (unsigned char *) ifr->ifr_hwaddr.sa_data;
3054
3055 if (!(memcmp(hwaddr, &empty_mac, 6) && memcmp(hwaddr, &full_mac, 6))) {
3056 continue;
3057 }
3058
3059 memcpy(eid, hwaddr, sizeof(*eid));
3060 ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n",
3061 ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr->ifr_name);
3062 ast_free(buf);
3063 close(s);
3064 return;
3065 }
3066 }
3067
3068 ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
3069 "You will have to set it manually.\n");
3070 ast_free(buf);
3071 close(s);
3072
3073 return;
3074}
if(!yyg->yy_init)
Definition: ast_expr2f.c:854
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
char * ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
Convert an EID to a string.
Definition: utils.c:2839

References ast_debug, ast_eid_to_str(), ast_free, ast_log, ast_malloc, buf, if(), LOG_WARNING, and NULL.

Referenced by load_asterisk_conf().

◆ ast_sha1_hash()

void ast_sha1_hash ( char *  output,
const char *  input 
)

Produces SHA1 hash based on input string.

Produces SHA1 hash based on input string.

Definition at line 266 of file utils.c.

267{
268 struct SHA1Context sha;
269 char *ptr;
270 int x;
271 uint8_t Message_Digest[20];
272
273 SHA1Reset(&sha);
274
275 SHA1Input(&sha, (const unsigned char *) input, strlen(input));
276
277 SHA1Result(&sha, Message_Digest);
278 ptr = output;
279 for (x = 0; x < 20; x++)
280 ptr += sprintf(ptr, "%02hhx", Message_Digest[x]);
281}
int SHA1Result(SHA1Context *, uint8_t Message_Digest[SHA1HashSize])
SHA1Result Returns the resulting 160-bit digest.
Definition: sha1.c:226
int SHA1Input(SHA1Context *, const uint8_t *bytes, unsigned int bytecount)
int SHA1Reset(SHA1Context *)
SHA1Reset.
Definition: sha1.c:101

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

Referenced by ast_tcptls_server_start(), AST_TEST_DEFINE(), ctx_populate(), handle_call_token(), media_cache_item_sync_to_astdb(), sha1(), xmpp_client_authenticate_digest(), and xmpp_component_authenticate().

◆ ast_sha1_hash_uint()

void ast_sha1_hash_uint ( uint8_t *  digest,
const char *  input 
)

Produces SHA1 hash based on input string, stored in uint8_t array.

Produces SHA1 hash based on input string, stored in uint8_t array.

Definition at line 284 of file utils.c.

285{
286 struct SHA1Context sha;
287
288 SHA1Reset(&sha);
289
290 SHA1Input(&sha, (const unsigned char *) input, strlen(input));
291
292 SHA1Result(&sha, digest);
293}

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

Referenced by websocket_combine_key().

◆ ast_slinear_saturated_add()

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

Definition at line 450 of file utils.h.

451{
452 int res;
453
454 res = (int) *input + *value;
455 if (res > 32767)
456 *input = 32767;
457 else if (res < -32768)
458 *input = -32768;
459 else
460 *input = (short) res;
461}
int value
Definition: syslog.c:37

References input(), and value.

Referenced by ast_frame_slinear_sum(), audio_audiohook_write_list(), audiohook_read_frame_both(), binaural_mixing(), softmix_mixing_loop(), and spy_generate().

◆ ast_slinear_saturated_divide()

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

Definition at line 502 of file utils.h.

503{
504 *input /= *value;
505}

References input(), and value.

Referenced by ast_frame_adjust_volume(), and audiohook_read_frame_both().

◆ ast_slinear_saturated_divide_float()

static force_inline void ast_slinear_saturated_divide_float ( short *  input,
float *  value 
)
static

Definition at line 507 of file utils.h.

508{
509 float res = (float) *input / *value;
510 if (res > 32767)
511 *input = 32767;
512 else if (res < -32768)
513 *input = -32768;
514 else
515 *input = (short) res;
516}

References input(), and value.

Referenced by ast_frame_adjust_volume_float().

◆ ast_slinear_saturated_multiply()

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

Definition at line 476 of file utils.h.

477{
478 int res;
479
480 res = (int) *input * *value;
481 if (res > 32767)
482 *input = 32767;
483 else if (res < -32768)
484 *input = -32768;
485 else
486 *input = (short) res;
487}

References input(), and value.

Referenced by ast_frame_adjust_volume(), and audiohook_read_frame_both().

◆ ast_slinear_saturated_multiply_float()

static force_inline void ast_slinear_saturated_multiply_float ( short *  input,
float *  value 
)
static

Definition at line 489 of file utils.h.

490{
491 float res;
492
493 res = (float) *input * *value;
494 if (res > 32767)
495 *input = 32767;
496 else if (res < -32768)
497 *input = -32768;
498 else
499 *input = (short) res;
500}

References input(), and value.

Referenced by ast_frame_adjust_volume_float().

◆ ast_slinear_saturated_subtract()

static force_inline void ast_slinear_saturated_subtract ( short *  input,
short *  value 
)
static

Definition at line 463 of file utils.h.

464{
465 int res;
466
467 res = (int) *input - *value;
468 if (res > 32767)
469 *input = 32767;
470 else if (res < -32768)
471 *input = -32768;
472 else
473 *input = (short) res;
474}

References input(), and value.

Referenced by softmix_process_write_audio(), and softmix_process_write_binaural_audio().

◆ ast_str_to_eid()

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

Return values
0success
non-zerofailure
Since
1.6.1

Definition at line 3077 of file utils.c.

3078{
3079 unsigned int eid_int[6];
3080 int x;
3081
3082 if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2],
3083 &eid_int[3], &eid_int[4], &eid_int[5]) != 6) {
3084 return -1;
3085 }
3086
3087 for (x = 0; x < 6; x++) {
3088 eid->eid[x] = eid_int[x];
3089 }
3090
3091 return 0;
3092}

References ast_eid::eid.

Referenced by asterisk_publication_devicestate_state_change(), asterisk_publication_mwi_state_change(), build_peer(), dundi_do_query(), load_asterisk_conf(), set_config(), and xmpp_pubsub_handle_event().

◆ ast_thread_is_user_interface()

int ast_thread_is_user_interface ( void  )

Indicates whether the current thread is a user interface.

Return values
True(non-zero) if thread is a user interface.
False(zero) if thread is not a user interface.

Definition at line 3248 of file utils.c.

3249{
3250 int *thread_user_interface;
3251
3252 thread_user_interface = ast_threadstorage_get(
3253 &thread_user_interface_tl, sizeof(*thread_user_interface));
3254 if (thread_user_interface == NULL) {
3255 ast_log(LOG_ERROR, "Error checking thread's user interface status\n");
3256 /* On error, assume that we are not a user interface thread */
3257 return 0;
3258 }
3259
3260 return *thread_user_interface;
3261}
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
static struct ast_threadstorage thread_user_interface_tl
Definition: utils.c:3231

References ast_log, ast_threadstorage_get(), LOG_ERROR, NULL, and thread_user_interface_tl.

Referenced by ast_autoservice_start(), and ast_autoservice_stop().

◆ ast_thread_user_interface_set()

int ast_thread_user_interface_set ( int  is_user_interface)

Set the current thread's user interface status.

Parameters
is_user_interfaceNon-zero to mark the thread as a user interface.
Return values
True(non-zero) if marking current thread failed.
False(zero) if successfuly marked current thread.

Definition at line 3233 of file utils.c.

3234{
3235 int *thread_user_interface;
3236
3237 thread_user_interface = ast_threadstorage_get(
3238 &thread_user_interface_tl, sizeof(*thread_user_interface));
3239 if (thread_user_interface == NULL) {
3240 ast_log(LOG_ERROR, "Error setting user interface status for current thread\n");
3241 return -1;
3242 }
3243
3244 *thread_user_interface = !!is_user_interface;
3245 return 0;
3246}

References ast_log, ast_threadstorage_get(), LOG_ERROR, NULL, and thread_user_interface_tl.

Referenced by handle_tcptls_connection().

◆ ast_unescape_quoted()

void ast_unescape_quoted ( char *  quote_str)

Unescape quotes in a string.

Parameters
quote_strThe string with quotes to be unescaped
Note
This function mutates the passed-in string.

Definition at line 842 of file utils.c.

843{
844 int esc_pos;
845 int unesc_pos;
846 int quote_str_len = strlen(quote_str);
847
848 for (esc_pos = 0, unesc_pos = 0;
849 esc_pos < quote_str_len;
850 esc_pos++, unesc_pos++) {
851 if (quote_str[esc_pos] == '\\') {
852 /* at least one more char and current is \\ */
853 esc_pos++;
854 if (esc_pos >= quote_str_len) {
855 break;
856 }
857 }
858
859 quote_str[unesc_pos] = quote_str[esc_pos];
860 }
861 quote_str[unesc_pos] = '\0';
862}

Referenced by ast_callerid_parse(), ast_strsep(), ast_strsep_quoted(), and AST_TEST_DEFINE().

◆ ast_unregister_thread()

void ast_unregister_thread ( void *  id)

Definition at line 430 of file asterisk.c.

431{
432 struct thread_list_t *x;
433
436 if ((void *) x->id == id) {
438 break;
439 }
440 }
443 if (x) {
444 ast_free(x->name);
445 ast_free(x);
446 }
447}
#define AST_RWLIST_REMOVE_CURRENT
Definition: linkedlists.h:570
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
Definition: linkedlists.h:545
#define AST_RWLIST_TRAVERSE_SAFE_END
Definition: linkedlists.h:617

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by dummy_start().

◆ ast_uri_decode()

void ast_uri_decode ( char *  s,
struct ast_flags  spec 
)

Decode URI, URN, URL (overwrite string)

Note
The ast_uri_http_legacy decode spec flag will cause this function to decode '+' as ' '.
Parameters
sstring to be decoded
specflags describing how the decoding should be performed

Definition at line 762 of file utils.c.

763{
764 char *o;
765 unsigned int tmp;
766
767 for (o = s; *s; s++, o++) {
768 if (ast_test_flag(&spec, AST_URI_LEGACY_SPACE) && *s == '+') {
769 /* legacy mode, decode '+' as space */
770 *o = ' ';
771 } else if (*s == '%' && s[1] != '\0' && s[2] != '\0' && sscanf(s + 1, "%2x", &tmp) == 1) {
772 /* have '%', two chars and correct parsing */
773 *o = tmp;
774 s += 2; /* Will be incremented once more when we break out */
775 } else /* all other cases, just copy */
776 *o = *s;
777 }
778 *o = '\0';
779}
#define ast_test_flag(p, flag)
Definition: utils.h:63
#define AST_URI_LEGACY_SPACE
Definition: utils.h:367

References ast_test_flag, AST_URI_LEGACY_SPACE, and tmp().

Referenced by acf_curl_helper(), ast_ari_invoke(), ast_http_get_post_vars(), AST_TEST_DEFINE(), config_curl(), handle_uri(), realtime_curl(), realtime_multi_curl(), and uridecode().

◆ ast_uri_encode()

char * ast_uri_encode ( const char *  string,
char *  outbuf,
int  buflen,
struct ast_flags  spec 
)

Turn text string to URI-encoded XX version.

This function encodes characters according to the rules presented in RFC 2396 and/or RFC 3261 section 19.1.2 and section 25.1.

Outbuf needs to have more memory allocated than the instring to have room for the expansion. Every byte that is converted is replaced by three ASCII characters.

Parameters
stringstring to be converted
outbufresulting encoded string
buflensize of output buffer
specflags describing how the encoding should be performed
Returns
a pointer to the uri encoded string

Definition at line 723 of file utils.c.

724{
725 const char *ptr = string; /* Start with the string */
726 char *out = outbuf;
727 const char *mark = "-_.!~*'()"; /* no encode set, RFC 2396 section 2.3, RFC 3261 sec 25 */
728 const char *user_unreserved = "&=+$,;?/"; /* user-unreserved set, RFC 3261 sec 25 */
729
730 while (*ptr && out - outbuf < buflen - 1) {
731 if (ast_test_flag(&spec, AST_URI_LEGACY_SPACE) && *ptr == ' ') {
732 /* for legacy encoding, encode spaces as '+' */
733 *out = '+';
734 out++;
735 } else if (!(ast_test_flag(&spec, AST_URI_MARK)
736 && strchr(mark, *ptr))
738 && ((*ptr >= '0' && *ptr <= '9')
739 || (*ptr >= 'A' && *ptr <= 'Z')
740 || (*ptr >= 'a' && *ptr <= 'z')))
742 && strchr(user_unreserved, *ptr))) {
743
744 if (out - outbuf >= buflen - 3) {
745 break;
746 }
747 out += sprintf(out, "%%%02hhX", (unsigned char) *ptr);
748 } else {
749 *out = *ptr; /* Continue copying the string */
750 out++;
751 }
752 ptr++;
753 }
754
755 if (buflen) {
756 *out = '\0';
757 }
758
759 return outbuf;
760}
#define AST_URI_MARK
Definition: utils.h:365
#define AST_URI_SIP_USER_UNRESERVED
Definition: utils.h:369
#define AST_URI_ALPHANUM
Definition: utils.h:364

References ast_test_flag, AST_URI_ALPHANUM, AST_URI_LEGACY_SPACE, AST_URI_MARK, AST_URI_SIP_USER_UNRESERVED, out, and string.

Referenced by ast_ari_bridges_record(), ast_ari_channels_record(), AST_TEST_DEFINE(), config_curl(), destroy_curl(), launch_asyncagi(), realtime_curl(), realtime_multi_curl(), require_curl(), store_curl(), update2_curl(), update_curl(), and uriencode().

◆ ast_utils_init()

int ast_utils_init ( void  )

Definition at line 2617 of file utils.c.

2618{
2619 dev_urandom_fd = open("/dev/urandom", O_RDONLY);
2620 base64_init();
2621#ifdef DEBUG_THREADS
2622#if !defined(LOW_MEMORY)
2623 ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli));
2624#endif
2625#endif
2627 return 0;
2628}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static void utils_shutdown(void)
Definition: utils.c:2608
static void base64_init(void)
Definition: utils.c:540
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), base64_init(), dev_urandom_fd, and utils_shutdown().

Referenced by asterisk_daemon().

◆ ast_utils_which()

char * ast_utils_which ( const char *  binary,
char *  fullpath,
size_t  fullpath_size 
)

Resolve a binary to a full pathname.

Parameters
binaryName of the executable to resolve
fullpathBuffer to hold the complete pathname
fullpath_sizeSize of fullpath
Return values
NULLbinary was not found or the environment variable PATH is not set
Returns
fullpath

Definition at line 2774 of file utils.c.

2775{
2776 const char *envPATH = getenv("PATH");
2777 char *tpath, *path;
2778 struct stat unused;
2779 if (!envPATH) {
2780 return NULL;
2781 }
2782 tpath = ast_strdupa(envPATH);
2783 while ((path = strsep(&tpath, ":"))) {
2784 snprintf(fullpath, fullpath_size, "%s/%s", path, binary);
2785 if (!stat(fullpath, &unused)) {
2786 return fullpath;
2787 }
2788 }
2789 return NULL;
2790}

References ast_strdupa, NULL, and strsep().

◆ ast_wait_for_input()

int ast_wait_for_input ( int  fd,
int  ms 
)

Definition at line 1698 of file utils.c.

1699{
1700 struct pollfd pfd[1];
1701
1702 memset(pfd, 0, sizeof(pfd));
1703 pfd[0].fd = fd;
1704 pfd[0].events = POLLIN | POLLPRI;
1705 return ast_poll(pfd, 1, ms);
1706}
#define ast_poll(a, b, c)
Definition: poll-compat.h:88

References ast_poll.

Referenced by action_waitevent(), ast_ari_websocket_session_read(), ast_iostream_wait_for_input(), ast_iostream_write(), ast_tcptls_server_root(), dahdi_test_timer(), get_input(), iostream_read(), moh_class_destructor(), and unbound_resolver_thread().

◆ ast_wait_for_output()

int ast_wait_for_output ( int  fd,
int  ms 
)

Definition at line 1708 of file utils.c.

1709{
1710 struct pollfd pfd[1];
1711
1712 memset(pfd, 0, sizeof(pfd));
1713 pfd[0].fd = fd;
1714 pfd[0].events = POLLOUT;
1715 return ast_poll(pfd, 1, ms);
1716}

References ast_poll.

Referenced by ast_iostream_write(), iostream_read(), and socket_connect().

◆ ast_xml_escape()

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.

Parameters
stringString to be converted
outbufResulting encoded string
buflenSize of output buffer
Return values
0for success
-1if buflen is too short.

Definition at line 864 of file utils.c.

865{
866 char *dst = outbuf;
867 char *end = outbuf + buflen - 1; /* save one for the null terminator */
868
869 /* Handle the case for the empty output buffer */
870 if (buflen == 0) {
871 return -1;
872 }
873
874 /* Escaping rules from http://www.w3.org/TR/REC-xml/#syntax */
875 /* This also prevents partial entities at the end of a string */
876 while (*string && dst < end) {
877 const char *entity = NULL;
878 int len = 0;
879
880 switch (*string) {
881 case '<':
882 entity = "&lt;";
883 len = 4;
884 break;
885 case '&':
886 entity = "&amp;";
887 len = 5;
888 break;
889 case '>':
890 /* necessary if ]]> is in the string; easier to escape them all */
891 entity = "&gt;";
892 len = 4;
893 break;
894 case '\'':
895 /* necessary in single-quoted strings; easier to escape them all */
896 entity = "&apos;";
897 len = 6;
898 break;
899 case '"':
900 /* necessary in double-quoted strings; easier to escape them all */
901 entity = "&quot;";
902 len = 6;
903 break;
904 default:
905 *dst++ = *string++;
906 break;
907 }
908
909 if (entity) {
910 ast_assert(len == strlen(entity));
911 if (end - dst < len) {
912 /* no room for the entity; stop */
913 break;
914 }
915 /* just checked for length; strcpy is fine */
916 strcpy(dst, entity);
917 dst += len;
918 ++string;
919 }
920 }
921 /* Write null terminator */
922 *dst = '\0';
923 /* If any chars are left in string, return failure */
924 return *string == '\0' ? 0 : -1;
925}
char * end
Definition: eagi_proxy.c:73

References ast_assert, end, len(), NULL, and string.

Referenced by ast_http_create_response(), and test_xml().

Variable Documentation

◆ __unsigned_int_flags_dummy

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

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

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

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

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

◆ __unsigned_int_flags_dummy64

uint64_t __unsigned_int_flags_dummy64
extern

◆ ast_eid_default

struct ast_eid ast_eid_default
extern

◆ ast_uri_http

const struct ast_flags ast_uri_http
extern

◆ ast_uri_http_legacy

const struct ast_flags ast_uri_http_legacy
extern

◆ ast_uri_sip_user

const struct ast_flags ast_uri_sip_user
extern

Definition at line 721 of file utils.c.

Referenced by AST_TEST_DEFINE().