General-purpose utility functions

## Files

file | defs.h
file | panic.h
file | utils.h
file | macaddr.c
file | panic.c
file | plugin.c
file | strrb.c
file | utils.c

## Data Structures

struct | value_string
| A mapping between human-readable string and numeric value. More...

## Macros

#define | OSMO_GNUC_PREREQ(maj, min) 0
| Check for gcc and version. More...
#define | OSMO_DEPRECATED(text)
| Set the deprecated attribute with a message. More...
#define | OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE OSMO_DEPRECATED("For internal use inside libosmocore only.")
#define | ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
| Determine number of elements in an array of static size. More...
#define | OSMO_MAX(a, b) ((a) >= (b) ? (a) : (b))
| Return the maximum of two specified values. More...
#define | OSMO_MIN(a, b) ((a) >= (b) ? (b) : (a))
| Return the minimum of two specified values. More...
#define | OSMO_STRINGIFY(x) #x
| Stringify the name of a macro x, e.g. More...
#define | OSMO_STRINGIFY_VAL(x) OSMO_STRINGIFY(x)
| Stringify the value of a macro x, e.g. More...
#define | OSMO_VALUE_STRING(x) { x, #x }
| Make a value_string entry from an enum value name. More...
#define | OSMO_BYTES_FOR_BITS(BITS) ((BITS + 8 - 1) / 8)
| Number of bytes necessary to store given BITS. More...
#define | OSMO_STRLCPY_ARRAY(array, src) osmo_strlcpy(array, src, sizeof(array))
| Copy a C-string into a sized buffer using sizeof to detect buffer's size. More...
#define | osmo_static_assert(exp, name) typedef int dummy##name [(exp) ? 1 : -1] __attribute__((__unused__));
#define | OSMO_SNPRINTF_RET(ret, rem, offset, len)
#define | OSMO_ASSERT(exp)
| Helper macro to terminate when an assertion failes. More...
#define | osmo_talloc_asprintf(ctx, dest, fmt, args ...)
| Append to a string and re-/allocate if necessary. More...

## Typedefs

typedef void(* | osmo_panic_handler_t) (const char *fmt, va_list args)
| panic handler callback function type More...

## Functions

