Asterisk - The Open Source Telephony Project GIT-master-773870a
Loading...
Searching...
No Matches
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 <endian.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.
 
#define ARRAY_LEN(a)   (size_t) (sizeof(a) / sizeof(0[a]))
 
#define ast_align_for(offset, type)   (((offset + __alignof__(type) - 1) / __alignof__(type)) * __alignof__(type))
 Increase offset so it is a multiple of the required alignment of type.
 
#define ast_alignof(type)   __alignof__(type)
 Return the number of bytes used in the alignment of type.
 
#define ast_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.
 
#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.
 
#define AST_FLAGS64_ALL   ULONG_MAX
 
#define AST_FLAGS_ALL   UINT_MAX
 
#define ast_make_room_for(offset, type)   (((offset + (2 * __alignof__(type) - 1)) / __alignof__(type)) * __alignof__(type))
 Increase offset by the required alignment of type and make sure it is a multiple of said alignment.
 
#define ast_pipe_nonblock(filedes)   pipe2((filedes), O_NONBLOCK)
 Create a non-blocking pipe.
 
#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.
 
#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.
 
#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.
 
#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.
 
#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.
 
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.
 
int ast_base64decode (unsigned char *dst, const char *src, int max)
 Decode data from base64.
 
char * ast_base64decode_string (const char *src)
 Same as ast_base64decode, but does the math for you and returns a decoded string.
 
int ast_base64encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64.
 
int ast_base64encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
 encode text to BASE64 coding
 
char * ast_base64encode_string (const char *src)
 Same as ast_base64encode, but does hte math for you and returns an encoded string.
 
int ast_base64url_decode (unsigned char *dst, const char *src, int max)
 Decode data from base64 URL.
 
char * ast_base64url_decode_string (const char *src)
 Decode string from base64 URL.
 
int ast_base64url_encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64 URL.
 
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.
 
char * ast_base64url_encode_string (const char *src)
 Encode string in base64 URL.
 
int ast_careful_fwrite (FILE *f, int fd, const char *s, size_t len, int timeoutms)
 Write data to a file stream with a timeout.
 
int ast_carefulwrite (int fd, char *s, int len, int timeoutms)
 Try to write string, but wait no more than ms milliseconds before timing out.
 
int ast_check_command_in_path (const char *cmd)
 Test for the presence of an executable command in $PATH.
 
int ast_check_ipv6 (void)
 Test that an OS supports IPv6 Networking.
 
int ast_compare_versions (const char *version1, const char *version2)
 Compare 2 major.minor.patch.extra version strings.
 
char * ast_crypt (const char *key, const char *salt)
 Asterisk wrapper around crypt(3).
 
char * ast_crypt_encrypt (const char *key)
 Asterisk wrapper around crypt(3) for encrypting passwords.
 
int ast_crypt_validate (const char *key, const char *expected)
 Asterisk wrapper around crypt(3) for validating passwords.
 
void DO_CRASH_NORETURN ast_do_crash (void)
 Force a crash if DO_CRASH is defined.
 
int ast_eid_cmp (const struct ast_eid *eid1, const struct ast_eid *eid2)
 Compare two EIDs.
 
int ast_eid_is_empty (const struct ast_eid *eid)
 Check if EID is empty.
 
char * ast_eid_to_str (char *s, int maxlen, struct ast_eid *eid)
 Convert an EID to a string.
 
void ast_enable_packet_fragmentation (int sock)
 Disable PMTU discovery on a socket.
 
char * ast_escape_quoted (const char *string, char *outbuf, int buflen)
 Escape characters found in a quoted string.
 
char * ast_escape_semicolons (const char *string, char *outbuf, int buflen)
 Escape semicolons found in a string.
 
int ast_file_is_readable (const char *filename)
 Test that a file exists and is readable by the effective user.
 
int ast_get_tid (void)
 Get current thread ID.
 
struct hostent * ast_gethostbyname (const char *host, struct ast_hostent *hp)
 Thread-safe gethostbyname function to use in Asterisk.
 
void ast_md5_hash (char *output, const char *input)
 Produces MD5 hash based on input string.
 
int ast_mkdir (const char *path, int mode)
 Recursively create directory path.
 
int ast_parse_digest (const char *digest, struct ast_http_digest *d, int request, int pedantic)
 Parse digest authorization header.
 
char * ast_process_quotes_and_slashes (char *start, char find, char replace_with)
 Process a string to find and replace characters.
 
int ast_pthread_create_detached_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn)
 
int ast_pthread_create_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn)
 
long int ast_random (void)
 
void ast_register_thread (char *name)
 
void ast_replace_subargument_delimiter (char *s)
 Replace '^' in a string with ','.
 
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.
 
void ast_set_default_eid (struct ast_eid *eid)
 Fill in an ast_eid with the default eid of this machine.
 
void ast_sha1_hash (char *output, const char *input)
 Produces SHA1 hash based on input string.
 
void ast_sha1_hash_uint (uint8_t *digest, const char *input)
 Produces SHA1 hash based on input string, stored in uint8_t array.
 
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.
 
int ast_thread_is_user_interface (void)
 Indicates whether the current thread is a user interface.
 
int ast_thread_user_interface_set (int is_user_interface)
 Set the current thread's user interface status.
 
void ast_unescape_quoted (char *quote_str)
 Unescape quotes in a string.
 
void ast_unregister_thread (void *id)
 
void ast_uri_decode (char *s, struct ast_flags spec)
 Decode URI, URN, URL (overwrite string)
 
char * ast_uri_encode (const char *string, char *outbuf, int buflen, struct ast_flags spec)
 Turn text string to URI-encoded XX version.
 
int ast_uri_verify_encoded (const char *string)
 Verify if a string is valid as a URI component.
 
int ast_utils_init (void)
 
char * ast_utils_which (const char *binary, char *fullpath, size_t fullpath_size)
 Resolve a binary to a full pathname.
 
int ast_wait_for_input (int fd, int ms)
 
int ast_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.
 

Variables

unsigned int __unsigned_int_flags_dummy
 
uint64_t __unsigned_int_flags_dummy64
 Swap the upper and lower 32 bits of a big-endian 64-bit integer.
 
struct ast_eid ast_eid_default
 Global EID.
 
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 727 of file utils.h.

◆ ARRAY_LEN

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

Definition at line 706 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 825 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 805 of file utils.h.

◆ ast_assert

#define ast_assert (   a)

Definition at line 779 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 780 of file utils.h.

781 { \
782 if (__builtin_expect(!(a), 1)) { \
783 return __VA_ARGS__; \
784 }\
785})

◆ AST_BACKGROUND_STACKSIZE

#define AST_BACKGROUND_STACKSIZE   ast_background_stacksize()

Definition at line 611 of file utils.h.

◆ ast_clear_flag

