Blame util.h

Packit Service d8d8ac
/**
Packit Service d8d8ac
 * @file util.h
Packit Service d8d8ac
 * @brief Various little utility functions that do not fit in elsewhere.
Packit Service d8d8ac
 * @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com>
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is free software; you can redistribute it and/or modify
Packit Service d8d8ac
 * it under the terms of the GNU General Public License as published by
Packit Service d8d8ac
 * the Free Software Foundation; either version 2 of the License, or
Packit Service d8d8ac
 * (at your option) any later version.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is distributed in the hope that it will be useful,
Packit Service d8d8ac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d8d8ac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d8d8ac
 * GNU General Public License for more details.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * You should have received a copy of the GNU General Public License along
Packit Service d8d8ac
 * with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service d8d8ac
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service d8d8ac
 */
Packit Service d8d8ac
#ifndef HAVE_UTIL_H
Packit Service d8d8ac
#define HAVE_UTIL_H
Packit Service d8d8ac
Packit Service d8d8ac
#include <string.h>
Packit Service d8d8ac
#include <time.h>
Packit Service d8d8ac
Packit Service d8d8ac
#include "address.h"
Packit Service d8d8ac
#include "ddt.h"
Packit Service d8d8ac
#include "ether.h"
Packit Service d8d8ac
#include "transport.h"
Packit Service d8d8ac
Packit Service d8d8ac
#define MAX_PRINT_BYTES 16
Packit Service d8d8ac
#define BIN_BUF_SIZE (MAX_PRINT_BYTES * 3 + 1)
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Table of human readable strings, one for each port state.
Packit Service d8d8ac
 */
Packit Service d8d8ac
extern const char *ps_str[];
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Table of human readable strings, one for each port event.
Packit Service d8d8ac
 */
Packit Service d8d8ac
extern const char *ev_str[];
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Compares two binary addresses for equality.
Packit Service d8d8ac
 * @param type  One of the enumerated transport types.
Packit Service d8d8ac
 * @param a     One address to compare.
Packit Service d8d8ac
 * @param b     The second address to compare.
Packit Service d8d8ac
 * @return      One if the addresses are identical, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int addreq(enum transport_type type, struct address *a, struct address *b);
