Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Functions | Variables
main/utils.c File Reference

Utility functions. More...

#include "asterisk.h"
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>
#include "asterisk/network.h"
#include "asterisk/ast_version.h"
#include "asterisk/lock.h"
#include "asterisk/io.h"
#include "asterisk/md5.h"
#include "asterisk/sha1.h"
#include "asterisk/cli.h"
#include "asterisk/linkedlists.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
#include "asterisk/time.h"
#include "asterisk/utils.h"
#include "asterisk/threadstorage.h"
#include "asterisk/config.h"
#include "asterisk/alertpipe.h"
Include dependency graph for main/utils.c:

Go to the source code of this file.

Data Structures

struct  baseio
 Structure used for base64 encoding. More...
 
struct  thr_arg
 

Macros

#define AST_API_MODULE   /* ensure that inlinable API functions will be built in lock.h if required */
 
#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */
 
#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */
 
#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */
 
#define AST_API_MODULE
 
#define AST_API_MODULE
 
#define AST_API_MODULE
 
#define BASELINELEN   72
 
#define BASEMAXINLINE   256
 
#define ONE_MILLION   1000000
 

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)
 
static void __init_inet_ntoa_buf (void)
 
static void __init_thread_user_interface_tl (void)
 A thread local indicating whether the current thread is a user interface. More...
 
int ast_background_stacksize (void)
 
int ast_base64_encode_file (FILE *inputfile, FILE *outputfile, const char *endl)
 Performs a base 64 encode algorithm on the contents of a File. More...
 
int ast_base64_encode_file_path (const char *filename, FILE *outputfile, const char *endl)
 Performs a base 64 encode algorithm on the contents of a File. More...
 
int ast_base64decode (unsigned char *dst, const char *src, int max)
 decode BASE64 encoded text More...
 
char * ast_base64decode_string (const char *src)
 Decode BASE64 encoded text and return the string. More...
 
int ast_base64encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64. More...
 
int ast_base64encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
 encode text to BASE64 coding More...
 
char * ast_base64encode_string (const char *src)
 Encode to BASE64 and return encoded string. More...
 
int ast_base64url_decode (unsigned char *dst, const char *src, int max)
 Decode data from base64 URL. More...
 
char * ast_base64url_decode_string (const char *src)
 Decode string from base64 URL. More...
 
int ast_base64url_encode (char *dst, const unsigned char *src, int srclen, int max)
 Encode data in base64 URL. More...
 
int ast_base64url_encode_full (char *dst, const unsigned char *src, int srclen, int max, int linebreaks)
 Same as ast_base64encode_full but for base64 URL. More...
 
char * ast_base64url_encode_string (const char *src)
 Encode string in base64 URL. More...
 
int ast_build_string (char **buffer, size_t *space, const char *fmt,...)
 Build a string in a buffer, designed to be called repeatedly. More...
 
int ast_build_string_va (char **buffer, size_t *space, const char *fmt, va_list ap)
 Build a string in a buffer, designed to be called repeatedly. More...
 
int ast_carefulwrite (int fd, char *s, int len, int timeoutms)
 Try to write string, but wait no more than ms milliseconds before timing out. More...
 
int ast_check_ipv6 (void)
 Test that an OS supports IPv6 Networking. More...
 
int ast_compare_versions (const char *version1, const char *version2)
 Compare 2 major.minor.patch.extra version strings. More...
 
void DO_CRASH_NORETURN ast_do_crash (void)
 Force a crash if DO_CRASH is defined. More...
 
int ast_eid_cmp (const struct ast_eid *eid1, const struct ast_eid *eid2)
 Compare two EIDs. More...
 
int ast_eid_is_empty (const struct ast_eid *eid)
 Check if EID is empty. More...
 
char * ast_eid_to_str (char *s, int maxlen, struct ast_eid *eid)
 Convert an EID to a string. More...
 
void ast_enable_packet_fragmentation (int sock)
 Disable PMTU discovery on a socket. More...
 
char * ast_escape (char *dest, const char *s, size_t size, const char *to_escape)
 Escape the 'to_escape' characters in the given string. More...
 
char * ast_escape_alloc (const char *s, const char *to_escape)
 Escape the 'to_escape' characters in the given string. More...
 
char * ast_escape_c (char *dest, const char *s, size_t size)
 Escape standard 'C' sequences in the given string. More...
 
char * ast_escape_c_alloc (const char *s)
 Escape standard 'C' sequences in the given string. More...
 
char * ast_escape_quoted (const char *string, char *outbuf, int buflen)
 Escape characters found in a quoted string. More...
 
char * ast_escape_semicolons (const char *string, char *outbuf, int buflen)
 Escape semicolons found in a string. More...
 
int ast_false (const char *s)
 Make sure something is false. Determine if a string containing a boolean value is "false". This function checks to see whether a string passed to it is an indication of an "false" value. It checks to see if the string is "no", "false", "n", "f", "off" or "0". More...
 
int ast_file_is_readable (const char *filename)
 Test that a file exists and is readable by the effective user. More...
 
void ast_format_duration_hh_mm_ss (int duration, char *buf, size_t length)
 Formats a duration into HH:MM:SS. More...
 
int ast_get_tid (void)
 Get current thread ID. More...
 
int ast_get_time_t (const char *src, time_t *dst, time_t _default, int *consumed)
 get values from config variables. More...
 
int ast_get_timeval (const char *src, struct timeval *dst, struct timeval _default, int *consumed)
 get values from config variables. More...
 
struct hostent * ast_gethostbyname (const char *host, struct ast_hostent *hp)
 Re-entrant (thread safe) version of gethostbyname that replaces the standard gethostbyname (which is not thread safe) More...
 
const char * ast_inet_ntoa (struct in_addr ia)
 ast_inet_ntoa: Recursive thread safe replacement of inet_ntoa More...
 
void ast_join_delim (char *s, size_t len, const char *const w[], unsigned int size, char delim)
 Join an array of strings into a single string. More...
 
void ast_md5_hash (char *output, const char *input)
 Produce 32 char MD5 hash of value. More...
 
int ast_mkdir (const char *path, int mode)
 Recursively create directory path. More...
 
int ast_parse_digest (const char *digest, struct ast_http_digest *d, int request, int pedantic)
 Parse digest authorization header. More...
 
char * ast_process_quotes_and_slashes (char *start, char find, char replace_with)
 Process a string to find and replace characters. More...
 
int ast_pthread_create_detached_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn)
 
int ast_pthread_create_stack (pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, const char *file, const char *caller, int line, const char *start_fn)
 
long int ast_random (void)
 
int ast_regex_string_to_regex_pattern (const char *regex_string, struct ast_str **regex_pattern)
 Given a string regex_string in the form of "/regex/", convert it into the form of "regex". More...
 
int ast_remaining_ms (struct timeval start, int max_ms)
 Calculate remaining milliseconds given a starting timestamp and upper bound. More...
 
void ast_replace_subargument_delimiter (char *s)
 Replace '^' in a string with ','. More...
 
int ast_safe_mkdir (const char *base_path, const char *path, int mode)
 Recursively create directory path, but only if it resolves within the given base_path. More...
 
void ast_set_default_eid (struct ast_eid *eid)
 Fill in an ast_eid with the default eid of this machine. More...
 
void ast_sha1_hash (char *output, const char *input)
 Produce 40 char SHA1 hash of value. More...
 
void ast_sha1_hash_uint (uint8_t *digest, const char *input)
 Produce a 20 byte SHA1 hash of value. More...
 
int ast_str_to_eid (struct ast_eid *eid, const char *s)
 Convert a string into an EID. More...
 
char * ast_strip_quoted (char *s, const char *beg_quotes, const char *end_quotes)
 Strip leading/trailing whitespace and quotes from a string. More...
 
char * ast_strsep (char **iss, const char sep, uint32_t flags)
 Act like strsep but ignore separators inside quotes. More...
 
int ast_thread_is_user_interface (void)
 Indicates whether the current thread is a user interface. More...
 
int ast_thread_user_interface_set (int is_user_interface)
 Set the current thread's user interface status. More...
 
char * ast_to_camel_case_delim (const char *s, const char *delim)
 Attempts to convert the given string to camel case using the specified delimiter. More...
 
int ast_true (const char *s)
 Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1". More...
 
struct timeval ast_tvadd (struct timeval a, struct timeval b)
 Returns the sum of two timevals a + b. More...
 
struct timeval ast_tvsub (struct timeval a, struct timeval b)
 Returns the difference of two timevals a - b. More...
 
char * ast_unescape_c (char *src)
 Convert some C escape sequences. More...
 
void ast_unescape_quoted (char *quote_str)
 Unescape quotes in a string. More...
 
char * ast_unescape_semicolon (char *s)
 Strip backslash for "escaped" semicolons, the string to be stripped (will be modified). More...
 
void ast_uri_decode (char *s, struct ast_flags spec)
 Decode URI, URN, URL (overwrite string) More...
 
char * ast_uri_encode (const char *string, char *outbuf, int buflen, struct ast_flags spec)
 Turn text string to URI-encoded XX version. More...
 
int ast_utils_init (void)
 
char * ast_utils_which (const char *binary, char *fullpath, size_t fullpath_size)
 Resolve a binary to a full pathname. More...
 
int ast_wait_for_input (int fd, int ms)
 
int ast_wait_for_output (int fd, int ms)
 
int ast_xml_escape (const char *string, char *const outbuf, const size_t buflen)
 Escape reserved characters for use in XML. More...
 
static void base64_init (void)
 
static void * dummy_start (void *data)
 
static char * escape_alloc (const char *s, size_t *size)
 
static int inbuf (struct baseio *bio, FILE *fi)
 utility used by inchar(), for base_encode() More...
 
static int inchar (struct baseio *bio, FILE *fi)
 utility used by base_encode() More...
 
static int ochar (struct baseio *bio, int c, FILE *so, const char *endl)
 utility used by base_encode() More...
 
static int safe_mkdir (const char *base_path, char *path, int mode)
 
static struct timeval tvfix (struct timeval a)
 
static void utils_shutdown (void)
 
static int wait_for_output (int fd, int timeoutms)
 

Variables

const struct ast_flags ast_uri_http = {AST_URI_UNRESERVED}
 
const struct ast_flags ast_uri_http_legacy = {AST_URI_LEGACY_SPACE | AST_URI_UNRESERVED}
 
const struct ast_flags ast_uri_sip_user = {AST_URI_UNRESERVED | AST_URI_SIP_USER_UNRESERVED}
 
static char b2a [256]
 
static char b2a_url [256]
 
static char base64 [64]
 
static char base64url [64]
 
static int dev_urandom_fd = -1
 
char escape_sequences []
 
static char escape_sequences_map []
 
static struct ast_threadstorage inet_ntoa_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_inet_ntoa_buf , .custom_init = NULL , }
 
static ast_mutex_t randomlock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
 
static struct ast_threadstorage thread_user_interface_tl = { .once = PTHREAD_ONCE_INIT , .key_init = __init_thread_user_interface_tl , .custom_init = NULL , }
 

Detailed Description

Utility functions.

Note
These are important for portability and security, so please use them in favour of other routines. Please consult the CODING GUIDELINES for more information.

Definition in file main/utils.c.

Macro Definition Documentation

◆ AST_API_MODULE [1/7]

#define AST_API_MODULE   /* ensure that inlinable API functions will be built in lock.h if required */

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [2/7]

#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [3/7]

#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [4/7]

#define AST_API_MODULE   /* ensure that inlinable API functions will be built in this module if required */

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [5/7]

#define AST_API_MODULE

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [6/7]

#define AST_API_MODULE

Definition at line 72 of file main/utils.c.

◆ AST_API_MODULE [7/7]

#define AST_API_MODULE

Definition at line 72 of file main/utils.c.

◆ BASELINELEN

#define BASELINELEN   72

Line length for Base 64 encoded messages

Definition at line 575 of file main/utils.c.

◆ BASEMAXINLINE

#define BASEMAXINLINE   256

Buffer size for Base 64 attachment encoding

Definition at line 576 of file main/utils.c.

◆ ONE_MILLION

#define ONE_MILLION   1000000