#define ast_clear_flag (   p,
  flag 
)

Definition at line 78 of file utils.h.

78 { \
79 typeof ((p)->flags) __p = (p)->flags; \
80 typeof (__unsigned_int_flags_dummy) __x = 0; \
81 (void) (&__p == &__x); \
82 ((p)->flags &= ~(flag)); \
83 } while(0)
long int flag
Definition f2c.h:83
unsigned int __unsigned_int_flags_dummy

◆ ast_clear_flag64

#define ast_clear_flag64 (   p,
  flag 
)

Definition at line 154 of file utils.h.

154 { \
155 typeof ((p)->flags) __p = (p)->flags; \
156 typeof (__unsigned_int_flags_dummy64) __x = 0; \
157 (void) (&__p == &__x); \
158 ((p)->flags &= ~SWAP64_32(flag)); \
159 } while(0)
#define SWAP64_32(flags)
Definition extconf.c:678
uint64_t __unsigned_int_flags_dummy64
Swap the upper and lower 32 bits of a big-endian 64-bit integer.

◆ ast_clear_flag_nonstd

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

Definition at line 201 of file utils.h.

201 { \
202 ((p)->flags &= ~(flag)); \
203 } while(0)

◆ ast_copy_flags

#define ast_copy_flags (   dest,
  src,
  flagz 
)

Definition at line 85 of file utils.h.

85 { \
86 typeof ((dest)->flags) __d = (dest)->flags; \
87 typeof ((src)->flags) __s = (src)->flags; \
88 typeof (__unsigned_int_flags_dummy) __x = 0; \
89 (void) (&__d == &__x); \
90 (void) (&__s == &__x); \
91 (dest)->flags &= ~(flagz); \
92 (dest)->flags |= ((src)->flags & (flagz)); \
93 } while (0)

◆ ast_copy_flags64

#define ast_copy_flags64 (   dest,
  src,
  flagz 
)

Definition at line 161 of file utils.h.

161 { \
162 typeof ((dest)->flags) __d = (dest)->flags; \
163 typeof ((src)->flags) __s = (src)->flags; \
164 typeof (__unsigned_int_flags_dummy64) __x = 0; \
165 (void) (&__d == &__x); \
166 (void) (&__s == &__x); \
167 (dest)->flags &= ~SWAP64_32(flagz); \
168 (dest)->flags |= ((src)->flags & SWAP64_32(flagz)); \
169 } while (0)

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

205 { \
206 (dest)->flags &= ~(flagz); \
207 (dest)->flags |= ((src)->flags & (flagz)); \
208 } while (0)

◆ 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 1095 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 1079 of file utils.h.

◆ AST_FLAGS64_ALL

#define AST_FLAGS64_ALL   ULONG_MAX

Definition at line 189 of file utils.h.

◆ AST_FLAGS_ALL

#define AST_FLAGS_ALL   UINT_MAX

Definition at line 217 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 848 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 1130 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:1659

Definition at line 624 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:611

Definition at line 632 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:1707

Definition at line 628 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 637 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 664 of file utils.h.

◆ ast_set2_flag

#define ast_set2_flag (   p,
  value,
  flag 
)

Definition at line 95 of file utils.h.

95 { \
96 typeof ((p)->flags) __p = (p)->flags; \
97 typeof (__unsigned_int_flags_dummy) __x = 0; \
98 (void) (&__p == &__x); \
99 if (value) \
100 (p)->flags |= (flag); \
101 else \
102 (p)->flags &= ~(flag); \
103 } while (0)
int value
Definition syslog.c:37

◆ ast_set2_flag64

#define ast_set2_flag64 (   p,
  value,
  flag 
)

Definition at line 171 of file utils.h.

171 { \
172 typeof ((p)->flags) __p = (p)->flags; \
173 typeof (__unsigned_int_flags_dummy64) __x = 0; \
174 (void) (&__p == &__x); \
175 if (value) \
176 (p)->flags |= SWAP64_32(flag); \
177 else \
178 (p)->flags &= ~SWAP64_32(flag); \
179 } while (0)

◆ ast_set2_flag_nonstd

#define ast_set2_flag_nonstd (   p,
  value,
  flag 
)

Definition at line 210 of file utils.h.

210 { \
211 if (value) \
212 (p)->flags |= (flag); \
213 else \
214 (p)->flags &= ~(flag); \
215 } while (0)

◆ ast_set_flag

#define ast_set_flag (   p,
  flag 
)

Definition at line 71 of file utils.h.

71 { \
72 typeof ((p)->flags) __p = (p)->flags; \
73 typeof (__unsigned_int_flags_dummy) __x = 0; \
74 (void) (&__p == &__x); \
75 ((p)->flags |= (flag)); \
76 } while(0)

◆ ast_set_flag64

#define ast_set_flag64 (   p,
  flag 
)

Definition at line 147 of file utils.h.

147 { \
148 typeof ((p)->flags) __p = (p)->flags; \
149 typeof (__unsigned_int_flags_dummy64) __x = 0; \
150 (void) (&__p == &__x); \
151 ((p)->flags |= SWAP64_32(flag)); \
152 } while(0)

◆ ast_set_flag_nonstd

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

Definition at line 197 of file utils.h.

197 { \
198 ((p)->flags |= (flag)); \
199 } while(0)

◆ ast_set_flags_to

#define ast_set_flags_to (   p,
  flag,
  value 
)

Definition at line 105 of file utils.h.

105 { \
106 typeof ((p)->flags) __p = (p)->flags; \
107 typeof (__unsigned_int_flags_dummy) __x = 0; \
108 (void) (&__p == &__x); \
109 (p)->flags &= ~(flag); \
110 (p)->flags |= (value); \
111 } while (0)

◆ ast_set_flags_to64

#define ast_set_flags_to64 (   p,
  flag,
  value 
)

Definition at line 181 of file utils.h.

181 { \
182 typeof ((p)->flags) __p = (p)->flags; \
183 typeof (__unsigned_int_flags_dummy64) __x = 0; \
184 (void) (&__p == &__x); \
185 (p)->flags &= ~SWAP64_32(flag); \
186 (p)->flags |= SWAP64_32(value); \
187 } while (0)

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

◆ AST_STACKSIZE

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

Definition at line 605 of file utils.h.

◆ AST_STACKSIZE_LOW

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

Definition at line 606 of file utils.h.

◆ ast_test_flag

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

Definition at line 64 of file utils.h.

64 { \
65 typeof ((p)->flags) __p = (p)->flags; \
66 typeof (__unsigned_int_flags_dummy) __x = 0; \
67 (void) (&__p == &__x); \
68 ((p)->flags & (flag)); \
69 })

◆ ast_test_flag64

#define ast_test_flag64 (   p,
  flag 
)

Definition at line 140 of file utils.h.