void | osmo_panic (const char *fmt,...)
| Terminate the current program with a panic. More...
void | osmo_set_panic_handler (osmo_panic_handler_t h)
| Set the panic handler. More...
const char * | get_value_string (const struct value_string *vs, uint32_t val)
| get human-readable string for given value More...
const char * | get_value_string_or_null (const struct value_string *vs, uint32_t val)
| get human-readable string or NULL for given value More...
int | get_string_value (const struct value_string *vs, const char *str)
| get numeric value for given human-readable string More...
char | osmo_bcd2char (uint8_t bcd)
| Convert BCD-encoded digit into printable character. More...
uint8_t | osmo_char2bcd (char c)
| Convert number in ASCII to BCD value. More...
int | osmo_hexparse (const char *str, uint8_t *b, int max_len)
| Parse a string containing hexadecimal digits. More...
char * | osmo_ubit_dump (const uint8_t *bits, unsigned int len)
| Convert a sequence of unpacked bits to ASCII string. More...
char * | osmo_hexdump (const unsigned char *buf, int len)
| Convert binary sequence to hexadecimal ASCII string. More...
char * | osmo_hexdump_nospc (const unsigned char *buf, int len)
| Convert binary sequence to hexadecimal ASCII string. More...
char * | osmo_osmo_hexdump_nospc (const unsigned char *buf, int len) __attribute__((__deprecated__))
void | osmo_str2lower (char *out, const char *in)
| Convert an entire string to lower case. More...
void | osmo_str2upper (char *out, const char *in)
| Convert an entire string to upper case. More...
static void | osmo_talloc_replace_string (void *ctx, char **dst, const char *newstr)
| duplicate a string using talloc and release its prior content (if any) More...
int | osmo_constant_time_cmp (const uint8_t *exp, const uint8_t *rel, const int count)
| Wishful thinking to generate a constant time compare. More...
uint64_t | osmo_decode_big_endian (const uint8_t *data, size_t data_len)
| Generic retrieval of 1..8 bytes as big-endian uint64_t. More...
uint8_t * | osmo_encode_big_endian (uint64_t value, size_t data_len)
| Generic big-endian encoding of big endian number up to 64bit. More...
size_t | osmo_strlcpy (char *dst, const char *src, size_t siz)
| Copy a C-string into a sized buffer. More...
bool | osmo_is_hexstr (const char *str, int min_digits, int max_digits, bool require_even)
| Validate that a given string is a hex string within given size limits. More...
bool | osmo_identifier_valid (const char *str)
| Determine if a given identifier is valid, i.e. More...
bool | osmo_separated_identifiers_valid (const char *str, const char *sep_chars)
| Determine if a given identifier is valid, i.e. More...
const char * | osmo_escape_str (const char *str, int in_len)
| Return the string with all non-printable characters escaped. More...
const char * | osmo_escape_str_buf (const char *str, int in_len, char *buf, size_t bufsize)
| Return the string with all non-printable characters escaped. More...
const char * | osmo_quote_str (const char *str, int in_len)
const char * | osmo_quote_str_buf (const char *str, int in_len, char *buf, size_t bufsize)
| Like osmo_escape_str(), but returns double-quotes around a string, or "NULL" for a NULL string. More...
uint32_t | osmo_isqrt32 (uint32_t x)
| perform an integer square root operation on unsigned 32bit integer. More...
int | osmo_macaddr_parse (uint8_t *out, const char *in)
| Parse a MAC address from human-readable notation This function parses an ethernet MAC address in the commonly-used hex/colon notation (00:00:00:00:00:00) and generates the binary representation from it. More...
int | osmo_get_macaddr (uint8_t *mac_out, const char *dev_name)
| Obtain the MAC address of a given network device. More...
static void | osmo_panic_default (const char *fmt, va_list args)
int | osmo_plugin_load_all (const char *directory)
| Load all plugins available in given directory. More...
struct osmo_strrb * | osmo_strrb_create (TALLOC_CTX *ctx, size_t rb_size)
| Create an empty, initialized osmo_strrb. More...
bool | osmo_strrb_is_empty (const struct osmo_strrb *rb)
| Check if an osmo_strrb is empty. More...
const char * | osmo_strrb_get_nth (const struct osmo_strrb *rb, unsigned int string_index)
| Return a pointer to the Nth string in the osmo_strrb. More...
bool | _osmo_strrb_is_bufindex_valid (const struct osmo_strrb *rb, unsigned int bufi)
size_t | osmo_strrb_elements (const struct osmo_strrb *rb)
| Count the number of log messages in an osmo_strrb. More...
int | osmo_strrb_add (struct osmo_strrb *rb, const char *data)
| Add a string to the osmo_strrb. More...
static char * | _osmo_hexdump (const unsigned char *buf, int len, char *delim)
char | alias ("osmo_hexdump_nospc")))

## Variables

static osmo_panic_handler_t | osmo_panic_handler = (void*)0
static char | namebuf [255]
static char | hexd_buff [4096]
static const char | hex_chars [] = "0123456789abcdef"

## Detailed Description

various utility routines

## Macro Definition Documentation

## ARRAY_SIZE

#define ARRAY_SIZE | ( |  | x | ) | (sizeof(x) / sizeof((x)[0]))

Determine number of elements in an array of static size.

## OSMO_ASSERT

#define OSMO_ASSERT | ( |  | exp | ) |

Value:
if (!(exp)) { \
osmo_panic("Assert failed %s %s:%d\n", #exp, __BASE_FILE__, __LINE__); \
}

Helper macro to terminate when an assertion failes.

Parameters

  [in] | exp | Predicate to verify This function will generate a backtrace and terminate the program if the predicate evaluates to false (0).

## OSMO_BYTES_FOR_BITS

#define OSMO_BYTES_FOR_BITS | ( |  | BITS | ) | ((BITS + 8 - 1) / 8)

Number of bytes necessary to store given BITS.

## OSMO_DEPRECATED

#define OSMO_DEPRECATED | ( |  | text | ) |

Set the deprecated attribute with a message.

## OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE

#define OSMO_DEPRECATED_OUTSIDE_LIBOSMOCORE OSMO_DEPRECATED("For internal use inside libosmocore only.")

## OSMO_GNUC_PREREQ

#define OSMO_GNUC_PREREQ | ( |  | maj,
|  |  | min
| ) |  | 0