Definition at line 2131 of file main/utils.c.

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 2712 of file main/utils.c.

2713 {
2714  /*
2715  * Attempt to put it into the logger, but hope that at least
2716  * someone saw the message on stderr ...
2717  */
2718  fprintf(stderr, "FRACK!, Failed assertion %s (%d) at line %d in %s of %s\n",
2719  condition_str, condition, line, function, file);
2720  ast_log(__LOG_ERROR, file, line, function, "FRACK!, Failed assertion %s (%d)\n",
2721  condition_str, condition);
2722 
2723  /* Generate a backtrace for the assert */
2725 
2726  /*
2727  * Give the logger a chance to get the message out, just in case
2728  * we abort(), or Asterisk crashes due to whatever problem just
2729  * happened after we exit ast_assert().
2730  */
2731  usleep(1);
2732  ast_do_crash();
2733 }
#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:2244
void DO_CRASH_NORETURN ast_do_crash(void)
Force a crash if DO_CRASH is defined.
Definition: main/utils.c:2700

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

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

◆ __ast_fd_set_flags()

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

Definition at line 3046 of file main/utils.c.

3048 {
3049  int f;
3050 
3051  f = fcntl(fd, F_GETFL);
3052  if (f == -1) {
3053  ast_log(__LOG_ERROR, file, lineno, function,
3054  "Failed to get fcntl() flags for file descriptor: %s\n", strerror(errno));
3055  return -1;
3056  }
3057 
3058  switch (op) {
3059  case AST_FD_FLAG_SET:
3060  if ((f & flags) == flags) {
3061  /* There is nothing to set */
3062  return 0;
3063  }
3064  f |= flags;
3065  break;
3066  case AST_FD_FLAG_CLEAR:
3067  if (!(f & flags)) {
3068  /* There is nothing to clear */
3069  return 0;
3070  }
3071  f &= ~flags;
3072  break;
3073  default:
3074  ast_assert(0);
3075  break;
3076  }
3077 
3078  f = fcntl(fd, F_SETFL, f);
3079  if (f == -1) {
3080  ast_log(__LOG_ERROR, file, lineno, function,
3081  "Failed to set fcntl() flags for file descriptor: %s\n", strerror(errno));
3082  return -1;
3083  }
3084 
3085  return 0;
3086 }
int errno
#define ast_assert(a)
Definition: utils.h:734
@ AST_FD_FLAG_SET
Definition: utils.h:1017
@ AST_FD_FLAG_CLEAR
Definition: utils.h:1018

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

◆ __init_inet_ntoa_buf()

static void __init_inet_ntoa_buf ( void  )
static

Definition at line 85 of file main/utils.c.