140 { \
141 typeof ((p)->flags) __p = (p)->flags; \
142 typeof (__unsigned_int_flags_dummy64) __x = 0; \
143 (void) (&__p == &__x); \
144 ((p)->flags & SWAP64_32(flag)); \
145 })

◆ ast_test_flag_nonstd

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

Definition at line 194 of file utils.h.

◆ AST_URI_ALPHANUM

#define AST_URI_ALPHANUM   (1 << 0)

Definition at line 385 of file utils.h.

◆ AST_URI_LEGACY_SPACE

#define AST_URI_LEGACY_SPACE   (1 << 2)

Definition at line 388 of file utils.h.

◆ AST_URI_MARK

#define AST_URI_MARK   (1 << 1)

Definition at line 386 of file utils.h.

◆ AST_URI_SIP_USER_UNRESERVED

#define AST_URI_SIP_USER_UNRESERVED   (1 << 20)

Definition at line 390 of file utils.h.

◆ AST_URI_UNRESERVED

#define AST_URI_UNRESERVED   (AST_URI_ALPHANUM | AST_URI_MARK)

Definition at line 387 of file utils.h.

◆ DO_CRASH_NORETURN

#define DO_CRASH_NORETURN

Definition at line 757 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 717 of file utils.h.

◆ localtime_r

#define localtime_r   __dont_use_localtime_r_use_ast_localtime_instead__

Definition at line 561 of file utils.h.

◆ MAX

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

Definition at line 254 of file utils.h.

◆ MIN

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

Definition at line 252 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)
Clean up any old apps that we don't need any more.
Definition res_stasis.c:327

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:981
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
Examples
app_skel.c.

Definition at line 981 of file utils.h.

983 { dtor(*v); } \
984 vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)

◆ SWAP

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

Definition at line 256 of file utils.h.

Enumeration Type Documentation

◆ ast_fd_flag_operation

Enumerator
AST_FD_FLAG_SET 
AST_FD_FLAG_CLEAR 

Definition at line 1061 of file utils.h.

1061 {
1064};
@ AST_FD_FLAG_SET
Definition utils.h:1062
@ AST_FD_FLAG_CLEAR
Definition utils.h:1063

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

2851{
2852 /*
2853 * Attempt to put it into the logger, but hope that at least
2854 * someone saw the message on stderr ...
2855 */
2856 fprintf(stderr, "FRACK!, Failed assertion %s (%d) at line %d in %s of %s\n",
2857 condition_str, condition, line, function, file);
2858 ast_log(__LOG_ERROR, file, line, function, "FRACK!, Failed assertion %s (%d)\n",
2859 condition_str, condition);
2860
2861 /* Generate a backtrace for the assert */
2863
2864 /*
2865 * Give the logger a chance to get the message out, just in case
2866 * we abort(), or Asterisk crashes due to whatever problem just
2867 * happened after we exit ast_assert().
2868 */
2869 usleep(1);
2870 ast_do_crash();
2871}
#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:2480
void DO_CRASH_NORETURN ast_do_crash(void)
Force a crash if DO_CRASH is defined.
Definition utils.c:2838

References __LOG_ERROR, ast_do_crash(), ast_log, and ast_log_backtrace().

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

3186{
3187 int f;
3188
3189 f = fcntl(fd, F_GETFL);
3190 if (f == -1) {
3191 ast_log(__LOG_ERROR, file, lineno, function,
3192 "Failed to get fcntl() flags for file descriptor: %s\n", strerror(errno));
3193 return -1;
3194 }
3195
3196 switch (op) {
3197 case AST_FD_FLAG_SET:
3198 if ((f & flags) == flags) {
3199 /* There is nothing to set */
3200 return 0;
3201 }
3202 f |= flags;
3203 break;
3204 case AST_FD_FLAG_CLEAR:
3205 if (!(f & flags)) {
3206 /* There is nothing to clear */
3207 return 0;
3208 }
3209 f &= ~flags;
3210 break;
3211 default:
3212 ast_assert(0);
3213 break;
3214 }
3215
3216 f = fcntl(fd, F_SETFL, f);
3217 if (f == -1) {
3218 ast_log(__LOG_ERROR, file, lineno, function,
3219 "Failed to set fcntl() flags for file descriptor: %s\n", strerror(errno));
3220 return -1;
3221 }
3222
3223 return 0;
3224}
int errno
#define ast_assert(a)
Definition utils.h:779

References __LOG_ERROR, ast_assert, AST_FD_FLAG_CLEAR, AST_FD_FLAG_SET, ast_log, and errno.

◆ ast_background_stacksize()

int ast_background_stacksize ( void  )

Definition at line 1650 of file utils.c.

1651{
1652#if !defined(LOW_MEMORY)
1653 return AST_STACKSIZE;
1654#else
1655 return AST_STACKSIZE_LOW;
1656#endif
1657}
#define AST_STACKSIZE
Definition utils.h:605
#define AST_STACKSIZE_LOW
Definition utils.h:606

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

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

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

701{
702 FILE *fi;
703 int res;
704
705 if (!(fi = fopen(filename, "rb"))) {
706 ast_log(AST_LOG_WARNING, "Failed to open file: %s: %s\n", filename, strerror(errno));
707 return -1;
708 }
709
710 res = ast_base64_encode_file(fi, outputfile, endl);
711
712 fclose(fi);
713
714 return res;
715}
#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:646

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 while(*src && *src != '=' && (cnt < max)) {
302 /* Shift in 6 bits of input */
303 byte <<= 6;
304 byte |= (b2a[(int)(*src)]) & 0x3f;
305 bits += 6;
306 src++;
307 /* If we have at least 8 bits left over, take that character
308 off the top */
309 if (bits >= 8) {
310 bits -= 8;
311 *dst = (byte >> bits) & 0xff;
312 dst++;
313 cnt++;
314 }
315 }
316 /* Don't worry about left over bits, they're extra anyway */
317 return cnt;
318}
#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 321 of file utils.c.

322{
323 size_t encoded_len;
324 size_t decoded_len;
325 int padding = 0;
326 unsigned char *decoded_string;
327
328 if (ast_strlen_zero(src)) {
329 return NULL;
330 }
331
332 encoded_len = strlen(src);
333 if (encoded_len > 2 && src[encoded_len - 1] == '=') {
334 padding++;
335 if (src[encoded_len - 2] == '=') {
336 padding++;
337 }
338 }
339
340 decoded_len = (encoded_len / 4 * 3) - padding;
341 decoded_string = ast_malloc(decoded_len + 1);
342 if (!decoded_string) {
343 return NULL;
344 }
345
346 ast_base64decode(decoded_string, src, decoded_len);
347 decoded_string[decoded_len] = '\0';
348
349 return (char *)decoded_string;
350}
#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 404 of file utils.c.

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