Check for gcc and version.

Note
  Albeit glibc provides a features.h file that contains a similar definition (__GNUC_PREREQ), this definition has been copied from there to have it available with other libraries, too.

Returns
  != 0 iff gcc is used and it's version is at least maj.min.

## OSMO_MAX

#define OSMO_MAX | ( |  | a,
|  |  | b
| ) |  | ((a) >= (b) ? (a) : (b))

Return the maximum of two specified values.

## OSMO_MIN

#define OSMO_MIN | ( |  | a,
|  |  | b
| ) |  | ((a) >= (b) ? (b) : (a))

Return the minimum of two specified values.

## OSMO_SNPRINTF_RET

#define OSMO_SNPRINTF_RET | ( |  | ret,
|  |  | rem,
|  |  | offset,
|  |  | len
| ) |  |

Value:
do { \
len += ret; \
if (ret > rem) \
ret = rem; \
offset += ret; \
rem -= ret; \
} while (0)

## osmo_static_assert

#define osmo_static_assert | ( |  | exp,
|  |  | name
| ) |  | typedef int dummy##name [(exp) ? 1 : -1] __attribute__((__unused__));

## OSMO_STRINGIFY

#define OSMO_STRINGIFY | ( |  | x | ) | #x

Stringify the name of a macro x, e.g.

an FSM event name. Note: if nested within another preprocessor macro, this will stringify the value of x instead of its name.

## OSMO_STRINGIFY_VAL

#define OSMO_STRINGIFY_VAL | ( |  | x | ) | OSMO_STRINGIFY(x)

Stringify the value of a macro x, e.g.

a port number.

## OSMO_STRLCPY_ARRAY

#define OSMO_STRLCPY_ARRAY | ( |  | array,
|  |  | src
| ) |  | osmo_strlcpy(array, src, sizeof(array))

Copy a C-string into a sized buffer using sizeof to detect buffer's size.

## osmo_talloc_asprintf

#define osmo_talloc_asprintf | ( |  | ctx,
|  |  | dest,
|  |  | fmt,
|  |  | args ...
| ) |  |