102 {

◆ __init_thread_user_interface_tl()

static void __init_thread_user_interface_tl ( void  )
static

A thread local indicating whether the current thread is a user interface.

Definition at line 3127 of file main/utils.c.

3130 {

◆ ast_background_stacksize()

int ast_background_stacksize ( void  )

Definition at line 1583 of file main/utils.c.

1584 {
1585 #if !defined(LOW_MEMORY)
1586  return AST_STACKSIZE;
1587 #else
1588  return AST_STACKSIZE_LOW;
1589 #endif
1590 }
#define AST_STACKSIZE
Definition: utils.h:560
#define AST_STACKSIZE_LOW
Definition: utils.h:561

References AST_STACKSIZE, and AST_STACKSIZE_LOW.

◆ ast_base64_encode_file()

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

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

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

Definition at line 648 of file main/utils.c.

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

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

Referenced by ast_base64_encode_file_path().

◆ ast_base64_encode_file_path()

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

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

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

Definition at line 702 of file main/utils.c.

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

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

Referenced by add_email_attachment(), and sendmail().

◆ ast_base64decode()

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

decode BASE64 encoded text

Decode data from base64.

Definition at line 296 of file main/utils.c.

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

References b2a, and max.

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

◆ ast_base64decode_string()

char* ast_base64decode_string ( const char *  src)

Decode BASE64 encoded text and return the string.

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

Definition at line 323 of file main/utils.c.

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

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

◆ ast_base64encode()

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

Encode data in base64.

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

Definition at line 406 of file main/utils.c.

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

References ast_base64encode_full(), and max.

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

◆ ast_base64encode_full()

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

encode text to BASE64 coding

Definition at line 355 of file main/utils.c.

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

References base64, and max.

Referenced by ast_base64encode().

◆ ast_base64encode_string()

char* ast_base64encode_string ( const char *  src)

Encode to BASE64 and return encoded string.

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

Definition at line 412 of file main/utils.c.

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

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

◆ ast_base64url_decode()

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

Decode data from base64 URL.

Parameters
dstThe destination buffer
srcThe source buffer
maxThe maximum number of bytes to write into the destination buffer. Note that this function will not ensure that the destination buffer is NULL terminated. So, in general, this parameter should be sizeof(dst) - 1

Definition at line 429 of file main/utils.c.

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

References b2a_url, and max.

Referenced by ast_base64url_decode_string(), and stir_shaken_verify_signature().

◆ ast_base64url_decode_string()

char* ast_base64url_decode_string ( const char *  src)

Decode string from base64 URL.

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

Definition at line 450 of file main/utils.c.

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

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

Referenced by stir_shaken_incoming_request().

◆ ast_base64url_encode()

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

Encode data in base64 URL.

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

Definition at line 518 of file main/utils.c.

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

References ast_base64url_encode_full(), and max.

Referenced by ast_base64url_encode_string(), and stir_shaken_sign().

◆ ast_base64url_encode_full()

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

Same as ast_base64encode_full but for base64 URL.

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

Definition at line 471 of file main/utils.c.

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

References base64url, and max.

Referenced by ast_base64url_encode().

◆ ast_base64url_encode_string()

char* ast_base64url_encode_string ( const char *  src)

Encode string in base64 URL.

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

Definition at line 523 of file main/utils.c.

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

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

Referenced by add_identity_header().

◆ ast_build_string()

int ast_build_string ( char **  buffer,
size_t *  space,
const char *  fmt,
  ... 
)

Build a string in a buffer, designed to be called repeatedly.

Note
This method is not recommended. New code should use ast_str_*() instead.

This is a wrapper for snprintf, that properly handles the buffer pointer and buffer space available.

Parameters
buffercurrent position in buffer to place string into (will be updated on return)
spaceremaining space in buffer (will be updated on return)
fmtprintf-style format string
Return values
0on success
non-zeroon failure.

Definition at line 2065 of file main/utils.c.

2066 {
2067  va_list ap;
2068  int result;
2069 
2070  va_start(ap, fmt);
2071  result = ast_build_string_va(buffer, space, fmt, ap);
2072  va_end(ap);
2073 
2074  return result;
2075 }
static PGresult * result
Definition: cel_pgsql.c:84
int ast_build_string_va(char **buffer, size_t *space, const char *fmt, va_list ap)
Build a string in a buffer, designed to be called repeatedly.
Definition: main/utils.c:2046

References ast_build_string_va(), and result.

Referenced by ast_fax_caps_to_str(), generate_filenames_string(), pp_each_extension_helper(), and pp_each_user_helper().

◆ ast_build_string_va()

int ast_build_string_va ( char **  buffer,
size_t *  space,
const char *  fmt,
va_list  ap 
)

Build a string in a buffer, designed to be called repeatedly.

This is a wrapper for snprintf, that properly handles the buffer pointer and buffer space available.

Return values
zeroon success.
non-zeroon failure.
Parameters
buffercurrent position in buffer to place string into (will be updated on return)
spaceremaining space in buffer (will be updated on return)
fmtprintf-style format string
apvarargs list of arguments for format

Definition at line 2046 of file main/utils.c.

2047 {
2048  int result;
2049 
2050  if (!buffer || !*buffer || !space || !*space)
2051  return -1;
2052 
2053  result = vsnprintf(*buffer, *space, fmt, ap);
2054 
2055  if (result < 0)
2056  return -1;
2057  else if (result > *space)
2058  result = *space;
2059 
2060  *buffer += result;
2061  *space -= result;
2062  return 0;
2063 }

References result.

Referenced by ast_build_string().

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

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 1738 of file main/utils.c.

1739 {
1740  struct timeval start = ast_tvnow();
1741  int res = 0;
1742  int elapsed = 0;
1743 
1744  while (len) {
1745  if (wait_for_output(fd, timeoutms - elapsed)) {
1746  return -1;
1747  }
1748 
1749  res = write(fd, s, len);
1750 
1751  if (res < 0 && errno != EAGAIN && errno != EINTR) {
1752  /* fatal error from write() */
1753  if (errno == EPIPE) {
1754 #ifndef STANDALONE
1755  ast_debug(1, "write() failed due to reading end being closed: %s\n", strerror(errno));
1756 #endif
1757  } else {
1758  ast_log(LOG_ERROR, "write() returned error: %s\n", strerror(errno));
1759  }
1760  return -1;
1761  }
1762 
1763  if (res < 0) {
1764  /* It was an acceptable error */
1765  res = 0;
1766  }
1767 
1768  /* Update how much data we have left to write */
1769  len -= res;
1770  s += res;
1771  res = 0;
1772 
1773  elapsed = ast_tvdiff_ms(ast_tvnow(), start);
1774  if (elapsed >= timeoutms) {
1775  /* We've taken too long to write
1776  * This is only an error condition if we haven't finished writing. */
1777  res = len ? -1 : 0;
1778  break;
1779  }
1780  }
1781 
1782  return res;
1783 }
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
static int wait_for_output(int fd, int timeoutms)
Definition: main/utils.c:1685
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition: time.h:105
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:157

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_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 2688 of file main/utils.c.

2689 {
2690  int udp6_socket = socket(AF_INET6, SOCK_DGRAM, 0);
2691 
2692  if (udp6_socket < 0) {
2693  return 0;
2694  }
2695 
2696  close(udp6_socket);
2697  return 1;
2698 }

◆ 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 3020 of file main/utils.c.

3021 {
3022  unsigned int major[2] = { 0 };
3023  unsigned int minor[2] = { 0 };
3024  unsigned int patch[2] = { 0 };
3025  unsigned int extra[2] = { 0 };
3026  int res;
3027 
3028  sscanf(version1, "%u.%u.%u.%u", &major[0], &minor[0], &patch[0], &extra[0]);
3029  sscanf(version2, "%u.%u.%u.%u", &major[1], &minor[1], &patch[1], &extra[1]);
3030 
3031  res = major[0] - major[1];
3032  if (res) {
3033  return res;
3034  }
3035  res = minor[0] - minor[1];
3036  if (res) {
3037  return res;
3038  }
3039  res = patch[0] - patch[1];
3040  if (res) {
3041  return res;
3042  }
3043  return extra[0] - extra[1];
3044 }

Referenced by transport_apply().

◆ 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 2700 of file main/utils.c.

2701 {
2702 #if defined(DO_CRASH)
2703  abort();
2704  /*
2705  * Just in case abort() doesn't work or something else super
2706  * silly, and for Qwell's amusement.
2707  */
2708  *((int *) 0) = 0;
2709 #endif /* defined(DO_CRASH) */
2710 }

Referenced by __ast_assert_failed(), and sip_route_process_header().

◆ 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 2995 of file main/utils.c.

2996 {
2997  struct ast_eid empty_eid;
2998 
2999  memset(&empty_eid, 0, sizeof(empty_eid));
3000  return memcmp(eid, &empty_eid, sizeof(empty_eid)) ? 0 : 1;
3001 }
static dundi_eid empty_eid
Definition: pbx_dundi.c:212
An Entity ID is essentially a MAC address, brief and unique.
Definition: utils.h:808
unsigned char eid[6]
Definition: utils.h:809

References ast_eid::eid, and empty_eid.

Referenced by load_module(), and set_config().

◆ ast_eid_to_str()

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

Convert an EID to a string.

Since
1.6.1

Definition at line 2735 of file main/utils.c.

2736 {
2737  int x;
2738  char *os = s;
2739  if (maxlen < 18) {
2740  if (s && (maxlen > 0)) {
2741  *s = '\0';
2742  }
2743  } else {
2744  for (x = 0; x < 5; x++) {
2745  sprintf(s, "%02hhx:", eid->eid[x]);
2746  s += 3;
2747  }
2748  sprintf(s, "%02hhx", eid->eid[5]);
2749  }
2750  return os;
2751 }

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_publisher_devstate_cb(), asterisk_publisher_mwistate_cb(), build_peer(), build_transactions(), cache_lookup(), cache_lookup_internal(), 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_peer(), dundi_show_peers(), dundi_show_requests(), handle_command_response(), handle_show_settings(), populate_addr(), prometheus_config_post_apply(), publish_cluster_discovery_to_stasis_full(), publish_device_state_to_stasis(), publish_mwi_to_stasis(), publish_to_corosync(), register_request(), update_key(), xmpp_pubsub_publish_device_state(), and xmpp_pubsub_publish_mwi().

◆ ast_enable_packet_fragmentation()

void ast_enable_packet_fragmentation ( int  sock)

Disable PMTU discovery on a socket.

Parameters
sockThe socket to manipulate

On Linux, UDP sockets default to sending packets with the Dont Fragment (DF) bit set. This is supposedly done to allow the application to do PMTU discovery, but Asterisk does not do this.

Because of this, UDP packets sent by Asterisk that are larger than the MTU of any hop in the path will be lost. This function can be called on a socket to ensure that the DF bit will not be set.

Definition at line 2367 of file main/utils.c.

2368 {
2369 #if defined(HAVE_IP_MTU_DISCOVER)
2370  int val = IP_PMTUDISC_DONT;
2371 
2372  if (setsockopt(sock, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val)))
2373  ast_log(LOG_WARNING, "Unable to disable PMTU discovery. Large UDP packets may fail to be delivered when sent from this socket.\n");
2374 #endif /* HAVE_IP_MTU_DISCOVER */
2375 }
#define LOG_WARNING
Definition: ast_expr2.c:325

References ast_log, and LOG_WARNING.

Referenced by ast_netsock_bindaddr(), and reload_config().

◆ ast_escape()

char* ast_escape ( char *  dest,
const char *  s,
size_t  size,
const char *  to_escape 
)

Escape the 'to_escape' characters in the given string.

Note
The given output buffer will contain a truncated escaped version of the source string if the given buffer is not large enough.
Parameters
destthe escaped string
sthe source string to escape
sizeThe size of the destination buffer
to_escapean array of characters to escape
Returns
Pointer to the destination.

Definition at line 1932 of file main/utils.c.

1933 {
1934  char *p;
1935  char *c;
1936 
1937  if (!dest || !size) {
1938  return dest;
1939  }
1940  if (ast_strlen_zero(s)) {
1941  *dest = '\0';
1942  return dest;
1943  }
1944 
1945  if (ast_strlen_zero(to_escape)) {
1946  ast_copy_string(dest, s, size);
1947  return dest;
1948  }
1949 
1950  for (p = dest; *s && --size; ++s, ++p) {
1951  /* If in the list of characters to escape then escape it */
1952  if (strchr(to_escape, *s)) {
1953  if (!--size) {
1954  /* Not enough room left for the escape sequence. */
1955  break;
1956  }
1957 
1958  /*
1959  * See if the character to escape is part of the standard escape
1960  * sequences. If so we'll have to use its mapped counterpart
1961  * otherwise just use the current character.
1962  */
1963  c = strchr(escape_sequences, *s);
1964  *p++ = '\\';
1965  *p = c ? escape_sequences_map[c - escape_sequences] : *s;
1966  } else {
1967  *p = *s;
1968  }
1969  }
1970  *p = '\0';
1971 
1972  return dest;
1973 }
char escape_sequences[]
Definition: main/utils.c:1920
static char escape_sequences_map[]
Definition: main/utils.c:1928
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406

References ast_copy_string(), ast_strlen_zero(), c, escape_sequences, and escape_sequences_map.

Referenced by ast_escape_alloc().

◆ ast_escape_alloc()

char* ast_escape_alloc ( const char *  s,
const char *  to_escape 
)

Escape the 'to_escape' characters in the given string.

Note
Caller is responsible for freeing the returned string
Parameters
sthe source string to escape
to_escapean array of characters to escape
Returns
Pointer to the escaped string or NULL.

Definition at line 2030 of file main/utils.c.

2031 {
2032  size_t size = 0;
2033  char *dest = escape_alloc(s, &size);
2034 
2035  return ast_escape(dest, s, size, to_escape);
2036 }
char * ast_escape(char *dest, const char *s, size_t size, const char *to_escape)
Escape the 'to_escape' characters in the given string.
Definition: main/utils.c:1932
static char * escape_alloc(const char *s, size_t *size)
Definition: main/utils.c:2016

References ast_escape(), and escape_alloc().

◆ ast_escape_c()

char* ast_escape_c ( char *  dest,
const char *  s,
size_t  size 
)

Escape standard 'C' sequences in the given string.

Note
The given output buffer will contain a truncated escaped version of the source string if the given buffer is not large enough.
Parameters
destthe escaped string
sthe source string to escape
sizeThe size of the destination buffer
Returns
Pointer to the escaped string.

Definition at line 1975 of file main/utils.c.

1976 {
1977  /*
1978  * Note - This is an optimized version of ast_escape. When looking only
1979  * for escape_sequences a couple of checks used in the generic case can
1980  * be left out thus making it slightly more efficient.
1981  */
1982  char *p;
1983  char *c;
1984 
1985  if (!dest || !size) {
1986  return dest;
1987  }
1988  if (ast_strlen_zero(s)) {
1989  *dest = '\0';
1990  return dest;
1991  }
1992 
1993  for (p = dest; *s && --size; ++s, ++p) {
1994  /*
1995  * See if the character to escape is part of the standard escape
1996  * sequences. If so use its mapped counterpart.
1997  */
1998  c = strchr(escape_sequences, *s);
1999  if (c) {
2000  if (!--size) {
2001  /* Not enough room left for the escape sequence. */
2002  break;
2003  }
2004 
2005  *p++ = '\\';
2007  } else {
2008  *p = *s;
2009  }
2010  }
2011  *p = '\0';
2012 
2013  return dest;
2014 }

References ast_strlen_zero(), c, escape_sequences, and escape_sequences_map.

Referenced by ast_escape_c_alloc().

◆ ast_escape_c_alloc()

char* ast_escape_c_alloc ( const char *  s)

Escape standard 'C' sequences in the given string.

Note
Caller is responsible for freeing the returned string
Parameters
sthe source string to escape
Returns
Pointer to the escaped string or NULL.

Definition at line 2038 of file main/utils.c.

2039 {
2040  size_t size = 0;
2041  char *dest = escape_alloc(s, &size);
2042 
2043  return ast_escape_c(dest, s, size);
2044 }
char * ast_escape_c(char *dest, const char *s, size_t size)
Escape standard 'C' sequences in the given string.
Definition: main/utils.c:1975

References ast_escape_c(), and escape_alloc().

Referenced by ast_manager_build_channel_state_string_prefix(), channel_new_callerid(), presence_state_to_ami(), and varset_to_ami().

◆ ast_escape_quoted()

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

Escape characters found in a quoted string.

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

Definition at line 781 of file main/utils.c.

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

References out, and string.

Referenced by add_diversion(), add_rpid(), ast_callerid_merge(), ast_sip_modify_id_header(), AST_TEST_DEFINE(), channel_read_pjsip(), create_new_id_hdr(), initreqprep(), print_escaped_uri(), and receive_message().

◆ ast_escape_semicolons()

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

Escape semicolons found in a string.

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

Definition at line 811 of file main/utils.c.

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

References ast_assert, NULL, out, and string.

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

◆ ast_false()

int ast_false ( const char *  val)

Make sure something is false. Determine if a string containing a boolean value is "false". This function checks to see whether a string passed to it is an indication of an "false" value. It checks to see if the string is "no", "false", "n", "f", "off" or "0".

Return values
-1if "true".
0otherwise, like NUL pointer.

Definition at line 2114 of file main/utils.c.

2115 {
2116  if (ast_strlen_zero(s))
2117  return 0;
2118 
2119  /* Determine if this is a false value */
2120  if (!strcasecmp(s, "no") ||
2121  !strcasecmp(s, "false") ||
2122  !strcasecmp(s, "n") ||
2123  !strcasecmp(s, "f") ||
2124  !strcasecmp(s, "0") ||
2125  !strcasecmp(s, "off"))
2126  return -1;
2127 
2128  return 0;
2129 }

References ast_strlen_zero().

Referenced by acf_transaction_write(), actual_load_config(), announce_user_count_all_handler(), aoc_cli_debug_enable(), bool_handler_fn(), boolflag_handler_fn(), build_peer(), build_user(), check_debug(), find_realtime(), function_ooh323_write(), handle_common_options(), init_acf_query(), load_config(), manager_mute_mixmonitor(), manager_queue_member_ringinuse(), parking_feature_flag_cfg(), parse_empty_options(), prack_handler(), process_config(), process_dahdi(), read_pjproject_startup_options(), reload_config(), reload_single_member(), rt_handle_member_record(), rtp_reload(), set_config(), set_insecure_flags(), sip_parse_nat_option(), sla_build_trunk(), strings_to_mask(), and timers_handler().

◆ 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 3003 of file main/utils.c.

3004 {
3005 #if defined(HAVE_EACCESS) || defined(HAVE_EUIDACCESS)
3006 #if defined(HAVE_EUIDACCESS) && !defined(HAVE_EACCESS)
3007 #define eaccess euidaccess
3008 #endif
3009  return eaccess(filename, R_OK) == 0;
3010 #else
3011  int fd = open(filename, O_RDONLY | O_NONBLOCK);
3012  if (fd < 0) {
3013  return 0;
3014  }
3015  close(fd);
3016  return 1;
3017 #endif
3018 }

Referenced by add_email_attachment(), ast_media_cache_retrieve(), ast_rtp_dtls_cfg_parse(), on_load_ca_file(), on_load_ca_path(), and transport_tls_file_handler().

◆ ast_format_duration_hh_mm_ss()

void ast_format_duration_hh_mm_ss ( int  duration,
char *  buf,
size_t  length 
)

Formats a duration into HH:MM:SS.

Since
12
Parameters
durationThe time (in seconds) to format
bufA buffer to hold the formatted string'
lengthThe size of the buffer

Definition at line 2195 of file main/utils.c.

2196 {
2197  int durh, durm, durs;
2198  durh = duration / 3600;
2199  durm = (duration % 3600) / 60;
2200  durs = duration % 60;
2201  snprintf(buf, length, "%02d:%02d:%02d", durh, durm, durs);
2202 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66

References buf.

Referenced by cli_channel_print_body(), cli_channelstats_print_body(), handle_bridge_show_all(), handle_bridge_show_specific(), and show_chanstats_cb().

◆ ast_get_tid()

int ast_get_tid ( void  )

Get current thread ID.

Returns
the ID if platform is supported, else -1

Definition at line 2650 of file main/utils.c.

2651 {
2652  int ret = -1;
2653 #if defined (__linux) && defined(SYS_gettid)
2654  ret = syscall(SYS_gettid); /* available since Linux 1.4.11 */
2655 #elif defined(__sun)
2656  ret = pthread_self();
2657 #elif defined(__APPLE__)
2658  ret = mach_thread_self();
2659  mach_port_deallocate(mach_task_self(), ret);
2660 #elif defined(__FreeBSD__) && defined(HAVE_SYS_THR_H)
2661  long lwpid;
2662  thr_self(&lwpid); /* available since sys/thr.h creation 2003 */
2663  ret = lwpid;
2664 #elif defined(__NetBSD__)
2665  ret = _lwp_self();
2666 #endif
2667  return ret;
2668 }

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

◆ ast_get_time_t()

int ast_get_time_t ( const char *  src,
time_t *  dst,
time_t  _default,
int *  consumed 
)

get values from config variables.

Parse a time (integer) string.

Definition at line 2344 of file main/utils.c.

2345 {
2346  long t;
2347  int scanned;
2348 
2349  if (dst == NULL)
2350  return -1;
2351 
2352  *dst = _default;
2353 
2354  if (ast_strlen_zero(src))
2355  return -1;
2356 
2357  /* only integer at the moment, but one day we could accept more formats */
2358  if (sscanf(src, "%30ld%n", &t, &scanned) == 1) {
2359  *dst = t;
2360  if (consumed)
2361  *consumed = scanned;
2362  return 0;
2363  } else
2364  return -1;
2365 }

References ast_strlen_zero(), and NULL.

Referenced by build_peer(), cache_lookup_internal(), dundi_show_cache(), handle_saydatetime(), load_password(), play_message_datetime(), process_clearcache(), realtime_peer(), and sayunixtime_exec().

◆ ast_get_timeval()

int ast_get_timeval ( const char *  src,
struct timeval *  dst,
struct timeval  _default,
int *  consumed 
)

get values from config variables.

Parse a time (float) string.

Definition at line 2317 of file main/utils.c.

2318 {
2319  long double dtv = 0.0;
2320  int scanned;
2321 
2322  if (dst == NULL)
2323  return -1;
2324 
2325  *dst = _default;
2326 
2327  if (ast_strlen_zero(src))
2328  return -1;
2329 
2330  /* only integer at the moment, but one day we could accept more formats */
2331  if (sscanf(src, "%30Lf%n", &dtv, &scanned) > 0) {
2332  dst->tv_sec = dtv;
2333  dst->tv_usec = (dtv - dst->tv_sec) * 1000000.0;
2334  if (consumed)
2335  *consumed = scanned;
2336  return 0;
2337  } else
2338  return -1;
2339 }

References ast_strlen_zero(), and NULL.

Referenced by acf_strftime(), expiration_str2struct(), persistence_expires_str2struct(), and timeval_str2struct().

◆ ast_gethostbyname()

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

Re-entrant (thread safe) version of gethostbyname that replaces the standard gethostbyname (which is not thread safe)

Thread-safe gethostbyname function to use in Asterisk.

Definition at line 199 of file main/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 }
char buf[1024]
Definition: utils.h:210
struct hostent hp
Definition: utils.h:209

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

◆ ast_inet_ntoa()

const char* ast_inet_ntoa ( struct in_addr  ia)

ast_inet_ntoa: Recursive thread safe replacement of inet_ntoa

thread-safe replacement for inet_ntoa().

Definition at line 928 of file main/utils.c.

929 {
930  char *buf;
931 
932  if (!(buf = ast_threadstorage_get(&inet_ntoa_buf, INET_ADDRSTRLEN)))
933  return "";
934 
935  return inet_ntop(AF_INET, &ia, buf, INET_ADDRSTRLEN);
936 }
static struct ast_threadstorage inet_ntoa_buf
Definition: main/utils.c:85
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.

References ast_threadstorage_get(), buf, and inet_ntoa_buf.

Referenced by _skinny_show_device(), _skinny_show_devices(), _stun_show_status(), add_sdp(), ast_parse_arg(), config_load(), create_client(), find_command(), find_subchannel_and_lock(), get_defaults(), get_to_address(), handle_cli_rtp_settings(), handle_error(), handle_mgcp_show_endpoints(), handle_open_receive_channel_ack_message(), handle_request(), handle_skinny_show_settings(), handle_stun_timeout(), iax_server(), mgcpsock_read(), parsing(), phoneprov_callback(), process_request(), reload_config(), resend_response(), rtp_reload(), score_address(), send_raw_client(), send_request(), send_response(), send_start_rtp(), send_trunk(), show_main_page(), skinny_session(), skinny_session_cleanup(), start_rtp(), stun_monitor_request(), transmit_serverres(), transmit_startmediatransmission(), unistim_show_devices(), unistim_show_info(), and unistimsock_read().

◆ ast_join_delim()

void ast_join_delim ( char *  s,
size_t  len,
const char *const  w[],
unsigned int  size,
char  delim 
)

Join an array of strings into a single string.

Parameters
sthe resulting string buffer
lenthe length of the result buffer, s
wan array of strings to join.
sizethe number of elements to join
delimdelimiter between elements

This function will join all of the strings in the array 'w' into a single string. It will also place 'delim' in the result buffer in between each string from 'w'.

Since
12

Definition at line 2276 of file main/utils.c.

2277 {
2278  int x, ofs = 0;
2279  const char *src;
2280 
2281  /* Join words into a string */
2282  if (!s)
2283  return;
2284  for (x = 0; ofs < len && x < size && w[x] ; x++) {
2285  if (x > 0)
2286  s[ofs++] = delim;
2287  for (src = w[x]; *src && ofs < len; src++)
2288  s[ofs++] = *src;
2289  }
2290  if (ofs == len)
2291  ofs--;
2292  s[ofs] = '\0';
2293 }

References len().

Referenced by ast_sip_auths_to_str().

◆ ast_md5_hash()

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

Produce 32 char MD5 hash of value.

Produces MD5 hash based on input string.

Definition at line 250 of file main/utils.c.

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

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

Referenced by __init_manager(), ast_sip_location_create_contact(), AST_TEST_DEFINE(), auth_exec(), auth_http_callback(), build_nonce(), build_reply_digest(), 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 2377 of file main/utils.c.

2378 {
2379  char *ptr;
2380  int len = strlen(path), count = 0, x, piececount = 0;
2381  char *tmp = ast_strdupa(path);
2382  char **pieces;
2383  char *fullpath = ast_alloca(len + 1);
2384  int res = 0;
2385 
2386  for (ptr = tmp; *ptr; ptr++) {
2387  if (*ptr == '/')
2388  count++;
2389  }
2390 
2391  /* Count the components to the directory path */
2392  pieces = ast_alloca(count * sizeof(*pieces));
2393  for (ptr = tmp; *ptr; ptr++) {
2394  if (*ptr == '/') {
2395  *ptr = '\0';
2396  pieces[piececount++] = ptr + 1;
2397  }
2398  }
2399 
2400  *fullpath = '\0';
2401  for (x = 0; x < piececount; x++) {
2402  /* This looks funky, but the buffer is always ideally-sized, so it's fine. */
2403  strcat(fullpath, "/");
2404  strcat(fullpath, pieces[x]);
2405  res = mkdir(fullpath, mode);
2406  if (res && errno != EEXIST)
2407  return errno;
2408  }
2409  return 0;
2410 }
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition: astmm.h:288
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
static int tmp()
Definition: bt_open.c:389

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

Referenced by ast_file_fdtemp(), ast_logger_rotate_channel(), ast_monitor_change_fname(), ast_monitor_start(), conf_rec_name(), conf_run(), create_destination_directory(), create_dirpath(), dictate_exec(), filename_parse(), init_logger(), 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
Returns -1 if we have no auth or something wrong with digest.
Note
This function may be used for Digest request and responce header. request arg is set to nonzero, if we parse Digest Request. pedantic arg can be set to nonzero if we need to do addition Digest check.

Definition at line 2536 of file main/utils.c.

2536  {
2537  char *c;
2538  struct ast_str *str = ast_str_create(16);
2539 
2540  /* table of recognised keywords, and places where they should be copied */
2541  const struct x {
2542  const char *key;
2543  const ast_string_field *field;
2544  } *i, keys[] = {
2545  { "username=", &d->username },
2546  { "realm=", &d->realm },
2547  { "nonce=", &d->nonce },
2548  { "uri=", &d->uri },
2549  { "domain=", &d->domain },
2550  { "response=", &d->response },
2551  { "cnonce=", &d->cnonce },
2552  { "opaque=", &d->opaque },
2553  /* Special cases that cannot be directly copied */
2554  { "algorithm=", NULL },
2555  { "qop=", NULL },
2556  { "nc=", NULL },
2557  { NULL, 0 },
2558  };
2559 
2560  if (ast_strlen_zero(digest) || !d || !str) {
2561  ast_free(str);
2562  return -1;
2563  }
2564 
2565  ast_str_set(&str, 0, "%s", digest);
2566 
2568 
2569  if (strncasecmp(c, "Digest ", strlen("Digest "))) {
2570  ast_log(LOG_WARNING, "Missing Digest.\n");
2571  ast_free(str);
2572  return -1;
2573  }
2574  c += strlen("Digest ");
2575 
2576  /* lookup for keys/value pair */
2577  while (c && *c && *(c = ast_skip_blanks(c))) {
2578  /* find key */
2579  for (i = keys; i->key != NULL; i++) {
2580  char *src, *separator;
2581  int unescape = 0;
2582  if (strncasecmp(c, i->key, strlen(i->key)) != 0) {
2583  continue;
2584  }
2585 
2586  /* Found. Skip keyword, take text in quotes or up to the separator. */
2587  c += strlen(i->key);
2588  if (*c == '"') {
2589  src = ++c;
2590  separator = "\"";
2591  unescape = 1;
2592  } else {
2593  src = c;
2594  separator = ",";
2595  }
2596  strsep(&c, separator); /* clear separator and move ptr */
2597  if (unescape) {
2598  ast_unescape_c(src);
2599  }
2600  if (i->field) {
2601  ast_string_field_ptr_set(d, i->field, src);
2602  } else {
2603  /* Special cases that require additional processing */
2604  if (!strcasecmp(i->key, "algorithm=")) {
2605  if (strcasecmp(src, "MD5")) {
2606  ast_log(LOG_WARNING, "Digest algorithm: \"%s\" not supported.\n", src);
2607  ast_free(str);
2608  return -1;
2609  }
2610  } else if (!strcasecmp(i->key, "qop=") && !strcasecmp(src, "auth")) {
2611  d->qop = 1;
2612  } else if (!strcasecmp(i->key, "nc=")) {
2613  unsigned long u;
2614  if (sscanf(src, "%30lx", &u) != 1) {
2615  ast_log(LOG_WARNING, "Incorrect Digest nc value: \"%s\".\n", src);
2616  ast_free(str);
2617  return -1;
2618  }
2619  ast_string_field_set(d, nc, src);
2620  }
2621  }
2622  break;
2623  }
2624  if (i->key == NULL) { /* not found, try ',' */
2625  strsep(&c, ",");
2626  }
2627  }
2628  ast_free(str);
2629 
2630  /* Digest checkout */
2631  if (ast_strlen_zero(d->realm) || ast_strlen_zero(d->nonce)) {
2632  /* "realm" and "nonce" MUST be always exist */
2633  return -1;
2634  }
2635 
2636  if (!request) {
2637  /* Additional check for Digest response */
2638  if (ast_strlen_zero(d->username) || ast_strlen_zero(d->uri) || ast_strlen_zero(d->response)) {
2639  return -1;
2640  }
2641 
2642  if (pedantic && d->qop && (ast_strlen_zero(d->cnonce) || ast_strlen_zero(d->nc))) {
2643  return -1;
2644  }
2645  }
2646 
2647  return 0;
2648 }
const char * str
Definition: app_jack.c:147
#define ast_free(a)
Definition: astmm.h:180
static int request(void *obj)
Definition: chan_pjsip.c:2580
char * strsep(char **str, const char *delims)
char * ast_unescape_c(char *src)
Convert some C escape sequences.
Definition: main/utils.c:1881
#define ast_string_field_set(x, field, data)
Set a field to a simple string value.
Definition: stringfields.h:521
const char * ast_string_field
Definition: stringfields.h:190
#define ast_string_field_ptr_set(x, ptr, data)
Set a field to a simple string value.
Definition: stringfields.h:475
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:739
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:640
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:1091
char * ast_skip_blanks(const char *str)
Gets a pointer to the first non-whitespace character in a string.
Definition: strings.h:161
Support for dynamic strings.
Definition: strings.h:604
static struct test_val d

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 2250 of file main/utils.c.

2251 {
2252  char *dataPut = start;
2253  int inEscape = 0;
2254  int inQuotes = 0;
2255 
2256  for (; *start; start++) {
2257  if (inEscape) {
2258  *dataPut++ = *start; /* Always goes verbatim */
2259  inEscape = 0;
2260  } else {
2261  if (*start == '\\') {
2262  inEscape = 1; /* Do not copy \ into the data */
2263  } else if (*start == '\'') {
2264  inQuotes = 1 - inQuotes; /* Do not copy ' into the data */
2265  } else {
2266  /* Replace , with |, unless in quotes */
2267  *dataPut++ = inQuotes ? *start : ((*start == find) ? replace_with : *start);
2268  }
2269  }
2270  }
2271  if (start != dataPut)
2272  *dataPut = 0;
2273  return dataPut;
2274 }

◆ 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 1640 of file main/utils.c.

1643 {
1644  unsigned char attr_destroy = 0;
1645  int res;
1646 
1647  if (!attr) {
1648  attr = ast_alloca(sizeof(*attr));
1649  pthread_attr_init(attr);
1650  attr_destroy = 1;
1651  }
1652 
1653  if ((errno = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_DETACHED)))
1654  ast_log(LOG_WARNING, "pthread_attr_setdetachstate: %s\n", strerror(errno));
1655 
1656  res = ast_pthread_create_stack(thread, attr, start_routine, data,
1657  stacksize, file, caller, line, start_fn);
1658 
1659  if (attr_destroy)
1660  pthread_attr_destroy(attr);
1661 
1662  return res;
1663 }
pthread_t thread
Definition: app_meetme.c:1091
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: main/utils.c:1592

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