References ast_base64encode_full(), and max.

Referenced by aes_helper(), ast_base64encode_string(), ast_http_create_basic_auth_header(), 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 353 of file utils.c.

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

411{
412 size_t encoded_len;
413 char *encoded_string;
414
415 if (ast_strlen_zero(src)) {
416 return NULL;
417 }
418
419 encoded_len = ((strlen(src) * 4 / 3 + 3) & ~3) + 1;
420 encoded_string = ast_calloc(1, encoded_len);
421
422 ast_base64encode(encoded_string, (const unsigned char *)src, strlen(src), encoded_len);
423
424 return encoded_string;
425}
#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:404

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

428{
429 int cnt = 0;
430 unsigned int byte = 0;
431 unsigned int bits = 0;
432
433 while (*src && (cnt < max)) {
434 byte <<= 6;
435 byte |= (b2a_url[(int)(*src)]) & 0x3f;
436 bits += 6;
437 src++;
438 if (bits >= 8) {
439 bits -= 8;
440 *dst = (byte >> bits) & 0xff;
441 dst++;
442 cnt++;
443 }
444 }
445 return cnt;
446}
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 448 of file utils.c.

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

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

517{
518 return ast_base64url_encode_full(dst, src, srclen, max, 0);
519}
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:469

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

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

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

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

1806{
1807 struct timeval start = ast_tvnow();
1808 int res = 0;
1809 int elapsed = 0;
1810
1811 while (len) {
1812 if (wait_for_output(fd, timeoutms - elapsed)) {
1813 return -1;
1814 }
1815
1816 res = write(fd, s, len);
1817
1818 if (res < 0 && errno != EAGAIN && errno != EINTR) {
1819 /* fatal error from write() */
1820 if (errno == EPIPE) {
1821#ifndef STANDALONE
1822 ast_debug(1, "write() failed due to reading end being closed: %s\n", strerror(errno));
1823#endif
1824 } else {
1825 ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno));
1826 }
1827 return -1;
1828 }
1829
1830 if (res < 0) {
1831 /* It was an acceptable error */
1832 res = 0;
1833 }
1834
1835 /* Update how much data we have left to write */
1836 len -= res;
1837 s += res;
1838 res = 0;
1839
1840 elapsed = ast_tvdiff_ms(ast_tvnow(), start);
1841 if (elapsed >= timeoutms) {
1842 /* We've taken too long to write
1843 * This is only an error condition if we haven't finished writing. */
1844 res = len ? -1 : 0;
1845 break;
1846 }
1847 }
1848
1849 return res;
1850}
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:1752

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

3298{
3299 char *token, *saveptr, *path = getenv("PATH");
3300 char filename[PATH_MAX];
3301 int len;
3302
3303 if (path == NULL) {
3304 return 0;
3305 }
3306
3307 path = ast_strdup(path);
3308 if (path == NULL) {
3309 return 0;
3310 }
3311
3312 token = strtok_r(path, ":", &saveptr);
3313 while (token != NULL) {
3314 len = snprintf(filename, sizeof(filename), "%s/%s", token, cmd);
3315 if (len < 0 || len >= sizeof(filename)) {
3316 ast_log(LOG_WARNING, "Path constructed with '%s' too long; skipping\n", token);
3317 continue;
3318 }
3319
3320 if (access(filename, X_OK) == 0) {
3321 ast_free(path);
3322 return 1;
3323 }
3324
3325 token = strtok_r(NULL, ":", &saveptr);
3326 }
3327 ast_free(path);
3328 return 0;
3329}
#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_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), and 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 2826 of file utils.c.

2827{
2828 int udp6_socket = socket(AF_INET6, SOCK_DGRAM, 0);
2829
2830 if (udp6_socket < 0) {
2831 return 0;
2832 }
2833
2834 close(udp6_socket);
2835 return 1;
2836}

Referenced by load_module(), and 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 3158 of file utils.c.

3159{
3160 unsigned int major[2] = { 0 };
3161 unsigned int minor[2] = { 0 };
3162 unsigned int patch[2] = { 0 };
3163 unsigned int extra[2] = { 0 };
3164 int res;
3165
3166 sscanf(version1, "%u.%u.%u.%u", &major[0], &minor[0], &patch[0], &extra[0]);
3167 sscanf(version2, "%u.%u.%u.%u", &major[1], &minor[1], &patch[1], &extra[1]);
3168
3169 res = major[0] - major[1];
3170 if (res) {
3171 return res;
3172 }
3173 res = minor[0] - minor[1];
3174 if (res) {
3175 return res;
3176 }
3177 res = patch[0] - patch[1];
3178 if (res) {
3179 return res;
3180 }
3181 return extra[0] - extra[1];
3182}

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

2839{
2840#if defined(DO_CRASH)
2841 abort();
2842 /*
2843 * Just in case abort() doesn't work or something else super
2844 * silly, and for Qwell's amusement.
2845 */
2846 *((int *) 0) = 0;
2847#endif /* defined(DO_CRASH) */
2848}

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

3134{
3135 struct ast_eid empty_eid;
3136
3137 memset(&empty_eid, 0, sizeof(empty_eid));
3138 return memcmp(eid, &empty_eid, sizeof(empty_eid)) ? 0 : 1;
3139}
static dundi_eid empty_eid
Definition pbx_dundi.c:223
An Entity ID is essentially a MAC address, brief and unique.
Definition utils.h:853
unsigned char eid[6]
Definition utils.h:854

References ast_eid::eid, and empty_eid.

Referenced by load_module(), load_module(), 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 2873 of file utils.c.

2874{
2875 int x;
2876 char *os = s;
2877 if (maxlen < 18) {
2878 if (s && (maxlen > 0)) {
2879 *s = '\0';
2880 }
2881 } else {
2882 for (x = 0; x < 5; x++) {
2883 sprintf(s, "%02hhx:", eid->eid[x]);
2884 s += 3;
2885 }
2886 sprintf(s, "%02hhx", eid->eid[5]);
2887 }
2888 return os;
2889}

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(), session_send_app_event(), session_send_or_queue(), 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 2503 of file utils.c.

2504{
2505#if defined(HAVE_IP_MTU_DISCOVER)
2506 int val = IP_PMTUDISC_DONT;
2507
2508 if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
2509 ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
2510#endif /* HAVE_IP_MTU_DISCOVER */
2511}

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