Packit Service d8d8ac
Packit Service d8d8ac
static inline uint16_t align16(uint16_t *p)
Packit Service d8d8ac
{
Packit Service d8d8ac
	uint16_t v;
Packit Service d8d8ac
	memcpy(&v, p, sizeof(v));
Packit Service d8d8ac
	return v;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
char *bin2str_impl(Octet *data, int len, char *buf, int buf_len);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Convert a clock identity into a human readable string.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Note that this function uses a static global variable to store the
Packit Service d8d8ac
 * result and therefore is not reentrant.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param id  Clock idendtity to show.
Packit Service d8d8ac
 * @return    Pointer to a static global buffer holding the result.
Packit Service d8d8ac
 */
Packit Service d8d8ac
char *cid2str(struct ClockIdentity *id);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Compare two clock identities for equality.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param a  First clock identity.
Packit Service d8d8ac
 * @param b  Second clock identity.
Packit Service d8d8ac
 * @return   1 if identities are equal, 0 otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int cid_eq(struct ClockIdentity *a, struct ClockIdentity *b)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return memcmp(a, b, sizeof(*a)) == 0;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Counts the number of occurrences of a given character.
Packit Service d8d8ac
 * @param str  String to evaluate.
Packit Service d8d8ac
 * @param c    The character of interest.
Packit Service d8d8ac
 * @return     The number of time 'c' appears in 'str'.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int count_char(const char *str, char c);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Convert a port identity into a human readable string.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Note that this function uses a static global variable to store the
Packit Service d8d8ac
 * result and therefore is not reentrant.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param id  Port idendtity to show.
Packit Service d8d8ac
 * @return    Pointer to a static global buffer holding the result.
Packit Service d8d8ac
 */
Packit Service d8d8ac
char *pid2str(struct PortIdentity *id);
Packit Service d8d8ac
Packit Service d8d8ac
char *portaddr2str(struct PortAddress *addr);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Compare two port identities for equality.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param a  First port identity.
Packit Service d8d8ac
 * @param b  Second port identity.
Packit Service d8d8ac
 * @return   1 if identities are equal, 0 otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int pid_eq(struct PortIdentity *a, struct PortIdentity *b)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return memcmp(a, b, sizeof(*a)) == 0;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Convert a string containing a network address into binary form.
Packit Service d8d8ac
 * @param type  The network transport type of the address.
Packit Service d8d8ac
 * @param s     String in human readable form.
Packit Service d8d8ac
 * @param addr  Pointer to a buffer to hold the result.
Packit Service d8d8ac
 * @return Zero on success, or -1 if the string is incorrectly formatted.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int str2addr(enum transport_type type, const char *s, struct address *addr);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Scan a string containing a MAC address and convert it into binary form.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param s       String in human readable form.
Packit Service d8d8ac
 * @param mac     Pointer to a buffer to hold the result.
Packit Service d8d8ac
 * @return Zero on success, or -1 if the string is incorrectly formatted.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int str2mac(const char *s, unsigned char mac[MAC_LEN]);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Scan a string containing a port identity and convert it into binary form.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param s       String in human readable form.
Packit Service d8d8ac
 * @param result  Pointer to a buffer to hold the result.
Packit Service d8d8ac
 * @return Zero on success, or -1 if the string is incorrectly formatted.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int str2pid(const char *s, struct PortIdentity *result);
Packit Service d8d8ac
Packit Service d8d8ac
int generate_clock_identity(struct ClockIdentity *ci, const char *name);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Copies a PTPText to a static_ptp_text. This copies the text into
Packit Service d8d8ac
 * the static_ptp_text.
Packit Service d8d8ac
 * @param dst The static_ptp_text to copy to
Packit Service d8d8ac
 * @param src The PTPText to copy from
Packit Service d8d8ac
 * @return Zero on success, -1 if text in src is too long or not valid
Packit Service d8d8ac
 * UTF8
Packit Service d8d8ac
 */
Packit Service d8d8ac
int static_ptp_text_copy(struct static_ptp_text *dst, const struct PTPText *src);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Copies a static_ptp_text to a PTPText. Caller must ensure it's
Packit Service d8d8ac
 * valid to write to the memory after the PTPText struct. The trailing
Packit Service d8d8ac
 * \0 is not copied.
Packit Service d8d8ac
 * @param dst The PTPText to copy to
Packit Service d8d8ac
 * @param src The static_ptp_text to copy from
Packit Service d8d8ac
 */
Packit Service d8d8ac
void ptp_text_copy(struct PTPText *dst, const struct static_ptp_text *src);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Sets a PTPText from a null-terminated char*. Caller must ensure it's
Packit Service d8d8ac
 * valid to write to the memory after the PTPText struct. The trailing
Packit Service d8d8ac
 * \0 is not copied.
Packit Service d8d8ac
 * @param dst The PTPText to copy to
Packit Service d8d8ac
 * @param src The text to copy from
Packit Service d8d8ac
 * @return Zero on success, -1 if src is too long
Packit Service d8d8ac
 */
Packit Service d8d8ac
int ptp_text_set(struct PTPText *dst, const char *src);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Sets a static_ptp_text from a null-terminated char*.
Packit Service d8d8ac
 * @param dst The static_ptp_text to copy to
Packit Service d8d8ac
 * @param src The text to copy from
Packit Service d8d8ac
 * @return Zero on success, -1 if text in src is too long or not valid
Packit Service d8d8ac
 * UTF8
Packit Service d8d8ac
 */
Packit Service d8d8ac
int static_ptp_text_set(struct static_ptp_text *dst, const char *src);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Check if UTC time stamp can be both before and after a leap second.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param ts UTC time stamp in nanoseconds.
Packit Service d8d8ac
 * @return   0 if not, 1 if yes.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int is_utc_ambiguous(uint64_t ts);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get leap second status in given time.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param ts         UTC time stamp in nanoseconds.
Packit Service d8d8ac
 * @param leap_set   Previous leap second status (+1/0/-1).
Packit Service d8d8ac
 * @param leap       Announced leap second (+1/0/-1), will be corrected if
Packit Service d8d8ac
 *                   early/late.
Packit Service d8d8ac
 * @param utc_offset Announced UTC offset, will be corrected if early/late.
Packit Service d8d8ac
 * @return           0 if the leap second passed, +1 if leap second will be
Packit Service d8d8ac
 *                   inserted, -1 if leap second will be deleted.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int leap_second_status(uint64_t ts, int leap_set, int *leap, int *utc_offset);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Values returned by get_ranged_*().
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum parser_result {
Packit Service d8d8ac
	PARSED_OK,
Packit Service d8d8ac
	NOT_PARSED,
Packit Service d8d8ac
	BAD_VALUE,
Packit Service d8d8ac
	MALFORMED,
Packit Service d8d8ac
	OUT_OF_RANGE,
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get an integer value from string with error checking and range
Packit Service d8d8ac
 * specification.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param str_val    String which contains an integer value.
Packit Service d8d8ac
 * @param result     Parsed value is stored in here.
Packit Service d8d8ac
 * @param min        Lower limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is less than min.
Packit Service d8d8ac
 * @param max        Upper Limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is bigger than max.
Packit Service d8d8ac
 * @return           PARSED_OK on success, MALFORMED if str_val is malformed,
Packit Service d8d8ac
 *                   OUT_OF_RANGE if str_val is out of range.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum parser_result get_ranged_int(const char *str_val, int *result,
Packit Service d8d8ac
				  int min, int max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get an unsigned integer value from string with error checking and range
Packit Service d8d8ac
 * specification.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param str_val    String which contains an unsigned integer value.
Packit Service d8d8ac
 * @param result     Parsed value is stored in here.
Packit Service d8d8ac
 * @param min        Lower limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is less than min.
Packit Service d8d8ac
 * @param max        Upper Limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is bigger than max.
Packit Service d8d8ac
 * @return           PARSED_OK on success, MALFORMED if str_val is malformed,
Packit Service d8d8ac
 *                   OUT_OF_RANGE if str_val is out of range.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum parser_result get_ranged_uint(const char *str_val, unsigned int *result,
Packit Service d8d8ac
				   unsigned int min, unsigned int max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get a double value from string with error checking and range
Packit Service d8d8ac
 * specification.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param str_val    String which contains a double value.
Packit Service d8d8ac
 * @param result     Parsed value is stored in here.
Packit Service d8d8ac
 * @param min        Lower limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is less than min.
Packit Service d8d8ac
 * @param max        Upper Limit. Return OUT_OF_RANGE if parsed value
Packit Service d8d8ac
 *                   is bigger than max.
Packit Service d8d8ac
 * @return           PARSED_OK on success, MALFORMED if str_val is malformed,
Packit Service d8d8ac
 *                   OUT_OF_RANGE if str_val is out of range.
Packit Service d8d8ac
 */
Packit Service d8d8ac
enum parser_result get_ranged_double(const char *str_val, double *result,
Packit Service d8d8ac
				     double min, double max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Common procedure to get an int value from argument for ptp4l and phc2sys.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param op     Character code of an option.
Packit Service d8d8ac
 * @param optarg Option argument string.
Packit Service d8d8ac
 * @param val    Parsed value is stored in here.
Packit Service d8d8ac
 * @param min    Lower limit. Return -1 if parsed value is less than min.
Packit Service d8d8ac
 * @param max    Upper limit. Return -1 if parsed value is bigger than max.
Packit Service d8d8ac
 * @return       0 on success, -1 if some error occurs.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int get_arg_val_i(int op, const char *optarg, int *val, int min, int max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Common procedure to get an unsigned int value from argument for ptp4l
Packit Service d8d8ac
 * and phc2sys.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param op     Character code of an option.
Packit Service d8d8ac
 * @param optarg Option argument string.
Packit Service d8d8ac
 * @param val    Parsed value is stored in here.
Packit Service d8d8ac
 * @param min    Lower limit. Return -1 if parsed value is less than min.
Packit Service d8d8ac
 * @param max    Upper limit. Return -1 if parsed value is bigger than max.
Packit Service d8d8ac
 * @return       0 on success, -1 if some error occurs.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int get_arg_val_ui(int op, const char *optarg, unsigned int *val,
Packit Service d8d8ac
		   unsigned int min, unsigned int max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Common procedure to get a double value from argument for ptp4l and phc2sys.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param op     Character code of an option.
Packit Service d8d8ac
 * @param optarg Option argument string.
Packit Service d8d8ac
 * @param val    Parsed value is stored in here.
Packit Service d8d8ac
 * @param min    Lower limit. Return -1 if parsed value is less than min.
Packit Service d8d8ac
 * @param max    Upper limit. Return -1 if parsed value is bigger than max.
Packit Service d8d8ac
 * @return       0 on success, -1 if some error occurs.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int get_arg_val_d(int op, const char *optarg, double *val,
Packit Service d8d8ac
		  double min, double max);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Setup a handler for terminating signals (SIGINT, SIGQUIT, SIGTERM).
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @return       0 on success, -1 on error.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int handle_term_signals(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Check if a terminating signal was received.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @return       1 if no terminating signal was received, 0 otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int is_running(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocate memory. This is a malloc() wrapper that terminates the process when
Packit Service d8d8ac
 * the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param size      Size of the block. Must be larger than 0.
Packit Service d8d8ac
 * @return          Pointer to the allocated memory.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void *xmalloc(size_t size);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocate and clear an array. This is a calloc() wrapper that terminates the
Packit Service d8d8ac
 * process when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param nmemb     Number of elements. Must be larger than 0.
Packit Service d8d8ac
 * @param size      Size of the element. Must be larger than 0.
Packit Service d8d8ac
 * @return          Pointer to the allocated memory.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void *xcalloc(size_t nmemb, size_t size);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Reallocate memory. This is a realloc() wrapper that terminates the process
Packit Service d8d8ac
 * when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param size      Size of the block. Must be larger than 0.
Packit Service d8d8ac
 * @return          Pointer to the allocated memory.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void *xrealloc(void *ptr, size_t size);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Duplicate a string. This is a strdup() wrapper that terminates the process
Packit Service d8d8ac
 * when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param s         String that should be duplicated.
Packit Service d8d8ac
 * @return          Pointer to the duplicated string.
Packit Service d8d8ac
 */
Packit Service d8d8ac
char *xstrdup(const char *s);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get an allocated and formatted string. This is a wrapper around asprintf()
Packit Service d8d8ac
 * that terminates the process on errors.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param format    printf() format string.
Packit Service d8d8ac
 * @param ...       printf() arguments.
Packit Service d8d8ac
 * @return          Pointer to the allocated string.
Packit Service d8d8ac
 */
Packit Service d8d8ac
#ifdef __GNUC__
Packit Service d8d8ac
__attribute__ ((format (printf, 1, 2)))
Packit Service d8d8ac
#endif
Packit Service d8d8ac
char *string_newf(const char *format, ...);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Reallocate a string and append another string to it. The process is
Packit Service d8d8ac
 * terminated when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param s         String that should be extended.
Packit Service d8d8ac
 * @param str       String appended to s.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void string_append(char **s, const char *str);
Packit Service d8d8ac
#ifdef __GNUC__
Packit Service d8d8ac
__attribute__ ((format (printf, 2, 3)))
Packit Service d8d8ac
#endif
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Reallocate a string and append a formatted string to it. The process is
Packit Service d8d8ac
 * terminated when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param s         String that should be extended.
Packit Service d8d8ac
 * @param format    printf() format string.
Packit Service d8d8ac
 * @param ...       printf() arguments.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void string_appendf(char **s, const char *format, ...);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Get an empty array of pointers terminated by NULL. The process is terminated
Packit Service d8d8ac
 * when the allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @return          Pointer to the allocated array.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void **parray_new(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Append pointer to a NULL-terminated pointer array. The array is reallocated
Packit Service d8d8ac
 * in exponentially increasing sizes. The process is terminated when the
Packit Service d8d8ac
 * allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param a         Pointer to pointer array.
Packit Service d8d8ac
 * @param p         Pointer appended to the array.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void parray_append(void ***a, void *p);
Packit Service d8d8ac
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Append pointers to a NULL-terminated pointer array. The array is reallocated
Packit Service d8d8ac
 * in exponentially increasing sizes. The process is terminated when the
Packit Service d8d8ac
 * allocation fails.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param a         Pointer to pointer array.
Packit Service d8d8ac
 * @param ...       NULL-terminated list of pointers.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void parray_extend(void ***a, ...);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Check if enough time has passed to implement a simple rate limiting.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param interval  Minimum interval between two calls returning 0 (in seconds).
Packit Service d8d8ac
 * @param last      Time of the last call that returned 0, input/output.
Packit Service d8d8ac
 * @return          1 when rate limited, 0 otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int rate_limited(int interval, time_t *last);
Packit Service d8d8ac
Packit Service d8d8ac
#endif