◆ ast_pthread_create_stack()

int ast_pthread_create_stack ( pthread_t *  thread,
pthread_attr_t *  attr,
void *(*)(void *)  start_routine,
void *  data,
size_t  stacksize,
const char *  file,
const char *  caller,
int  line,
const char *  start_fn 
)

Definition at line 1592 of file main/utils.c.

1595 {
1596 #if !defined(LOW_MEMORY)
1597  struct thr_arg *a;
1598 #endif
1599 
1600  if (!attr) {
1601  attr = ast_alloca(sizeof(*attr));
1602  pthread_attr_init(attr);
1603  }
1604 
1605 #if defined(__linux__) || defined(__FreeBSD__)
1606  /* On Linux and FreeBSD , pthread_attr_init() defaults to PTHREAD_EXPLICIT_SCHED,
1607  which is kind of useless. Change this here to
1608  PTHREAD_INHERIT_SCHED; that way the -p option to set realtime
1609  priority will propagate down to new threads by default.
1610  This does mean that callers cannot set a different priority using
1611  PTHREAD_EXPLICIT_SCHED in the attr argument; instead they must set
1612  the priority afterwards with pthread_setschedparam(). */
1613  if ((errno = pthread_attr_setinheritsched(attr, PTHREAD_INHERIT_SCHED)))
1614  ast_log(LOG_WARNING, "pthread_attr_setinheritsched: %s\n", strerror(errno));
1615 #endif
1616 
1617  if (!stacksize)
1618  stacksize = AST_STACKSIZE;
1619 
1620  if ((errno = pthread_attr_setstacksize(attr, stacksize ? stacksize : AST_STACKSIZE)))
1621  ast_log(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(errno));
1622 
1623 #if !defined(LOW_MEMORY)
1624  if ((a = ast_malloc(sizeof(*a)))) {
1625  a->start_routine = start_routine;
1626  a->data = data;
1628  if (ast_asprintf(&a->name, "%-20s started at [%5d] %s %s()",
1629  start_fn, line, file, caller) < 0) {
1630  a->name = NULL;
1631  }
1632  data = a;
1633  }
1634 #endif /* !LOW_MEMORY */
1635 
1636  return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
1637 }
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
Definition: astmm.h:267
#define pthread_create
Definition: lock.h:640
static void * dummy_start(void *data)
Definition: main/utils.c:1540
const char * name
void *(* start_routine)(void *)
Definition: main/utils.c:1528
void * data
Definition: main/utils.c:1529
static struct test_val a

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