816{
817 const char *ptr = string;
818 char *out = outbuf;
819 char *allow = "\t\v !"; /* allow LWS (minus \r and \n) and "!" */
820
821 while (*ptr && out - outbuf < buflen - 1) {
822 if (!(strchr(allow, *ptr))
823 && !(*ptr >= '#' && *ptr <= '[') /* %x23 - %x5b */
824 && !(*ptr >= ']' && *ptr <= '~') /* %x5d - %x7e */
825 && !((unsigned char) *ptr > 0x7f)) { /* UTF8-nonascii */
826
827 if (out - outbuf >= buflen - 2) {
828 break;
829 }
830 out += sprintf(out, "\\%c", (unsigned char) *ptr);
831 } else {
832 *out = *ptr;
833 out++;
834 }
835 ptr++;
836 }
837
838 if (buflen) {
839 *out = '\0';
840 }
841
842 return outbuf;
843}
const char * string
FILE * out
Definition utils/frame.c:33

References out, and string.

Referenced by ast_callerid_merge(), ast_sip_modify_id_header(), AST_TEST_DEFINE(), 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 845 of file utils.c.

846{
847 const char *ptr = string;
848 char *out = outbuf;
849
850 if (string == NULL || outbuf == NULL) {
851 ast_assert(string != NULL && outbuf != NULL);
852 return NULL;
853 }
854
855 while (*ptr && out - outbuf < buflen - 1) {
856 if (*ptr == ';') {
857 if (out - outbuf >= buflen - 2) {
858 break;
859 }
860 strcpy(out, "\\;");
861 out += 2;
862 } else {
863 *out = *ptr;
864 out++;
865 }
866 ptr++;
867 }
868
869 if (buflen) {
870 *out = '\0';
871 }
872
873 return outbuf;
874}

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

3142{
3143#if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
3144#if defined(HAVE_EUIDACCESS) && !defined(HAVE_EACCESS)
3145#define eaccess euidaccess
3146#endif
3147 return eaccess(filename, R_OK) == 0;
3148#else
3149 int fd = open(filename, O_RDONLY | O_NONBLOCK);
3150 if (fd < 0) {
3151 return 0;
3152 }
3153 close(fd);
3154 return 1;
3155#endif
3156}
#define R_OK

References R_OK.

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

2787{
2788 int ret = -1;
2789#if defined (__linux) && defined(SYS_gettid)
2790 ret = syscall(SYS_gettid); /* available since Linux 1.4.11 */
2791#elif defined(__sun)
2792 ret = pthread_self();
2793#elif defined(__APPLE__)
2794 ret = mach_thread_self();
2795 mach_port_deallocate(mach_task_self(), ret);
2796#elif defined(__FreeBSD__)
2797 long lwpid;
2798 thr_self(&lwpid);
2799 ret = lwpid;
2800#elif defined(__NetBSD__)
2801 ret = _lwp_self();
2802#elif defined(__OpenBSD__)
2803 ret = getthrid();
2804#endif
2805 return ret;
2806}

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:231
struct hostent hp
Definition utils.h:230

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 md5(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_md5.c:55
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[MD5_DIGEST_LENGTH], struct MD5Context *context)
Definition md5.c:120

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

2514{
2515 char *ptr;
2516 int len = strlen(path), count = 0, x, piececount = 0;
2517 char *tmp = ast_strdupa(path);
2518 char **pieces;
2519 char *fullpath = ast_alloca(len + 1);
2520 int res = 0;
2521
2522 for (ptr = tmp; *ptr; ptr++) {
2523 if (*ptr == '/')
2524 count++;
2525 }
2526
2527 /* Count the components to the directory path */
2528 pieces = ast_alloca(count * sizeof(*pieces));
2529 for (ptr = tmp; *ptr; ptr++) {
2530 if (*ptr == '/') {
2531 *ptr = '\0';
2532 pieces[piececount++] = ptr + 1;
2533 }
2534 }
2535
2536 *fullpath = '\0';
2537 for (x = 0; x < piececount; x++) {
2538 /* This looks funky, but the buffer is always ideally-sized, so it's fine. */
2539 strcat(fullpath, "/");
2540 strcat(fullpath, pieces[x]);
2541 res = mkdir(fullpath, mode);
2542 if (res && errno != EEXIST)
2543 return errno;
2544 }
2545 return 0;
2546}
#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

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

Referenced by ast_file_fdtemp(), ast_logger_rotate_channel(), conf_rec_name(), conf_run(), create_destination_directory(), create_dirpath(), create_dirpath(), dictate_exec(), filename_parse(), 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 response 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 2672 of file utils.c.

2672 {
2673 char *c;
2674 struct ast_str *str = ast_str_create(16);
2675
2676 /* table of recognised keywords, and places where they should be copied */
2677 const struct x {
2678 const char *key;
2679 const ast_string_field *field;
2680 } *i, keys[] = {
2681 { "username=", &d->username },
2682 { "realm=", &d->realm },
2683 { "nonce=", &d->nonce },
2684 { "uri=", &d->uri },
2685 { "domain=", &d->domain },
2686 { "response=", &d->response },
2687 { "cnonce=", &d->cnonce },
2688 { "opaque=", &d->opaque },
2689 /* Special cases that cannot be directly copied */
2690 { "algorithm=", NULL },
2691 { "qop=", NULL },
2692 { "nc=", NULL },
2693 { NULL, 0 },
2694 };
2695
2696 if (ast_strlen_zero(digest) || !d || !str) {
2697 ast_free(str);
2698 return -1;
2699 }
2700
2701 ast_str_set(&str, 0, "%s", digest);
2702
2704
2705 if (strncasecmp(c, "Digest ", strlen("Digest "))) {
2706 ast_log(LOG_WARNING, "Missing Digest.\n");
2707 ast_free(str);
2708 return -1;
2709 }
2710 c += strlen("Digest ");
2711
2712 /* lookup for keys/value pair */
2713 while (c && *c && *(c = ast_skip_blanks(c))) {
2714 /* find key */
2715 for (i = keys; i->key != NULL; i++) {
2716 char *src, *separator;
2717 int unescape = 0;
2718 if (strncasecmp(c, i->key, strlen(i->key)) != 0) {
2719 continue;
2720 }
2721
2722 /* Found. Skip keyword, take text in quotes or up to the separator. */
2723 c += strlen(i->key);
2724 if (*c == '"') {
2725 src = ++c;
2726 separator = "\"";
2727 unescape = 1;
2728 } else {
2729 src = c;
2730 separator = ",";
2731 }
2732 strsep(&c, separator); /* clear separator and move ptr */
2733 if (unescape) {
2734 ast_unescape_c(src);
2735 }
2736 if (i->field) {
2737 ast_string_field_ptr_set(d, i->field, src);
2738 } else {
2739 /* Special cases that require additional processing */
2740 if (!strcasecmp(i->key, "algorithm=")) {
2741 if (strcasecmp(src, "MD5")) {
2742 ast_log(LOG_WARNING, "Digest algorithm: \"%s\" not supported.\n", src);
2743 ast_free(str);
2744 return -1;
2745 }
2746 } else if (!strcasecmp(i->key, "qop=") && !strcasecmp(src, "auth")) {
2747 d->qop = 1;
2748 } else if (!strcasecmp(i->key, "nc=")) {
2749 unsigned long u;
2750 if (sscanf(src, "%30lx", &u) != 1) {
2751 ast_log(LOG_WARNING, "Incorrect Digest nc value: \"%s\".\n", src);
2752 ast_free(str);
2753 return -1;
2754 }
2755 ast_string_field_set(d, nc, src);
2756 }
2757 }
2758 break;
2759 }
2760 if (i->key == NULL) { /* not found, try ',' */
2761 strsep(&c, ",");
2762 }
2763 }
2764 ast_free(str);
2765
2766 /* Digest checkout */
2767 if (ast_strlen_zero(d->realm) || ast_strlen_zero(d->nonce)) {
2768 /* "realm" and "nonce" MUST be always exist */
2769 return -1;
2770 }
2771
2772 if (!request) {
2773 /* Additional check for Digest response */
2774 if (ast_strlen_zero(d->username) || ast_strlen_zero(d->uri) || ast_strlen_zero(d->response)) {
2775 return -1;
2776 }
2777
2778 if (pedantic && d->qop && (ast_strlen_zero(d->cnonce) || ast_strlen_zero(d->nc))) {
2779 return -1;
2780 }
2781 }
2782
2783 return 0;
2784}
const char * str
Definition app_jack.c:150
char * strsep(char **str, const char *delims)
static int request(void *obj)
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
const char * ast_string_field
#define ast_string_field_ptr_set(x, ptr, data)
Set a field to a simple string value.
#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 *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
char *attribute_pure 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:2017

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