Value:
do { \
if (!dest) \
dest = talloc_asprintf(ctx, fmt, ## args); \
else \
dest = talloc_asprintf_append((char*)dest, fmt, ## args); \
} while (0)

Append to a string and re-/allocate if necessary.

Parameters

  [in] | ctx | Talloc context to use for initial allocation.
  [in,out] | dest | char* to re-/allocate and append to.
  [in] | fmt | printf-like string format.
  [in] | args | Arguments for fmt.

dest may be passed in NULL, or a string previously allocated by talloc. If an existing string is passed in, it will remain associated with whichever ctx it was allocated before, regardless whether it matches ctx or not.

## OSMO_VALUE_STRING

#define OSMO_VALUE_STRING | ( |  | x | ) | { x, #x }

Make a value_string entry from an enum value name.

## Typedef Documentation

## osmo_panic_handler_t

typedef void(* osmo_panic_handler_t) (const char *fmt, va_list args)

panic handler callback function type

## Function Documentation

## _osmo_hexdump()

static char* _osmo_hexdump | ( | const unsigned char * | buf,
|  | int | len,
|  | char * | delim
| ) |  |

static

References hex_chars, and hexd_buff.

Referenced by osmo_hexdump(), and osmo_hexdump_nospc().

## _osmo_strrb_is_bufindex_valid()

bool _osmo_strrb_is_bufindex_valid | ( | const struct osmo_strrb * | rb,
|  | unsigned int | bufi
| ) |  |

References osmo_strrb::end, osmo_strrb_is_empty(), osmo_strrb::size, and osmo_strrb::start.

Referenced by osmo_strrb_get_nth().

## alias()

char alias | ( | "osmo_hexdump_nospc" |  | ) |

## get_string_value()

int get_string_value | ( | const struct value_string * | vs,
|  | const char * | str
| ) |  |

get numeric value for given human-readable string

Parameters

  [in] | vs | Array of value_string tuples
  [in] | str | human-readable string

Returns
  numeric value (>0) or negative numer in case of error

References value_string::value.

Referenced by log_parse_level().

## get_value_string()

const char * get_value_string | ( | const struct value_string * | vs,
|  | uint32_t | val
| ) |  |

get human-readable string for given value

Parameters

  [in] | vs | Array of value_string tuples
  [in] | val | Value to be converted

Returns
  pointer to human-readable string

If val is found in vs, the array's string entry is returned. Otherwise, an "unknown" string containing the actual value is composed in a static buffer that is reused across invocations.

References get_value_string_or_null(), and namebuf.

Referenced by level_color(), log_level_str(), osmo_fsm_event_name(), and osmo_fsm_term_cause_name().

## get_value_string_or_null()

const char * get_value_string_or_null | ( | const struct value_string * | vs,
|  | uint32_t | val
| ) |  |

get human-readable string or NULL for given value

Parameters

  [in] | vs | Array of value_string tuples
  [in] | val | Value to be converted

Returns
  pointer to human-readable string or NULL if val is not found

References value_string::str.

Referenced by get_value_string(), and level_color().

## osmo_bcd2char()

char osmo_bcd2char | ( | uint8_t | bcd | ) |

Convert BCD-encoded digit into printable character.

Parameters

  [in] | bcd | A single BCD-encoded digit

Returns
  single printable character

## osmo_char2bcd()

uint8_t osmo_char2bcd | ( | char | c | ) |

Convert number in ASCII to BCD value.

Parameters

  [in] | c | ASCII character

Returns
  BCD encoded value of character

## osmo_constant_time_cmp()

int osmo_constant_time_cmp | ( | const uint8_t * | exp,
|  | const uint8_t * | rel,
|  | const int | count
| ) |  |

Wishful thinking to generate a constant time compare.

Parameters

  [in] | exp | Expected data
  [in] | rel | Comparison value
  [in] | count | Number of bytes to compare

Returns
  1 in case exp equals rel; zero otherwise

Compare count bytes of exp to rel. Return 0 if they are identical, 1 otherwise. Do not return a mismatch on the first mismatching byte, but always compare all bytes, regardless. The idea is that the amount of matching bytes cannot be inferred from the time the comparison took.

## osmo_decode_big_endian()

uint64_t osmo_decode_big_endian | ( | const uint8_t * | data,
|  | size_t | data_len
| ) |  |

Generic retrieval of 1..8 bytes as big-endian uint64_t.

Parameters

  [in] | data | Input data as byte-array
  [in] | data_len | Length of data in octets

Returns
  uint64_t of data interpreted as big-endian

This is like osmo_load64be_ext, except that if data_len is less than sizeof(uint64_t), the data is interpreted as the least significant bytes (osmo_load64be_ext loads them as the most significant bytes into the returned uint64_t). In this way, any integer size up to 64 bits can be decoded conveniently by using sizeof(), without the need to call specific numbered functions (osmo_load16, 32, ...).

## osmo_encode_big_endian()

uint8_t * osmo_encode_big_endian | ( | uint64_t | value,
|  | size_t | data_len
| ) |  |

Generic big-endian encoding of big endian number up to 64bit.

Parameters

  [in] | value | unsigned integer value to be stored
  [in] | data_len | number of octets

Returns
  static buffer containing big-endian stored value

This is like osmo_store64be_ext, except that this returns a static buffer of the result (for convenience, but not threadsafe). If data_len is less than sizeof(uint64_t), only the least significant bytes of value are encoded.

References ARRAY_SIZE, OSMO_ASSERT, and osmo_store64be_ext().

## osmo_escape_str()

const char * osmo_escape_str | ( | const char * | str,
|  | int | in_len
| ) |  |

Return the string with all non-printable characters escaped.

Call osmo_escape_str_buf() with a static buffer.

Parameters

  [in] | str | A string that may contain any characters.
  [in] | len | Pass -1 to print until nul char, or >= 0 to force a length.

Returns
  buf containing an escaped representation, possibly truncated, or str itself.

References namebuf, and osmo_escape_str_buf().

## osmo_escape_str_buf()

const char * osmo_escape_str_buf | ( | const char * | str,
|  | int | in_len,
|  | char * | buf,
|  | size_t | bufsize
| ) |  |

Return the string with all non-printable characters escaped.

Parameters

  [in] | str | A string that may contain any characters.
  [in] | len | Pass -1 to print until nul char, or >= 0 to force a length.
  [in,out] | buf | string buffer to write escaped characters to.
  [in] | bufsize | size of buf.

Returns
  buf containing an escaped representation, possibly truncated, or str itself.

References BACKSLASH_CASE.

Referenced by osmo_escape_str(), and osmo_quote_str_buf().

## osmo_get_macaddr()

int osmo_get_macaddr | ( | uint8_t * | mac_out,
|  | const char * | dev_name
| ) |  |

Obtain the MAC address of a given network device.

Parameters

  [out] | mac_out | pointer to caller-allocated buffer of 6 bytes
  [in] | dev_name | string name of the network device

Returns
  0 in case of success; negative otherwise

## osmo_hexdump()

char * osmo_hexdump | ( | const unsigned char * | buf,
|  | int | len
| ) |  |

Convert binary sequence to hexadecimal ASCII string.

Parameters

  [in] | buf | pointer to sequence of bytes
  [in] | len | length of buf in number of bytes

Returns
  pointer to zero-terminated string

This function will print a sequence of bytes as hexadecimal numbers, adding one space character between each byte (e.g. "1a ef d9")

The maximum size of the output buffer is 4096 bytes, i.e. the maximum number of input bytes that can be printed in one call is 1365!

References _osmo_hexdump().

Referenced by msgb_hexdump(), msgb_hexdump_l2(), and msgb_hexdump_l3().

## osmo_hexdump_nospc()

char * osmo_hexdump_nospc | ( | const unsigned char * | buf,
|  | int | len
| ) |  |

Convert binary sequence to hexadecimal ASCII string.

Parameters

  [in] | buf | pointer to sequence of bytes
  [in] | len | length of buf in number of bytes

Returns
  pointer to zero-terminated string

This function will print a sequence of bytes as hexadecimal numbers, without any space character between each byte (e.g. "1aefd9")

The maximum size of the output buffer is 4096 bytes, i.e. the maximum number of input bytes that can be printed in one call is 2048!

References _osmo_hexdump().

## osmo_hexparse()

int osmo_hexparse | ( | const char * | str,
|  | uint8_t * | b,
|  | int | max_len
| ) |  |

Parse a string containing hexadecimal digits.

Parameters

  [in] | str | string containing ASCII encoded hexadecimal digits
  [out] | b | output buffer
  [in] | max_len | maximum space in output buffer

Returns
  number of parsed octets, or -1 on error

## osmo_identifier_valid()

bool osmo_identifier_valid | ( | const char * | str | ) |

Determine if a given identifier is valid, i.e.

doesn't contain illegal chars

Parameters

  [in] | str | String to validate

Returns
  true in case str contains valid identifier, false otherwise

References osmo_separated_identifiers_valid().

Referenced by osmo_fsm_inst_update_id_f(), osmo_fsm_register(), and rate_ctrl_group_desc_validate().

## osmo_is_hexstr()

bool osmo_is_hexstr | ( | const char * | str,
|  | int | min_digits,
|  | int | max_digits,
|  | bool | require_even
| ) |  |

Validate that a given string is a hex string within given size limits.

Note that each hex digit amounts to a nibble, so if checking for a hex string to result in N bytes, pass amount of digits as 2*N.

Parameters

  str | A nul-terminated string to validate, or NULL.
  min_digits | least permitted amount of digits.
  max_digits | most permitted amount of digits.
  require_even | if true, require an even amount of digits.

Returns
  true when the hex_str contains only hexadecimal digits (no whitespace) and matches the requested length; also true when min_digits <= 0 and str is NULL.

## osmo_isqrt32()

uint32_t osmo_isqrt32 | ( | uint32_t | x | ) |

perform an integer square root operation on unsigned 32bit integer.

This implementation is taken from "Hacker's Delight" Figure 11-1 "Integer square root, Newton's method", which can also be found at http://www.hackersdelight.org/hdcodetxt/isqrt.c.txt

## osmo_macaddr_parse()

int osmo_macaddr_parse | ( | uint8_t * | out,
|  | const char * | in
| ) |  |

Parse a MAC address from human-readable notation This function parses an ethernet MAC address in the commonly-used hex/colon notation (00:00:00:00:00:00) and generates the binary representation from it.

Parameters

  [out] | out | pointer to caller-allocated buffer of 6 bytes
  [in] | in | pointer to input data as string with hex/colon notation

## osmo_osmo_hexdump_nospc()

char * osmo_osmo_hexdump_nospc | ( | const unsigned char * | buf,
|  | int | len
| ) |  |

## osmo_panic()

void osmo_panic | ( | const char * | fmt,
|  |  | ...
| ) |  |

Terminate the current program with a panic.

You can call this function in case some severely unexpected situation is detected and the program is supposed to terminate in a way that reports the fact that it terminates.

The application can register a panic handler function using osmo_set_panic_handler. If it doesn't, a default panic handler function is called automatically.

The default function on most systems will generate a backtrace and then abort() the process.

References osmo_panic_default(), and osmo_panic_handler.

Referenced by bit_value_to_char().

## osmo_panic_default()

static void osmo_panic_default | ( | const char * | fmt,
|  | va_list | args
| ) |  |

static

References osmo_generate_backtrace().

Referenced by osmo_panic().

## osmo_plugin_load_all()

int osmo_plugin_load_all | ( | const char * | directory | ) |

Load all plugins available in given directory.

Parameters

  [in] | directory | full path name of directory containing plug-ins

Returns
  number of plugins loaded in case of success, negative in case of error

## osmo_quote_str()

const char * osmo_quote_str | ( | const char * | str,
|  | int | in_len
| ) |  |

References namebuf, and osmo_quote_str_buf().

Referenced by osmo_fsm_inst_update_id_f().

## osmo_quote_str_buf()

const char * osmo_quote_str_buf | ( | const char * | str,
|  | int | in_len,
|  | char * | buf,
|  | size_t | bufsize
| ) |  |

Like osmo_escape_str(), but returns double-quotes around a string, or "NULL" for a NULL string.

This allows passing any char* value and get its C representation as string.

Parameters

  [in] | str | A string that may contain any characters.
  [in] | len | Pass -1 to print until nul char, or >= 0 to force a length.

Returns
  buf containing an escaped representation, possibly truncated, or str itself.

References osmo_escape_str_buf(), OSMO_MIN, and res.

Referenced by osmo_quote_str().

## osmo_separated_identifiers_valid()

bool osmo_separated_identifiers_valid | ( | const char * | str,
|  | const char * | sep_chars
| ) |  |

Determine if a given identifier is valid, i.e.

doesn't contain illegal chars

Parameters

  [in] | str | String to validate
  [in] | sep_chars | Permitted separation characters between identifiers.

Returns
  true in case str contains only valid identifiers and sep_chars, false otherwise

Referenced by osmo_identifier_valid().

## osmo_set_panic_handler()

void osmo_set_panic_handler | ( | osmo_panic_handler_t | h | ) |

Set the panic handler.

Parameters

  [in] | h | New panic handler function

This changes the panic handling function from the currently active function to a new call-back function supplied by the caller.

References osmo_panic_handler.

## osmo_str2lower()

void osmo_str2lower | ( | char * | out,
|  | const char * | in
| ) |  |

Convert an entire string to lower case.

Parameters

  [out] | out | output string, caller-allocated
  [in] | in | input string

## osmo_str2upper()

void osmo_str2upper | ( | char * | out,
|  | const char * | in
| ) |  |

Convert an entire string to upper case.

Parameters

  [out] | out | output string, caller-allocated
  [in] | in | input string

## osmo_strlcpy()

size_t osmo_strlcpy | ( | char * | dst,
|  | const char * | src,
|  | size_t | siz
| ) |  |

Copy a C-string into a sized buffer.

Parameters

  [in] | src | source string
  [out] | dst | destination string
  [in] | siz | size of the dst buffer

Returns
  length of src

Copy at most siz bytes from src to dst, ensuring that the result is NUL terminated. The NUL character is included in siz, i.e. passing the actual sizeof(*dst) is correct.

Referenced by osmo_sockaddr_to_str_and_uint().

## osmo_strrb_add()

int osmo_strrb_add | ( | struct osmo_strrb * | rb,
|  | const char * | data
| ) |  |

Add a string to the osmo_strrb.

Parameters

  [in] | rb | The osmo_strrb to add to.
  [in] | data | The string to add.

Add a message to the osmo_strrb. Older messages will be overwritten as necessary.

Returns
  0 normally, 1 as a warning (ie, if data was truncated).

References osmo_strrb::buffer, osmo_strrb::end, RB_MAX_MESSAGE_SIZE, osmo_strrb::size, and osmo_strrb::start.

Referenced by _rb_output().

## osmo_strrb_create()

struct osmo_strrb* osmo_strrb_create | ( | TALLOC_CTX * | ctx,
|  | size_t | rb_size
| ) |  |

Create an empty, initialized osmo_strrb.

Parameters

  [in] | ctx | The talloc memory context which should own this.
  [in] | rb_size | The number of message slots the osmo_strrb can hold.

Returns
  A struct osmo_strrb* on success, NULL in case of error.

This function creates and initializes a ringbuffer. Note that the ringbuffer stores at most rb_size - 1 messages.

References osmo_strrb::buffer, RB_MAX_MESSAGE_SIZE, and osmo_strrb::size.

Referenced by log_target_create_rb().

## osmo_strrb_elements()

size_t osmo_strrb_elements | ( | const struct osmo_strrb * | rb | ) |

Count the number of log messages in an osmo_strrb.

Parameters

  [in] | rb | The osmo_strrb to count the elements of.

Returns
  The number of log messages in the osmo_strrb.

References osmo_strrb::end, osmo_strrb::size, and osmo_strrb::start.

Referenced by log_target_rb_used_size().

## osmo_strrb_get_nth()

const char* osmo_strrb_get_nth | ( | const struct osmo_strrb * | rb,
|  | unsigned int | string_index
| ) |  |

Return a pointer to the Nth string in the osmo_strrb.

Parameters

  [in] | rb | The osmo_strrb to search.
  [in] | string_index | The index sought (N), zero-indexed.

Return a pointer to the Nth string in the osmo_strrb. Return NULL if there is no Nth string. Note that N is zero-indexed.

Returns
  A pointer to the target string on success, NULL in case of error.

References _osmo_strrb_is_bufindex_valid(), osmo_strrb::buffer, osmo_strrb::end, osmo_strrb::size, and osmo_strrb::start.

Referenced by log_target_rb_get().

## osmo_strrb_is_empty()

bool osmo_strrb_is_empty | ( | const struct osmo_strrb * | rb | ) |

Check if an osmo_strrb is empty.

Parameters

  [in] | rb | The osmo_strrb to check.

Returns
  True if the osmo_strrb is empty, false otherwise.

References osmo_strrb::end, and osmo_strrb::start.

Referenced by _osmo_strrb_is_bufindex_valid().

## osmo_talloc_replace_string()

static void osmo_talloc_replace_string | ( | void * | ctx,
|  | char ** | dst,
|  | const char * | newstr
| ) |  |

inline static

duplicate a string using talloc and release its prior content (if any)

Parameters

  [in] | ctx | Talloc context to use for allocation
  [out] | dst | pointer to string, will be updated with ptr to new string
  [in] | newstr | String that will be copieed to newly allocated string

## osmo_ubit_dump()

char * osmo_ubit_dump | ( | const uint8_t * | bits,
|  | unsigned int | len
| ) |  |

Convert a sequence of unpacked bits to ASCII string.

Parameters

  [in] | bits | A sequence of unpacked bits
  [in] | len | Length of bits

References hexd_buff.

## Variable Documentation

## hex_chars

const char hex_chars[] = "0123456789abcdef"

static

Referenced by _osmo_hexdump().

## hexd_buff

char hexd_buff[4096]

static

Referenced by _osmo_hexdump(), and osmo_ubit_dump().

## namebuf

char namebuf[255]

static

Referenced by get_value_string(), osmo_escape_str(), and osmo_quote_str().

## osmo_panic_handler

osmo_panic_handler_t osmo_panic_handler = (void*)0

static

Referenced by osmo_panic(), and osmo_set_panic_handler().