Referenced by ast_pthread_create_detached_stack().

◆ ast_random()

long int ast_random ( void  )

Definition at line 2210 of file main/utils.c.

2211 {
2212  long int res;
2213 
2214  if (dev_urandom_fd >= 0) {
2215  int read_res = read(dev_urandom_fd, &res, sizeof(res));
2216  if (read_res > 0) {
2217  long int rm = RAND_MAX;
2218  res = res < 0 ? ~res : res;
2219  rm++;
2220  return res % rm;
2221  }
2222  }
2223 
2224  /* XXX - Thread safety really depends on the libc, not the OS.
2225  *
2226  * But... popular Linux libc's (uClibc, glibc, eglibc), all have a
2227  * somewhat thread safe random(3) (results are random, but not
2228  * reproducible). The libc's for other systems (BSD, et al.), not so
2229  * much.
2230  */
2231 #ifdef linux
2232  res = random();
2233 #else
2235  res = random();
2237 #endif
2238  return res;
2239 }
#define ast_mutex_unlock(a)
Definition: lock.h:188
#define ast_mutex_lock(a)
Definition: lock.h:187
static int dev_urandom_fd
Definition: main/utils.c:938
static ast_mutex_t randomlock
Definition: main/utils.c:2207

References ast_mutex_lock, ast_mutex_unlock, dev_urandom_fd, and randomlock.

Referenced by __sip_alloc(), action_challenge(), app_exec(), ast_generate_random_string(), ast_moh_files_next(), ast_rtp_change_source(), ast_rtp_new(), AST_TEST_DEFINE(), ast_udptl_new_with_bindaddr(), astobj2_test_1_helper(), auth_http_callback(), authenticate_request(), build_gateway(), build_iv(), build_localtag_registry(), build_nonce(), build_rand_pad(), build_reply_digest(), 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(), handle_incoming(), handle_response_invite(), iax2_key_rotate(), jingle_add_ice_udp_candidates_to_transport(), jingle_alloc(), jingle_new(), make_email_file(), make_our_tag(), mbl_new(), moh_files_alloc(), multicast_rtp_new(), ogg_vorbis_rewrite(), osp_create_uuid(), page_exec(), process_weights(), reg_source_db(), registry_authrequest(), reqprep(), 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(), start_rtp(), 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(), transmit_invite(), transmit_register(), transmit_response_using_temp(), try_calling(), try_firmware(), websocket_client_create_key(), and websocket_mask_payload().

◆ ast_regex_string_to_regex_pattern()

int ast_regex_string_to_regex_pattern ( const char *  regex_string,
struct ast_str **  regex_pattern 
)

Given a string regex_string in the form of "/regex/", convert it into the form of "regex".

This function will trim one leading / and one trailing / from a given input string ast_str regex_pattern must be preallocated before calling this function

Return values
0on success, non-zero on failure.
1if we only stripped a leading /
2if we only stripped a trailing /
3if we did not strip any / characters
Parameters
regex_stringthe string containing /regex/
regex_patternthe destination ast_str which will contain "regex" after execution

Definition at line 2077 of file main/utils.c.

2078 {
2079  int regex_len = strlen(regex_string);
2080  int ret = 3;
2081 
2082  /* Chop off the leading / if there is one */
2083  if ((regex_len >= 1) && (regex_string[0] == '/')) {
2084  ast_str_set(regex_pattern, 0, "%s", regex_string + 1);
2085  ret -= 2;
2086  }
2087 
2088  /* Chop off the ending / if there is one */
2089  if ((regex_len > 1) && (regex_string[regex_len - 1] == '/')) {
2090  ast_str_truncate(*regex_pattern, -1);
2091  ret -= 1;
2092  }
2093 
2094  return ret;
2095 }
char * ast_str_truncate(struct ast_str *buf, ssize_t len)
Truncates the enclosed string to the given length.
Definition: strings.h:764

References ast_str_set(), and ast_str_truncate().

Referenced by action_hangup(), mwi_mailbox_delete(), and mwi_mailbox_get().

◆ ast_remaining_ms()

int ast_remaining_ms ( struct timeval  start,
int  max_ms 
)

Calculate remaining milliseconds given a starting timestamp and upper bound.

If the upper bound is negative, then this indicates that there is no upper bound on the amount of time to wait. This will result in a negative return.

Parameters
startWhen timing started being calculated
max_msThe maximum number of milliseconds to wait from start. May be negative.
Returns
The number of milliseconds left to wait for. May be negative.

Definition at line 2179 of file main/utils.c.

2180 {
2181  int ms;
2182 
2183  if (max_ms < 0) {
2184  ms = max_ms;
2185  } else {
2186  ms = max_ms - ast_tvdiff_ms(ast_tvnow(), start);
2187  if (ms < 0) {
2188  ms = 0;
2189  }
2190  }
2191 
2192  return ms;
2193 }

References ast_tvdiff_ms(), and ast_tvnow().

Referenced by __analog_ss_thread(), __ast_answer(), __ast_request_and_dial(), analog_ss_thread(), ast_iostream_write(), ast_recvtext(), ast_stun_request(), ast_waitfordigit_full(), disable_t38(), find_cache(), generic_fax_exec(), iostream_read(), parking_set_duration(), read_mf_digits(), read_sf_digits(), receivefax_t38_init(), record_exec(), safe_sleep_conditional(), sendfax_t38_init(), wait_exec(), wait_for_answer(), waitforcond_exec(), and waitforring_exec().

◆ 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 2241 of file main/utils.c.

2242 {
2243  for (; *s; s++) {
2244  if (*s == '^') {
2245  *s = ',';
2246  }
2247  }
2248 }

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 2482 of file main/utils.c.

2483 {
2484  RAII_VAR(char *, absolute_base_path, NULL, ast_std_free);
2485  RAII_VAR(char *, p, NULL, ast_free);
2486 
2487  if (base_path == NULL || path == NULL) {
2488  errno = EFAULT;
2489  return errno;
2490  }
2491 
2492  p = ast_strdup(path);
2493  if (p == NULL) {
2494  errno = ENOMEM;
2495  return errno;
2496  }
2497 
2498  absolute_base_path = realpath(base_path, NULL);
2499  if (absolute_base_path == NULL) {
2500  return errno;
2501  }
2502 
2503  return safe_mkdir(absolute_base_path, p, mode);
2504 }
void ast_std_free(void *ptr)
Definition: astmm.c:1734
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
static int safe_mkdir(const char *base_path, char *path, int mode)
Definition: main/utils.c:2412
#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:936

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 2897 of file main/utils.c.

2898 {
2899  int s;
2900  int i;
2901  struct ifreq *ifr;
2902  struct ifreq *ifrp;
2903  struct ifconf ifc;
2904  char *buf = NULL;
2905  char eid_str[20];
2906  int bufsz, num_interfaces;
2907  unsigned char empty_mac[6] = {0, 0, 0, 0, 0, 0};
2908  unsigned char full_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
2909 
2910  s = socket(AF_INET, SOCK_STREAM, 0);
2911  if (s < 0) {
2912  ast_log(LOG_WARNING, "Unable to open socket for seeding global EID. "
2913  "You will have to set it manually.\n");
2914  return;
2915  }
2916 
2917  ifc.ifc_len = 0;
2918  ifc.ifc_buf = NULL;
2919  if (ioctl(s, SIOCGIFCONF, &ifc) || ifc.ifc_len <= 0) {
2920  ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
2921  "You will have to set it manually.\n");
2922  close(s);
2923  return;
2924  }
2925  bufsz = ifc.ifc_len;
2926 
2927  if (!(buf = ast_malloc(bufsz))) {
2928  ast_log(LOG_WARNING, "Unable to allocate memory for seeding global EID. "
2929  "You will have to set it manually.\n");
2930  close(s);
2931  return;
2932  }
2933 
2934  ifc.ifc_buf = buf;
2935  if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
2936  ast_log(LOG_WARNING, "Unable to retrieve ethernet interfaces for seeding global EID. "
2937  "You will have to set it manually.\n");
2938  ast_free(buf);
2939  close(s);
2940  return;
2941  }
2942 
2943  ifrp = ifc.ifc_req;
2944  num_interfaces = ifc.ifc_len / sizeof(*ifr);
2945 
2946  for (i = 0; i < num_interfaces; i++) {
2947  ifr = &ifrp[i];
2948  if (!ioctl(s, SIOCGIFHWADDR, ifr)) {
2949  unsigned char *hwaddr = (unsigned char *) ifr->ifr_hwaddr.sa_data;
2950 
2951  if (!(memcmp(hwaddr, &empty_mac, 6) && memcmp(hwaddr, &full_mac, 6))) {
2952  continue;
2953  }
2954 
2955  memcpy(eid, hwaddr, sizeof(*eid));
2956  ast_debug(1, "Seeding global EID '%s' from '%s' using 'siocgifhwaddr'\n",
2957  ast_eid_to_str(eid_str, sizeof(eid_str), eid), ifr->ifr_name);
2958  ast_free(buf);
2959  close(s);
2960  return;
2961  }
2962  }
2963 
2964  ast_log(LOG_WARNING, "No ethernet interface found for seeding global EID. "
2965  "You will have to set it manually.\n");
2966  ast_free(buf);
2967  close(s);
2968 
2969  return;
2970 }
if(!yyg->yy_init)
Definition: ast_expr2f.c:868
char * ast_eid_to_str(char *s, int maxlen, struct ast_eid *eid)
Convert an EID to a string.
Definition: main/utils.c:2735

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