2387{
2388 char *dataPut = start;
2389 int inEscape = 0;
2390 int inQuotes = 0;
2391
2392 for (; *start; start++) {
2393 if (inEscape) {
2394 *dataPut++ = *start; /* Always goes verbatim */
2395 inEscape = 0;
2396 } else {
2397 if (*start == '\\') {
2398 inEscape = 1; /* Do not copy \ into the data */
2399 } else if (*start == '\'') {
2400 inQuotes = 1 - inQuotes; /* Do not copy ' into the data */
2401 } else {
2402 /* Replace , with |, unless in quotes */
2403 *dataPut++ = inQuotes ? *start : ((*start == find) ? replace_with : *start);
2404 }
2405 }
2406 }
2407 if (start != dataPut)
2408 *dataPut = 0;
2409 return dataPut;
2410}

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

1710{
1711 unsigned char attr_destroy = 0;
1712 int res;
1713
1714 if (!attr) {
1715 attr = ast_alloca(sizeof(*attr));
1716 pthread_attr_init(attr);
1717 attr_destroy = 1;
1718 }
1719
1720 if ((errno = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED)))
1721 ast_log(LOG_WARNING, "pthread_attr_setdetachstate: %s\n", strerror(errno));
1722
1723 res = ast_pthread_create_stack(thread, attr, start_routine, data,
1724 stacksize, file, caller, line, start_fn);
1725
1726 if (attr_destroy)
1727 pthread_attr_destroy(attr);
1728
1729 return res;
1730}
pthread_t thread
Definition app_sla.c:335
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:1659

References ast_alloca, ast_log, ast_pthread_create_stack(), thr_arg::data, errno, 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 1659 of file utils.c.

1662{
1663#if !defined(LOW_MEMORY)
1664 struct thr_arg *a;
1665#endif
1666
1667 if (!attr) {
1668 attr = ast_alloca(sizeof(*attr));
1669 pthread_attr_init(attr);
1670 }
1671
1672#if defined(__linux__) || defined(__FreeBSD__)
1673 /* On Linux and FreeBSD , pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
1674 which is kind of useless. Change this here to
1675 PTHREAD_INHERIT_SCHED; that way the -p option to set realtime
1676 priority will propagate down to new threads by default.
1677 This does mean that callers cannot set a different priority using
1678 PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
1679 the priority afterwards with pthread_setschedparam(). */
1680 if ((errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED)))
1681 ast_log(LOG_WARNING, "pthread_attr_setinheritsched: %s\n", strerror(errno));
1682#endif
1683
1684 if (!stacksize)
1685 stacksize = AST_STACKSIZE;
1686
1687 if ((errno = pthread_attr_setstacksize(attr, stacksize ? stacksize : AST_STACKSIZE)))
1688 ast_log(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(errno));
1689
1690#if !defined(LOW_MEMORY)
1691 if ((a = ast_malloc(sizeof(*a)))) {
1692 a->start_routine = start_routine;
1693 a->data = data;
1695 if (ast_asprintf(&a->name, "%-20s started at [%5d] %s %s()",
1696 start_fn, line, file, caller) < 0) {
1697 a->name = NULL;
1698 }
1699 data = a;
1700 }
1701#endif /* !LOW_MEMORY */
1702
1703 return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
1704}
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition astmm.h:267
#define pthread_create
Definition lock.h:649
const char * name
void * data
Definition utils.c:1596
void *(* start_routine)(void *)
Definition utils.c:1595
static void * dummy_start(void *data)
Definition utils.c:1607

References a, ast_alloca, ast_asprintf, ast_log, ast_malloc, AST_STACKSIZE, thr_arg::data, dummy_start(), errno, 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 2346 of file utils.c.

2347{
2348 long int res;
2349
2350 if (dev_urandom_fd >= 0) {
2351 int read_res = read(dev_urandom_fd, &res, sizeof(res));
2352 if (read_res > 0) {
2353 long int rm = RAND_MAX;
2354 res = res < 0 ? ~res : res;
2355 rm++;
2356 return res % rm;
2357 }
2358 }
2359
2360 /* XXX - Thread safety really depends on the libc, not the OS.
2361 *
2362 * But... popular Linux libc's (uClibc, glibc, eglibc), all have a
2363 * somewhat thread safe random(3) (results are random, but not
2364 * reproducible). The libc's for other systems (BSD, et al.), not so
2365 * much.
2366 */
2367#ifdef linux
2368 res = random();
2369#else
2371 res = random();
2373#endif
2374 return res;
2375}
#define ast_mutex_unlock(a)
Definition lock.h:197
#define ast_mutex_lock(a)
Definition lock.h:196
static int dev_urandom_fd
Definition utils.c:972
static ast_mutex_t randomlock
Definition utils.c:2343

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_rtp_change_source(), ast_rtp_new(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), 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(), moh_files_next(), 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 422 of file asterisk.c.

423{
424 struct thread_list_t *new = ast_calloc(1, sizeof(*new));
425
426 if (!new)
427 return;
428
430 new->id = pthread_self();
431 new->lwp = ast_get_tid();
432 new->name = name; /* steal the allocated memory for the thread name */
436}
static int multi_thread_safe
Definition asterisk.c:396
#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.
#define AST_RWLIST_INSERT_HEAD
struct thread_list_t::@320 list
int ast_get_tid(void)
Get current thread ID.
Definition utils.c:2786

References ast_assert, ast_calloc, ast_get_tid(), AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, thread_list_t::list, 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 2377 of file utils.c.

2378{
2379 for (; *s; s++) {
2380 if (*s == '^') {
2381 *s = ',';
2382 }
2383 }
2384}

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

2619{
2620 RAII_VAR(char *, absolute_base_path, NULL, ast_std_free);
2621 RAII_VAR(char *, p, NULL, ast_free);
2622
2623 if (base_path == NULL || path == NULL) {
2624 errno = EFAULT;
2625 return errno;
2626 }
2627
2628 p = ast_strdup(path);
2629 if (p == NULL) {
2630 errno = ENOMEM;
2631 return errno;
2632 }
2633
2634 absolute_base_path = realpath(base_path, NULL);
2635 if (absolute_base_path == NULL) {
2636 return errno;
2637 }
2638
2639 return safe_mkdir(absolute_base_path, p, mode);
2640}
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:2548

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

3036{
3037 int s;
3038 int i;
3039 struct ifreq *ifr;
3040 struct ifreq *ifrp;
3041 struct ifconf ifc;
3042 char *buf = NULL;
3043 char eid_str[20];
3044 int bufsz, num_interfaces;
3045 unsigned char empty_mac[6] = {0, 0, 0, 0, 0, 0};
3046 unsigned char full_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
3047
3048 s = socket(AF_INET, SOCK_STREAM, 0);
3049 if (s < 0) {
3050 ast_log(LOG_WARNING, "Unable to open socket for seeding global EID. "
3051 "You will have to set it manually.\n");
3052 return;
3053 }
3054
3055 ifc.ifc_len = 0;
3056 ifc.ifc_buf = NULL;
3057 if (ioctl(s, SIOCGIFCONF, &ifc) || ifc.ifc_len <= 0) {
3058 ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
3059 "You will have to set it manually.\n");
3060 close(s);
3061 return;
3062 }
3063 bufsz = ifc.ifc_len;
3064
3065 if (!(buf = ast_malloc(bufsz))) {
3066 ast_log(LOG_WARNING, "Unable to allocate memory for seeding global EID. "
3067 "You will have to set it manually.\n");
3068 close(s);
3069 return;
3070 }
3071
3072 ifc.ifc_buf = buf;
3073 if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
3074 ast_log(LOG_WARNING, "Unable to retrieve ethernet interfaces for seeding global EID. "
3075 "You will have to set it manually.\n");
3076 ast_free(buf);
3077 close(s);
3078 return;
3079 }
3080
3081 ifrp = ifc.ifc_req;
3082 num_interfaces = ifc.ifc_len / sizeof(*ifr);
3083
3084 for (i = 0; i < num_interfaces; i++) {
3085 ifr = &ifrp[i];
3086 if (!ioctl(s, SIOCGIFHWADDR, ifr)) {
3087 unsigned char *hwaddr = (unsigned char *) ifr->ifr_hwaddr.sa_data;
3088
3089 if (!(memcmp(hwaddr, &empty_mac, 6) && memcmp(hwaddr, &full_mac, 6))) {
3090 continue;
3091 }
3092
3093 memcpy(eid, hwaddr, sizeof(*eid));
3094 ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n",
3095 ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr->ifr_name);
3096 ast_free(buf);
3097 close(s);
3098 return;
3099 }
3100 }
3101
3102 ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
3103 "You will have to set it manually.\n");
3104 ast_free(buf);
3105 close(s);
3106
3107 return;
3108}
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:2873

References ast_debug, ast_eid_to_str(), ast_free, ast_log, ast_malloc, buf, 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 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 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 484 of file utils.h.

485{
486 int res;
487
488 res = (int) *input + *value;
489 if (res > 32767)
490 *input = 32767;
491 else if (res < -32768)
492 *input = -32768;
493 else
494 *input = (short) res;
495}

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

540{
541 *input /= *value;
542}

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

545{
546 float res = (float) *input / *value;
547 if (res > 32767)
548 *input = 32767;
549 else if (res < -32768)
550 *input = -32768;
551 else if (res > 0)
552 *input = (short) (res + 0.5);
553 else
554 *input = (short) (res - 0.5);
555
556}

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

511{
512 int res;
513
514 res = (int) *input * *value;
515 if (res > 32767)
516 *input = 32767;
517 else if (res < -32768)
518 *input = -32768;
519 else
520 *input = (short) res;
521}

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

524{
525 float res;
526
527 res = (float) *input * *value;
528 if (res > 32767)
529 *input = 32767;
530 else if (res < -32768)
531 *input = -32768;
532 else if (res > 0)
533 *input = (short) (res + 0.5);
534 else
535 *input = (short) (res - 0.5);
536
537}

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

498{
499 int res;
500
501 res = (int) *input - *value;
502 if (res > 32767)
503 *input = 32767;
504 else if (res < -32768)
505 *input = -32768;
506 else
507 *input = (short) res;
508}

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

3112{
3113 unsigned int eid_int[6];
3114 int x;
3115
3116 if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2],
3117 &eid_int[3], &eid_int[4], &eid_int[5]) != 6) {
3118 return -1;
3119 }
3120
3121 for (x = 0; x < 6; x++) {
3122 eid->eid[x] = eid_int[x];
3123 }
3124
3125 return 0;
3126}

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

3283{
3284 int *thread_user_interface;
3285
3286 thread_user_interface = ast_threadstorage_get(
3287 &thread_user_interface_tl, sizeof(*thread_user_interface));
3288 if (thread_user_interface == NULL) {
3289 ast_log(LOG_ERROR, "Error checking thread's user interface status\n");
3290 /* On error, assume that we are not a user interface thread */
3291 return 0;
3292 }
3293
3294 return *thread_user_interface;
3295}
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

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

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

3268{
3269 int *thread_user_interface;
3270
3271 thread_user_interface = ast_threadstorage_get(
3272 &thread_user_interface_tl, sizeof(*thread_user_interface));
3273 if (thread_user_interface == NULL) {
3274 ast_log(LOG_ERROR, "Error setting user interface status for current thread\n");
3275 return -1;
3276 }
3277
3278 *thread_user_interface = !!is_user_interface;
3279 return 0;
3280}

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

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

877{
878 int esc_pos;
879 int unesc_pos;
880 int quote_str_len = strlen(quote_str);
881
882 for (esc_pos = 0, unesc_pos = 0;
883 esc_pos < quote_str_len;
884 esc_pos++, unesc_pos++) {
885 if (quote_str[esc_pos] == '\\') {
886 /* at least one more char and current is \\ */
887 esc_pos++;
888 if (esc_pos >= quote_str_len) {
889 break;
890 }
891 }
892
893 quote_str[unesc_pos] = quote_str[esc_pos];
894 }
895 quote_str[unesc_pos] = '\0';
896}

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