Referenced by load_asterisk_conf().

◆ ast_sha1_hash()

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

Produce 40 char SHA1 hash of value.

Produces SHA1 hash based on input string.

Definition at line 266 of file main/utils.c.

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

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

Referenced by add_public_key_to_astdb(), ast_tcptls_server_start(), AST_TEST_DEFINE(), get_path_to_public_key(), handle_call_token(), media_cache_item_sync_to_astdb(), public_key_is_expired(), remove_public_key_from_astdb(), set_public_key_expiration(), sha1(), xmpp_client_authenticate_digest(), and xmpp_component_authenticate().

◆ ast_sha1_hash_uint()

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

Produce a 20 byte SHA1 hash of value.

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

Definition at line 284 of file main/utils.c.

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

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

Referenced by websocket_combine_key().

◆ ast_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 2973 of file main/utils.c.

2974 {
2975  unsigned int eid_int[6];
2976  int x;
2977 
2978  if (sscanf(s, "%2x:%2x:%2x:%2x:%2x:%2x", &eid_int[0], &eid_int[1], &eid_int[2],
2979  &eid_int[3], &eid_int[4], &eid_int[5]) != 6) {
2980  return -1;
2981  }
2982 
2983  for (x = 0; x < 6; x++) {
2984  eid->eid[x] = eid_int[x];
2985  }
2986 
2987  return 0;
2988 }

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

char* ast_strip_quoted ( char *  s,
const char *  beg_quotes,
const char *  end_quotes 
)

Strip leading/trailing whitespace and quotes from a string.

Parameters
sThe string to be stripped (will be modified).
beg_quotesThe list of possible beginning quote characters.
end_quotesThe list of matching ending quote characters.
Returns
The stripped string.

This functions strips all leading and trailing whitespace characters from the input string, and returns a pointer to the resulting string. The string is modified in place.

It can also remove beginning and ending quote (or quote-like) characters, in matching pairs. If the first character of the string matches any character in beg_quotes, and the last character of the string is the matching character in end_quotes, then they are removed from the string.

Examples:

ast_strip_quoted(buf, "\"", "\"");
ast_strip_quoted(buf, "'", "'");
ast_strip_quoted(buf, "[{(", "]})");
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
Definition: main/utils.c:1785

Definition at line 1785 of file main/utils.c.

1786 {
1787  char *e;
1788  char *q;
1789 
1790  s = ast_strip(s);
1791  if ((q = strchr(beg_quotes, *s)) && *q != '\0') {
1792  e = s + strlen(s) - 1;
1793  if (*e == *(end_quotes + (q - beg_quotes))) {
1794  s++;
1795  *e = '\0';
1796  }
1797  }
1798 
1799  return s;
1800 }
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223

References ast_strip().

Referenced by applicationmap_handler(), ast_callerid_parse(), ast_sip_validate_uri_length(), ast_strsep(), dialog_info_generate_body_content(), get_destination(), iftime(), load_values_config(), parse_allowed_methods(), parse_cookies(), parse_dial_string(), pidf_allocate_body(), set_redirecting_reason(), sip_parse_register_line(), and xpidf_allocate_body().

◆ ast_strsep()

char* ast_strsep ( char **  s,
const char  sep,
uint32_t  flags 
)

Act like strsep but ignore separators inside quotes.

Parameters
sPointer to address of the string to be processed. Will be modified and can't be constant.
sepA single character delimiter.
flagsControls post-processing of the result. AST_STRSEP_TRIM trims all leading and trailing whitespace from the result. AST_STRSEP_STRIP does a trim then strips the outermost quotes. You may want to trim again after the strip. Just OR both the TRIM and STRIP flags. AST_STRSEP_UNESCAPE unescapes '\' sequences. AST_STRSEP_ALL does all of the above processing.
Returns
The next token or NULL if done or if there are more than 8 levels of nested quotes.

This function acts like strsep with three exceptions... The separator is a single character instead of a string. Separators inside quotes are treated literally instead of like separators. You can elect to have leading and trailing whitespace and quotes stripped from the result and have '\' sequences unescaped.

Like strsep, ast_strsep maintains no internal state and you can call it recursively using different separators on the same storage.

Also like strsep, for consistent results, consecutive separators are not collapsed so you may get an empty string as a valid result.

Examples:

char *mystr = ast_strdupa("abc=def,ghi='zzz=yyy,456',jkl");
char *token, *token2, *token3;
while((token = ast_strsep(&mystr, ',', AST_STRSEP_STRIP))) {
// 1st token will be aaa=def
// 2nd token will be ghi='zzz=yyy,456'
while((token2 = ast_strsep(&token, '=', AST_STRSEP_STRIP))) {
// 1st token2 will be ghi
// 2nd token2 will be zzz=yyy,456
while((token3 = ast_strsep(&token2, ',', AST_STRSEP_STRIP))) {
// 1st token3 will be zzz=yyy
// 2nd token3 will be 456
// and so on
}
}
// 3rd token will be jkl
}
@ AST_STRSEP_STRIP
Definition: strings.h:255
char * ast_strsep(char **s, const char sep, uint32_t flags)
Act like strsep but ignore separators inside quotes.
Definition: main/utils.c:1802

Definition at line 1802 of file main/utils.c.

1803 {
1804  char *st = *iss;
1805  char *is;
1806  int inquote = 0;
1807  int found = 0;
1808  char stack[8];
1809 
1810  if (ast_strlen_zero(st)) {
1811  return NULL;
1812  }
1813 
1814  memset(stack, 0, sizeof(stack));
1815 
1816  for(is = st; *is; is++) {
1817  if (*is == '\\') {
1818  if (*++is != '\0') {
1819  is++;
1820  } else {
1821  break;
1822  }
1823  }
1824 
1825  if (*is == '\'' || *is == '"') {
1826  if (*is == stack[inquote]) {
1827  stack[inquote--] = '\0';
1828  } else {
1829  if (++inquote >= sizeof(stack)) {
1830  return NULL;
1831  }
1832  stack[inquote] = *is;
1833  }
1834  }
1835 
1836  if (*is == sep && !inquote) {
1837  *is = '\0';
1838  found = 1;
1839  *iss = is + 1;
1840  break;
1841  }
1842  }
1843  if (!found) {
1844  *iss = NULL;
1845  }
1846 
1847  if (flags & AST_STRSEP_STRIP) {
1848  st = ast_strip_quoted(st, "'\"", "'\"");
1849  }
1850 
1851  if (flags & AST_STRSEP_TRIM) {
1852  st = ast_strip(st);
1853  }
1854 
1855  if (flags & AST_STRSEP_UNESCAPE) {
1856  ast_unescape_quoted(st);
1857  }
1858 
1859  return st;
1860 }
void ast_unescape_quoted(char *quote_str)
Unescape quotes in a string.
Definition: main/utils.c:842
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
Definition: main/utils.c:1785
@ AST_STRSEP_TRIM
Definition: strings.h:256
@ AST_STRSEP_UNESCAPE
Definition: strings.h:257

References ast_strip(), ast_strip_quoted(), ast_strlen_zero(), AST_STRSEP_STRIP, AST_STRSEP_TRIM, AST_STRSEP_UNESCAPE, ast_unescape_quoted(), and NULL.

Referenced by AST_TEST_DEFINE(), ast_variable_list_from_string(), does_category_match(), originate_exec(), reload_exec(), and wizard_apply_handler().

◆ 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 3144 of file main/utils.c.

3145 {
3146  int *thread_user_interface;
3147 
3148  thread_user_interface = ast_threadstorage_get(
3149  &thread_user_interface_tl, sizeof(*thread_user_interface));
3150  if (thread_user_interface == NULL) {
3151  ast_log(LOG_ERROR, "Error checking thread's user interface status\n");
3152  /* On error, assume that we are not a user interface thread */
3153  return 0;
3154  }
3155 
3156  return *thread_user_interface;
3157 }
static struct ast_threadstorage thread_user_interface_tl
Definition: main/utils.c:3127

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

Referenced by ast_autoservice_start(), and ast_autoservice_stop().

◆ ast_thread_user_interface_set()

int ast_thread_user_interface_set ( int  is_user_interface)

Set the current thread's user interface status.

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

Definition at line 3129 of file main/utils.c.

3130 {
3131  int *thread_user_interface;
3132 
3133  thread_user_interface = ast_threadstorage_get(
3134  &thread_user_interface_tl, sizeof(*thread_user_interface));
3135  if (thread_user_interface == NULL) {
3136  ast_log(LOG_ERROR, "Error setting user interface status for current thread\n");
3137  return -1;
3138  }
3139 
3140  *thread_user_interface = !!is_user_interface;
3141  return 0;
3142 }

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

Referenced by handle_tcptls_connection().

◆ ast_to_camel_case_delim()

char* ast_to_camel_case_delim ( const char *  s,
const char *  delim 
)

Attempts to convert the given string to camel case using the specified delimiter.

note - returned string needs to be freed

Parameters
sthe string to convert
delimdelimiter to parse out
Returns
The string converted to "CamelCase"
Since
12

Definition at line 2295 of file main/utils.c.

2296 {
2297  char *res = ast_strdup(s);
2298  char *front, *back, *buf = res;
2299  int size;
2300 
2301  front = strtok_r(buf, delim, &back);
2302 
2303  while (front) {
2304  size = strlen(front);
2305  *front = toupper(*front);
2306  ast_copy_string(buf, front, size + 1);
2307  buf += size;
2308  front = strtok_r(NULL, delim, &back);
2309  }
2310 
2311  return res;
2312 }

References ast_copy_string(), ast_strdup, buf, and NULL.

◆ ast_true()

int ast_true ( const char *  val)

Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".

Return values
-1if "true".
0otherwise, like NULL pointer.

Definition at line 2097 of file main/utils.c.

2098 {
2099  if (ast_strlen_zero(s))
2100  return 0;
2101 
2102  /* Determine if this is a true value */
2103  if (!strcasecmp(s, "yes") ||
2104  !strcasecmp(s, "true") ||
2105  !strcasecmp(s, "y") ||
2106  !strcasecmp(s, "t") ||
2107  !strcasecmp(s, "1") ||
2108  !strcasecmp(s, "on"))
2109  return -1;
2110 
2111  return 0;
2112 }

References ast_strlen_zero().

Referenced by __ast_http_load(), __init_manager(), acf_curlopt_write(), acf_transaction_write(), action_agent_logoff(), action_originate(), action_status(), action_updateconfig(), actual_load_config(), agent_login_channel_config(), announce_user_count_all_handler(), aoc_cli_debug_enable(), apply_general_options(), apply_option(), ast_ari_bridges_add_channel_cb(), ast_ari_bridges_record_cb(), ast_ari_channels_record_cb(), ast_ari_events_event_websocket_ws_attempted_cb(), ast_ari_events_event_websocket_ws_established_cb(), ast_bridge_timelimit(), ast_jb_read_conf(), ast_rtp_dtls_cfg_parse(), AST_TEST_DEFINE(), ast_tls_read_conf(), autopause2int(), bool_handler_fn(), boolflag_handler_fn(), build_calendar(), build_device(), build_gateway(), build_peer(), build_user(), cdr_prop_write_callback(), check_debug(), client_bitfield_handler(), config_parse_variables(), custom_bitfield_handler(), customopt_handler(), encoding_format_handler(), festival_exec(), func_channel_write_real(), func_mute_write(), function_ooh323_write(), get_encrypt_methods(), global_bitfield_handler(), handle_common_options(), handle_logger_set_level(), handle_t38_options(), init_logger_chain(), internal_feature_write(), is_variable_true(), load_asterisk_conf(), load_config(), load_config_meetme(), load_module(), load_moh_classes(), load_odbc_config(), load_users(), loader_config_init(), manager_add_queue_member(), manager_dialplan_extension_add(), manager_mute_mixmonitor(), manager_mutestream(), manager_pause_queue_member(), manager_play_dtmf(), manager_queue_member_ringinuse(), mbl_load_adapter(), mbl_load_device(), message_template_build(), moh_parse_options(), new_realtime_sqlite3_db(), odbc_load_module(), osp_load(), osplookup_exec(), parse_config(), parse_empty_options(), parse_line(), pbx_load_config(), pbx_load_users(), permit_dtmf_interrupt(), pjsip_acf_moh_passthrough_write(), pjsip_set_logger_verbose(), prack_handler(), process_dahdi(), process_echocancel(), process_my_load_module(), profile_set_param(), queue_rules_set_global_params(), queue_set_global_params(), queue_set_param(), realtime_directory(), reload_config(), reload_followme(), reload_module(), reload_single_member(), rt_handle_member_record(), rtp_reload(), run_startup_commands(), sayunixtime_exec(), search_directory(), search_directory_sub(), set_active(), set_config(), sla_load_config(), smdi_load(), sorcery_config_open(), sorcery_memory_cache_ami_stale_object(), sorcery_memory_cache_open(), speex_write(), start_monitor_action(), strings_to_mask(), tds_load_module(), timers_handler(), transport_tls_bool_handler(), xfer_set(), xmldoc_get_syntax_cmd(), xmldoc_get_syntax_config_object(), xmldoc_get_syntax_fun(), and xmldoc_get_syntax_manager().

◆ ast_tvadd()

struct timeval ast_tvadd ( struct timeval  a,
struct timeval  b 
)

Returns the sum of two timevals a + b.

Definition at line 2114 of file main/utils.c.

2152 {
2153  /* consistency checks to guarantee usec in 0..999999 */
2154  a = tvfix(a);
2155  b = tvfix(b);
2156  a.tv_sec += b.tv_sec;
2157  a.tv_usec += b.tv_usec;
2158  if (a.tv_usec >= ONE_MILLION) {
2159  a.tv_sec++;
2160  a.tv_usec -= ONE_MILLION;
2161  }
2162  return a;
2163 }
#define ONE_MILLION
Definition: main/utils.c:2131
static struct timeval tvfix(struct timeval a)
Definition: main/utils.c:2136
static struct test_val b

◆ ast_tvsub()

struct timeval ast_tvsub ( struct timeval  a,
struct timeval  b 
)

Returns the difference of two timevals a - b.

Definition at line 2114 of file main/utils.c.

2166 {
2167  /* consistency checks to guarantee usec in 0..999999 */
2168  a = tvfix(a);
2169  b = tvfix(b);
2170  a.tv_sec -= b.tv_sec;
2171  a.tv_usec -= b.tv_usec;
2172  if (a.tv_usec < 0) {
2173  a.tv_sec-- ;
2174  a.tv_usec += ONE_MILLION;
2175  }
2176  return a;
2177 }

◆ ast_unescape_c()

char* ast_unescape_c ( char *  s)

Convert some C escape sequences.

(\b\f\n\r\t) 

into the equivalent characters. The string to be converted (will be modified).

Returns
The converted string.

Definition at line 1881 of file main/utils.c.

1882 {
1883  char c, *ret, *dst;
1884 
1885  if (src == NULL)
1886  return NULL;
1887  for (ret = dst = src; (c = *src++); *dst++ = c ) {
1888  if (c != '\\')
1889  continue; /* copy char at the end of the loop */
1890  switch ((c = *src++)) {
1891  case '\0': /* special, trailing '\' */
1892  c = '\\';
1893  break;
1894  case 'b': /* backspace */
1895  c = '\b';
1896  break;
1897  case 'f': /* form feed */
1898  c = '\f';
1899  break;
1900  case 'n':
1901  c = '\n';
1902  break;
1903  case 'r':
1904  c = '\r';
1905  break;
1906  case 't':
1907  c = '\t';
1908  break;
1909  }
1910  /* default, use the char literally */
1911  }
1912  *dst = '\0';
1913  return ret;
1914 }

References c, and NULL.

Referenced by ast_parse_digest().

◆ ast_unescape_quoted()

void ast_unescape_quoted ( char *  quote_str)

Unescape quotes in a string.

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

Definition at line 842 of file main/utils.c.

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

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

◆ ast_unescape_semicolon()

char* ast_unescape_semicolon ( char *  s)

Strip backslash for "escaped" semicolons, the string to be stripped (will be modified).

Returns
The stripped string.

Definition at line 1862 of file main/utils.c.

1863 {
1864  char *e;
1865  char *work = s;
1866 
1867  while ((e = strchr(work, ';'))) {
1868  if ((e > work) && (*(e-1) == '\\')) {
1869  memmove(e - 1, e, strlen(e) + 1);
1870  work = e;
1871  } else {
1872  work = e + 1;
1873  }
1874  }
1875 
1876  return s;
1877 }

Referenced by sip_cli_notify().

◆ ast_uri_decode()

void ast_uri_decode ( char *  s,
struct ast_flags  spec 
)

Decode URI, URN, URL (overwrite string)

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

Definition at line 762 of file main/utils.c.

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

References ast_test_flag, AST_URI_LEGACY_SPACE, and tmp().

Referenced by acf_curl_helper(), ast_ari_invoke(), ast_http_get_post_vars(), AST_TEST_DEFINE(), config_curl(), get_name_and_number(), get_refer_info(), handle_request_invite(), handle_uri(), parse_moved_contact(), realtime_curl(), realtime_multi_curl(), sip_new(), sip_uri_cmp(), and uridecode().

◆ ast_uri_encode()

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

Turn text string to URI-encoded XX version.

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

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

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

Definition at line 723 of file main/utils.c.

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

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

Referenced by add_diversion(), add_rpid(), ast_ari_bridges_record(), ast_ari_channels_record(), AST_TEST_DEFINE(), build_contact(), config_curl(), destroy_curl(), initreqprep(), realtime_curl(), realtime_multi_curl(), require_curl(), store_curl(), update2_curl(), update_curl(), and uriencode().

◆ ast_utils_init()

int ast_utils_init ( void  )

Definition at line 2515 of file main/utils.c.

2516 {
2517  dev_urandom_fd = open("/dev/urandom", O_RDONLY);
2518  base64_init();
2519 #ifdef DEBUG_THREADS
2520 #if !defined(LOW_MEMORY)
2521  ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli));
2522 #endif
2523 #endif
2525  return 0;
2526 }
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: main/utils.c:2506
static void base64_init(void)
Definition: main/utils.c:540
#define ARRAY_LEN(a)
Definition: utils.h:661

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 2670 of file main/utils.c.

2671 {
2672  const char *envPATH = getenv("PATH");
2673  char *tpath, *path;
2674  struct stat unused;
2675  if (!envPATH) {
2676  return NULL;
2677  }
2678  tpath = ast_strdupa(envPATH);
2679  while ((path = strsep(&tpath, ":"))) {
2680  snprintf(fullpath, fullpath_size, "%s/%s", path, binary);
2681  if (!stat(fullpath, &unused)) {
2682  return fullpath;
2683  }
2684  }
2685  return NULL;
2686 }

References ast_strdupa, NULL, and strsep().

◆ ast_wait_for_input()

int ast_wait_for_input ( int  fd,
int  ms 
)

Definition at line 1665 of file main/utils.c.

1666 {
1667  struct pollfd pfd[1];
1668 
1669  memset(pfd, 0, sizeof(pfd));
1670  pfd[0].fd = fd;
1671  pfd[0].events = POLLIN | POLLPRI;
1672  return ast_poll(pfd, 1, ms);
1673 }
#define ast_poll(a, b, c)
Definition: poll-compat.h:88

References ast_poll.

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

◆ ast_wait_for_output()

int ast_wait_for_output ( int  fd,
int  ms 
)

Definition at line 1675 of file main/utils.c.

1676 {
1677  struct pollfd pfd[1];
1678 
1679  memset(pfd, 0, sizeof(pfd));
1680  pfd[0].fd = fd;
1681  pfd[0].events = POLLOUT;
1682  return ast_poll(pfd, 1, ms);
1683 }

References ast_poll.

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

◆ ast_xml_escape()

int ast_xml_escape ( const char *  string,
char *  outbuf,
size_t  buflen 
)

Escape reserved characters for use in XML.

ast_xml_escape

If outbuf is too short, the output string will be truncated. Regardless, the output will always be null terminated.

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

Definition at line 864 of file main/utils.c.

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

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

Referenced by ast_http_create_response(), state_notify_build_xml(), and test_xml().

◆ base64_init()

static void base64_init ( void  )
static

Definition at line 540 of file main/utils.c.

541 {
542  int x;
543  memset(b2a, -1, sizeof(b2a));
544  memset(b2a_url, -1, sizeof(b2a_url));
545  /* Initialize base-64 Conversion table */
546  for (x = 0; x < 26; x++) {
547  /* A-Z */
548  base64[x] = 'A' + x;
549  base64url[x] = 'A' + x;
550  b2a['A' + x] = x;
551  b2a_url['A' + x] = x;
552  /* a-z */
553  base64[x + 26] = 'a' + x;
554  base64url[x + 26] = 'a' + x;
555  b2a['a' + x] = x + 26;
556  b2a_url['a' + x] = x + 26;
557  /* 0-9 */
558  if (x < 10) {
559  base64[x + 52] = '0' + x;
560  base64url[x + 52] = '0' + x;
561  b2a['0' + x] = x + 52;
562  b2a_url['0' + x] = x + 52;
563  }
564  }
565  base64[62] = '+';
566  base64[63] = '/';
567  base64url[62] = '-';
568  base64url[63] = '_';
569  b2a[(int)'+'] = 62;
570  b2a[(int)'/'] = 63;
571  b2a_url[(int)'-'] = 62;
572  b2a_url[(int)'_'] = 63;
573 }

References b2a, b2a_url, base64, and base64url.

Referenced by ast_utils_init().

◆ dummy_start()

static void* dummy_start ( void *  data)
static

Definition at line 1540 of file main/utils.c.

1541 {
1542  void *ret;
1543  struct thr_arg a = *((struct thr_arg *) data); /* make a local copy */
1544 #ifdef DEBUG_THREADS
1545  struct thr_lock_info *lock_info;
1546  pthread_mutexattr_t mutex_attr;
1547 
1548  if (!(lock_info = ast_threadstorage_get(&thread_lock_info, sizeof(*lock_info))))
1549  return NULL;
1550 
1551  lock_info->thread_id = pthread_self();
1552  lock_info->lwp = ast_get_tid();
1553  lock_info->thread_name = ast_strdup(a.name);
1554 
1555  pthread_mutexattr_init(&mutex_attr);
1556  pthread_mutexattr_settype(&mutex_attr, AST_MUTEX_KIND);
1557  pthread_mutex_init(&lock_info->lock, &mutex_attr);
1558  pthread_mutexattr_destroy(&mutex_attr);
1559 
1560  pthread_mutex_lock(&lock_infos_lock.mutex); /* Intentionally not the wrapper */
1561  AST_LIST_INSERT_TAIL(&lock_infos, lock_info, entry);
1562  pthread_mutex_unlock(&lock_infos_lock.mutex); /* Intentionally not the wrapper */
1563 #endif /* DEBUG_THREADS */
1564 
1565  /* note that even though data->name is a pointer to allocated memory,
1566  we are not freeing it here because ast_register_thread is going to
1567  keep a copy of the pointer and then ast_unregister_thread will
1568  free the memory
1569  */
1570  ast_free(data);
1572  pthread_cleanup_push(ast_unregister_thread, (void *) pthread_self());
1573 
1574  ret = a.start_routine(a.data);
1575 
1576  pthread_cleanup_pop(1);
1577 
1578  return ret;
1579 }
static const struct ast_datastore_info lock_info
Definition: func_lock.c:115
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Definition: linkedlists.h:731
#define pthread_mutex_lock
Definition: lock.h:623
#define AST_MUTEX_KIND
Definition: lock.h:77
#define pthread_mutex_unlock
Definition: lock.h:624
#define pthread_mutex_init
Definition: lock.h:626
int ast_get_tid(void)
Get current thread ID.
Definition: main/utils.c:2650
Definition: search.h:40
void ast_register_thread(char *name)
Definition: asterisk.c:414
void ast_unregister_thread(void *id)
Definition: asterisk.c:430