◆ ast_unregister_thread()

void ast_unregister_thread ( void *  id)

Definition at line 438 of file asterisk.c.

439{
440 struct thread_list_t *x;
441
444 if ((void *) x->id == id) {
446 break;
447 }
448 }
451 if (x) {
452 ast_free(x->name);
453 ast_free(x);
454 }
455}
#define AST_RWLIST_REMOVE_CURRENT
#define AST_RWLIST_TRAVERSE_SAFE_BEGIN
#define AST_RWLIST_TRAVERSE_SAFE_END
pthread_t id
Definition asterisk.c:416
char * name
Definition asterisk.c:415

References ast_free, AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, thread_list_t::id, thread_list_t::list, and thread_list_t::name.

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

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

References ast_test_flag, and AST_URI_LEGACY_SPACE.

Referenced by acf_curl_helper(), ast_ari_invoke(), ast_http_parse_post_form(), 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 721 of file utils.c.

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

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

int ast_uri_verify_encoded ( const char *  string)

Verify if a string is valid as a URI component.

This function checks if the string either doesn't need encoding or is already properly URI encoded. Valid characters are 'a-zA-Z0-9.+_-' and 'xx' escape sequences.

Parameters
stringString to be checked
Return values
1if the string is valid
0if the string is not valid

Definition at line 779 of file utils.c.

780{
781 const char *ptr = string;
782 size_t length;
783 char *endl;
784
785 if (!string) {
786 return 0;
787 }
788
789 length = strlen(string);
790 endl = (char *)string + length;
791
792 while (*ptr) {
793 if (*ptr == '%') {
794 unsigned int tmp;
795 /* Make sure there are at least 2 characters left to decode */
796 if (ptr + 2 >= endl) {
797 return 0;
798 }
799 /* Try to parse the next two characters as hex */
800 if (sscanf(ptr + 1, "%2x", &tmp) != 1) {
801 return 0;
802 }
803 /* All good, move past the '%' and the two hex digits */
804 ptr += 3;
805 } else if (!isalnum((unsigned char ) *ptr) && !strchr("-_.+", *ptr)) {
806 return 0;
807 } else {
808 ptr++;
809 }
810 }
811
812 return 1; /* all characters are valid */
813}

References string.

Referenced by validate_uri_parameters().

◆ ast_utils_init()

int ast_utils_init ( void  )

Definition at line 2651 of file utils.c.

2652{
2653 dev_urandom_fd = open("/dev/urandom", O_RDONLY);
2654 base64_init();
2655#ifdef DEBUG_THREADS
2656#if !defined(LOW_MEMORY)
2657 ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli));
2658#endif
2659#endif
2661 return 0;
2662}
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:2642
static void base64_init(void)
Definition utils.c:538
#define ARRAY_LEN(a)
Definition utils.h:706

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

2809{
2810 const char *envPATH = getenv("PATH");
2811 char *tpath, *path;
2812 struct stat unused;
2813 if (!envPATH) {
2814 return NULL;
2815 }
2816 tpath = ast_strdupa(envPATH);
2817 while ((path = strsep(&tpath, ":"))) {
2818 snprintf(fullpath, fullpath_size, "%s/%s", path, binary);
2819 if (!stat(fullpath, &unused)) {
2820 return fullpath;
2821 }
2822 }
2823 return NULL;
2824}

References ast_strdupa, NULL, and strsep().

◆ ast_wait_for_input()

int ast_wait_for_input ( int  fd,
int  ms 
)

Definition at line 1732 of file utils.c.

1733{
1734 struct pollfd pfd[1];
1735
1736 memset(pfd, 0, sizeof(pfd));
1737 pfd[0].fd = fd;
1738 pfd[0].events = POLLIN | POLLPRI;
1739 return ast_poll(pfd, 1, ms);
1740}
#define ast_poll(a, b, c)
Definition poll-compat.h:88

References ast_poll.

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

◆ ast_wait_for_output()

int ast_wait_for_output ( int  fd,
int  ms 
)

Definition at line 1742 of file utils.c.

1743{
1744 struct pollfd pfd[1];
1745
1746 memset(pfd, 0, sizeof(pfd));
1747 pfd[0].fd = fd;
1748 pfd[0].events = POLLOUT;
1749 return ast_poll(pfd, 1, ms);
1750}

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

899{
900 char *dst = outbuf;
901 char *end = outbuf + buflen - 1; /* save one for the null terminator */
902
903 /* Handle the case for the empty output buffer */
904 if (buflen == 0) {
905 return -1;
906 }
907
908 /* Escaping rules from http://www.w3.org/TR/REC-xml/#syntax */
909 /* This also prevents partial entities at the end of a string */
910 while (*string && dst < end) {
911 const char *entity = NULL;
912 int len = 0;
913
914 switch (*string) {
915 case '<':
916 entity = "&lt;";
917 len = 4;
918 break;
919 case '&':
920 entity = "&amp;";
921 len = 5;
922 break;
923 case '>':
924 /* necessary if ]]> is in the string; easier to escape them all */
925 entity = "&gt;";
926 len = 4;
927 break;
928 case '\'':
929 /* necessary in single-quoted strings; easier to escape them all */
930 entity = "&apos;";
931 len = 6;
932 break;
933 case '"':
934 /* necessary in double-quoted strings; easier to escape them all */
935 entity = "&quot;";
936 len = 6;
937 break;
938 default:
939 *dst++ = *string++;
940 break;
941 }
942
943 if (entity) {
944 ast_assert(len == strlen(entity));
945 if (end - dst < len) {
946 /* no room for the entity; stop */
947 break;
948 }
949 /* just checked for length; strcpy is fine */
950 strcpy(dst, entity);
951 dst += len;
952 ++string;
953 }
954 }
955 /* Write null terminator */
956 *dst = '\0';
957 /* If any chars are left in string, return failure */
958 return *string == '\0' ? 0 : -1;
959}
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

Swap the upper and lower 32 bits of a big-endian 64-bit integer.

This macro is needed to preserve ABI compatability on big-endian systems after changing from a 32 bit flags to a 64 bit flags. It ensures that a new 64-bit flag field will still work with a function that expects a 32-bit flag field. On a little-endian system, nothing is needed, since the 64-bit flags are already in the correct order.

Note
This macro is different than a standard byte swap, as it doesn't reverse the byte order, it just swaps the upper 4 bytes with the lower 4 bytes.
Parameters
flagsThe 64-bit flags to swap
Return values
Theflags with the upper and lower 32 bits swapped if the system is big-endian,

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

Referenced by AST_TEST_DEFINE().