References a, ast_free, ast_get_tid(), AST_LIST_INSERT_TAIL, AST_MUTEX_KIND, ast_register_thread(), ast_strdup, ast_threadstorage_get(), ast_unregister_thread(), thr_arg::data, lock_info, test_val::name, NULL, pthread_mutex_init, pthread_mutex_lock, and pthread_mutex_unlock.

Referenced by ast_pthread_create_stack().

◆ escape_alloc()

static char* escape_alloc ( const char *  s,
size_t *  size 
)
static

Definition at line 2016 of file main/utils.c.

2017 {
2018  if (!s) {
2019  return NULL;
2020  }
2021 
2022  /*
2023  * The result string needs to be twice the size of the given
2024  * string just in case every character in it needs to be escaped.
2025  */
2026  *size = strlen(s) * 2 + 1;
2027  return ast_malloc(*size);
2028 }

References ast_malloc, and NULL.

Referenced by ast_escape_alloc(), and ast_escape_c_alloc().

◆ inbuf()

static int inbuf ( struct baseio bio,
FILE *  fi 
)
static

utility used by inchar(), for base_encode()

Definition at line 590 of file main/utils.c.

591 {
592  int l;
593 
594  if (bio->ateof) {
595  return 0;
596  }
597 
598  if ((l = fread(bio->iobuf, 1, BASEMAXINLINE, fi)) != BASEMAXINLINE) {
599  bio->ateof = 1;
600  if (l == 0) {
601  /* Assume EOF */
602  return 0;
603  }
604  }
605 
606  bio->iolen = l;
607  bio->iocp = 0;
608 
609  return 1;
610 }
int iolen
Definition: main/utils.c:581
unsigned char iobuf[BASEMAXINLINE]
Definition: main/utils.c:584
int ateof
Definition: main/utils.c:583
int iocp
Definition: main/utils.c:580

References baseio::ateof, BASEMAXINLINE, baseio::iobuf, baseio::iocp, and baseio::iolen.

Referenced by analys_(), ast_eivr_getvariable(), ast_eivr_setvariable(), find_sequence(), inchar(), lpfilt_(), netconsole(), preemp_(), sip_addheader(), sip_removeheader(), term_color(), term_strip(), voicin_(), and vparms_().

◆ inchar()

static int inchar ( struct baseio bio,
FILE *  fi 
)
static

utility used by base_encode()

Definition at line 615 of file main/utils.c.

616 {
617  if (bio->iocp >= bio->iolen) {
618  if (!inbuf(bio, fi)) {
619  return EOF;
620  }
621  }
622 
623  return bio->iobuf[bio->iocp++];
624 }
static int inbuf(struct baseio *bio, FILE *fi)
utility used by inchar(), for base_encode()
Definition: main/utils.c:590

References inbuf(), baseio::iobuf, baseio::iocp, and baseio::iolen.

Referenced by ast_base64_encode_file().

◆ ochar()

static int ochar ( struct baseio bio,
int  c,
FILE *  so,
const char *  endl 
)
static

utility used by base_encode()

Definition at line 629 of file main/utils.c.

630 {
631  if (bio->linelength >= BASELINELEN) {
632  if (fputs(endl, so) == EOF) {
633  return -1;
634  }
635 
636  bio->linelength = 0;
637  }
638 
639  if (putc(((unsigned char) c), so) == EOF) {
640  return -1;
641  }
642 
643  bio->linelength++;
644 
645  return 1;
646 }
#define BASELINELEN
Definition: main/utils.c:575
int linelength
Definition: main/utils.c:582

References BASELINELEN, c, and baseio::linelength.

Referenced by ast_base64_encode_file().

◆ safe_mkdir()

static int safe_mkdir ( const char *  base_path,
char *  path,
int  mode 
)
static

Definition at line 2412 of file main/utils.c.

2413 {
2414  RAII_VAR(char *, absolute_path, NULL, ast_std_free);
2415 
2416  absolute_path = realpath(path, NULL);
2417 
2418  if (absolute_path) {
2419  /* Path exists, but is it in the right place? */
2420  if (!ast_begins_with(absolute_path, base_path)) {
2421  return EPERM;
2422  }
2423 
2424  /* It is in the right place! */
2425  return 0;
2426  } else {
2427  /* Path doesn't exist. */
2428 
2429  /* The slash terminating the subpath we're checking */
2430  char *path_term = strchr(path, '/');
2431  /* True indicates the parent path is within base_path */
2432  int parent_is_safe = 0;
2433  int res;
2434 
2435  while (path_term) {
2436  RAII_VAR(char *, absolute_subpath, NULL, ast_std_free);
2437 
2438  /* Truncate the path one past the slash */
2439  char c = *(path_term + 1);
2440  *(path_term + 1) = '\0';
2441  absolute_subpath = realpath(path, NULL);
2442 
2443  if (absolute_subpath) {
2444  /* Subpath exists, but is it safe? */
2445  parent_is_safe = ast_begins_with(
2446  absolute_subpath, base_path);
2447  } else if (parent_is_safe) {
2448  /* Subpath does not exist, but parent is safe
2449  * Create it */
2450  res = mkdir(path, mode);
2451  if (res != 0) {
2452  ast_assert(errno != EEXIST);
2453  return errno;
2454  }
2455  } else {
2456  /* Subpath did not exist, parent was not safe
2457  * Fail! */
2458  errno = EPERM;
2459  return errno;
2460  }
2461  /* Restore the path */
2462  *(path_term + 1) = c;
2463  /* Move on to the next slash */
2464  path_term = strchr(path_term + 1, '/');
2465  }
2466 
2467  /* Now to build the final path, but only if it's safe */
2468  if (!parent_is_safe) {
2469  errno = EPERM;
2470  return errno;
2471  }
2472 
2473  res = mkdir(path, mode);
2474  if (res != 0 && errno != EEXIST) {
2475  return errno;
2476  }
2477 
2478  return 0;
2479  }
2480 }
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_assert, ast_begins_with(), ast_std_free(), c, errno, NULL, and RAII_VAR.

Referenced by ast_safe_mkdir().

◆ tvfix()

static struct timeval tvfix ( struct timeval  a)
static

Definition at line 2114 of file main/utils.c.

2137 {
2138  if (a.tv_usec >= ONE_MILLION) {
2139  ast_log(LOG_WARNING, "warning too large timestamp %ld.%ld\n",
2140  (long)a.tv_sec, (long int) a.tv_usec);
2141  a.tv_sec += a.tv_usec / ONE_MILLION;
2142  a.tv_usec %= ONE_MILLION;
2143  } else if (a.tv_usec < 0) {
2144  ast_log(LOG_WARNING, "warning negative timestamp %ld.%ld\n",
2145  (long)a.tv_sec, (long int) a.tv_usec);
2146  a.tv_usec = 0;
2147  }
2148  return a;
2149 }

◆ utils_shutdown()

static void utils_shutdown ( void  )
static

Definition at line 2506 of file main/utils.c.

2507 {
2508  close(dev_urandom_fd);
2509  dev_urandom_fd = -1;
2510 #if defined(DEBUG_THREADS) && !defined(LOW_MEMORY)
2511  ast_cli_unregister_multiple(utils_cli, ARRAY_LEN(utils_cli));
2512 #endif
2513 }
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30

References ARRAY_LEN, ast_cli_unregister_multiple(), and dev_urandom_fd.

Referenced by ast_utils_init().

◆ wait_for_output()

static int wait_for_output ( int  fd,
int  timeoutms 
)
static

Definition at line 1685 of file main/utils.c.

1686 {
1687  struct pollfd pfd = {
1688  .fd = fd,
1689  .events = POLLOUT,
1690  };
1691  int res;
1692  struct timeval start = ast_tvnow();
1693  int elapsed = 0;
1694 
1695  /* poll() until the fd is writable without blocking */
1696  while ((res = ast_poll(&pfd, 1, timeoutms - elapsed)) <= 0) {
1697  if (res == 0) {
1698  /* timed out. */
1699 #ifndef STANDALONE
1700  ast_debug(1, "Timed out trying to write\n");
1701 #endif
1702  return -1;
1703  } else if (res == -1) {
1704  /* poll() returned an error, check to see if it was fatal */
1705 
1706  if (errno == EINTR || errno == EAGAIN) {
1707  elapsed = ast_tvdiff_ms(ast_tvnow(), start);
1708  if (elapsed >= timeoutms) {
1709  return -1;
1710  }
1711  /* This was an acceptable error, go back into poll() */
1712  continue;
1713  }
1714 
1715  /* Fatal error, bail. */
1716  ast_log(LOG_ERROR, "poll returned error: %s\n", strerror(errno));
1717 
1718  return -1;
1719  }
1720  elapsed = ast_tvdiff_ms(ast_tvnow(), start);
1721  if (elapsed >= timeoutms) {
1722  return -1;
1723  }
1724  }
1725 
1726  return 0;
1727 }

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

Referenced by ast_carefulwrite().

Variable Documentation

◆ ast_uri_http

const struct ast_flags ast_uri_http = {AST_URI_UNRESERVED}

◆ ast_uri_http_legacy

const struct ast_flags ast_uri_http_legacy = {AST_URI_LEGACY_SPACE | AST_URI_UNRESERVED}

◆ ast_uri_sip_user

const struct ast_flags ast_uri_sip_user = {AST_URI_UNRESERVED | AST_URI_SIP_USER_UNRESERVED}

◆ b2a

char b2a[256]
static

Definition at line 82 of file main/utils.c.

Referenced by ast_base64decode(), and base64_init().

◆ b2a_url

char b2a_url[256]
static

Definition at line 83 of file main/utils.c.

Referenced by ast_base64url_decode(), and base64_init().

◆ base64

char base64[64]
static

◆ base64url

char base64url[64]
static

Definition at line 81 of file main/utils.c.

Referenced by ast_base64url_encode_full(), and base64_init().

◆ dev_urandom_fd

int dev_urandom_fd = -1
static

Definition at line 938 of file main/utils.c.

Referenced by ast_random(), ast_utils_init(), ast_uuid_init(), and utils_shutdown().

◆ escape_sequences

char escape_sequences[]
Initial value:
= {
'\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '\'', '\"', '\?', '\0'
}

Definition at line 1920 of file main/utils.c.

Referenced by ast_escape(), and ast_escape_c().

◆ escape_sequences_map

char escape_sequences_map[]
static
Initial value:
= {
'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"', '?', '\0'
}

Definition at line 1928 of file main/utils.c.

Referenced by ast_escape(), and ast_escape_c().

◆ inet_ntoa_buf

struct ast_threadstorage inet_ntoa_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_inet_ntoa_buf , .custom_init = NULL , }
static

Definition at line 85 of file main/utils.c.

Referenced by ast_inet_ntoa().

◆ randomlock

ast_mutex_t randomlock = { PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP , NULL, {1, 0} }
static

Definition at line 2207 of file main/utils.c.

Referenced by ast_random().

◆ thread_user_interface_tl

struct ast_threadstorage thread_user_interface_tl = { .once = PTHREAD_ONCE_INIT , .key_init = __init_thread_user_interface_tl , .custom_init = NULL , }
static

Definition at line 3127 of file main/utils.c.

Referenced by ast_thread_is_user_interface(), and ast_thread_user_interface_set().