252 lines
6.5 KiB
C
252 lines
6.5 KiB
C
/*
|
|
* Copyright (C) 2008-2017 Tobias Brunner
|
|
* Copyright (C) 2008 Martin Willi
|
|
* HSR Hochschule fuer Technik Rapperswil
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup utils_i utils
|
|
* @{ @ingroup utils
|
|
*/
|
|
|
|
#ifndef UTILS_H_
|
|
#define UTILS_H_
|
|
|
|
#define _GNU_SOURCE
|
|
#include <sys/types.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <sys/time.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
#ifdef HAVE_SYS_PARAM_H
|
|
#include <sys/param.h>
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
# include "compat/windows.h"
|
|
#else
|
|
# include <arpa/inet.h>
|
|
# include <sys/socket.h>
|
|
# include <netdb.h>
|
|
# include <netinet/in.h>
|
|
# include <sched.h>
|
|
# include <poll.h>
|
|
# include <signal.h>
|
|
#endif
|
|
|
|
#include "utils/types.h"
|
|
#include "enum.h"
|
|
#include "utils/atomics.h"
|
|
#include "utils/align.h"
|
|
#include "utils/byteorder.h"
|
|
#include "utils/string.h"
|
|
#include "utils/memory.h"
|
|
#include "utils/strerror.h"
|
|
#include "utils/status.h"
|
|
#include "utils/object.h"
|
|
#include "utils/path.h"
|
|
#include "utils/time.h"
|
|
#include "utils/tty.h"
|
|
#ifdef __APPLE__
|
|
# include "compat/apple.h"
|
|
#endif
|
|
#ifdef __ANDROID__
|
|
# include "compat/android.h"
|
|
#endif
|
|
|
|
/**
|
|
* Initialize utility functions
|
|
*/
|
|
void utils_init();
|
|
|
|
/**
|
|
* Deinitialize utility functions
|
|
*/
|
|
void utils_deinit();
|
|
|
|
/**
|
|
* strongSwan program return codes
|
|
*/
|
|
#define SS_RC_LIBSTRONGSWAN_INTEGRITY 64
|
|
#define SS_RC_DAEMON_INTEGRITY 65
|
|
#define SS_RC_INITIALIZATION_FAILED 66
|
|
|
|
#define SS_RC_FIRST SS_RC_LIBSTRONGSWAN_INTEGRITY
|
|
#define SS_RC_LAST SS_RC_INITIALIZATION_FAILED
|
|
|
|
/**
|
|
* Number of bits in a byte
|
|
*/
|
|
#define BITS_PER_BYTE 8
|
|
|
|
/**
|
|
* Default length for various auxiliary text buffers
|
|
*/
|
|
#define BUF_LEN 512
|
|
|
|
/**
|
|
* Build assertion macro for integer expressions, evaluates to 0
|
|
*/
|
|
#define BUILD_ASSERT(x) (sizeof(char[(x) ? 0 : -1]))
|
|
|
|
/**
|
|
* Build time check to assert a is an array, evaluates to 0
|
|
*
|
|
* The address of an array element has a pointer type, which is not compatible
|
|
* to the array type.
|
|
*/
|
|
#define BUILD_ASSERT_ARRAY(a) \
|
|
BUILD_ASSERT(!__builtin_types_compatible_p(typeof(a), typeof(&(a)[0])))
|
|
|
|
/**
|
|
* Debug macro to follow control flow
|
|
*/
|
|
#define POS printf("%s, line %d\n", __FILE__, __LINE__)
|
|
|
|
/**
|
|
* This macro allows counting the number of arguments passed to a macro.
|
|
* Combined with the VA_ARGS_DISPATCH() macro this can be used to implement
|
|
* macro overloading based on the number of arguments.
|
|
* 0 to 10 arguments are currently supported.
|
|
*/
|
|
#define VA_ARGS_NUM(...) _VA_ARGS_NUM(0,##__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
|
|
#define _VA_ARGS_NUM(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NUM,...) NUM
|
|
|
|
/**
|
|
* This macro can be used to dispatch a macro call based on the number of given
|
|
* arguments, for instance:
|
|
*
|
|
* @code
|
|
* #define MY_MACRO(...) VA_ARGS_DISPATCH(MY_MACRO, __VA_ARGS__)(__VA_ARGS__)
|
|
* #define MY_MACRO1(arg) one_arg(arg)
|
|
* #define MY_MACRO2(arg1,arg2) two_args(arg1,arg2)
|
|
* @endcode
|
|
*
|
|
* MY_MACRO() can now be called with either one or two arguments, which will
|
|
* resolve to one_arg(arg) or two_args(arg1,arg2), respectively.
|
|
*/
|
|
#define VA_ARGS_DISPATCH(func, ...) _VA_ARGS_DISPATCH(func, VA_ARGS_NUM(__VA_ARGS__))
|
|
#define _VA_ARGS_DISPATCH(func, num) __VA_ARGS_DISPATCH(func, num)
|
|
#define __VA_ARGS_DISPATCH(func, num) func ## num
|
|
|
|
/**
|
|
* Assign variadic arguments to the given variables.
|
|
*
|
|
* @note The order and types of the variables are significant and must match the
|
|
* variadic arguments passed to the function that calls this macro exactly.
|
|
*
|
|
* @param last the last argument before ... in the function that calls this
|
|
* @param ... variable names
|
|
*/
|
|
#define VA_ARGS_GET(last, ...) ({ \
|
|
va_list _va_args_get_ap; \
|
|
va_start(_va_args_get_ap, last); \
|
|
_VA_ARGS_GET_ASGN(__VA_ARGS__) \
|
|
va_end(_va_args_get_ap); \
|
|
})
|
|
|
|
/**
|
|
* Assign variadic arguments from a va_list to the given variables.
|
|
*
|
|
* @note The order and types of the variables are significant and must match the
|
|
* variadic arguments passed to the function that calls this macro exactly.
|
|
*
|
|
* @param list the va_list variable in the function that calls this
|
|
* @param ... variable names
|
|
*/
|
|
#define VA_ARGS_VGET(list, ...) ({ \
|
|
va_list _va_args_get_ap; \
|
|
va_copy(_va_args_get_ap, list); \
|
|
_VA_ARGS_GET_ASGN(__VA_ARGS__) \
|
|
va_end(_va_args_get_ap); \
|
|
})
|
|
|
|
#define _VA_ARGS_GET_ASGN(...) VA_ARGS_DISPATCH(_VA_ARGS_GET_ASGN, __VA_ARGS__)(__VA_ARGS__)
|
|
#define _VA_ARGS_GET_ASGN1(v1) __VA_ARGS_GET_ASGN(v1)
|
|
#define _VA_ARGS_GET_ASGN2(v1,v2) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2)
|
|
#define _VA_ARGS_GET_ASGN3(v1,v2,v3) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
|
|
__VA_ARGS_GET_ASGN(v3)
|
|
#define _VA_ARGS_GET_ASGN4(v1,v2,v3,v4) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
|
|
__VA_ARGS_GET_ASGN(v3) __VA_ARGS_GET_ASGN(v4)
|
|
#define _VA_ARGS_GET_ASGN5(v1,v2,v3,v4,v5) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
|
|
__VA_ARGS_GET_ASGN(v3) __VA_ARGS_GET_ASGN(v4) __VA_ARGS_GET_ASGN(v5)
|
|
#define __VA_ARGS_GET_ASGN(v) v = va_arg(_va_args_get_ap, typeof(v));
|
|
|
|
/**
|
|
* Macro to allocate a sized type.
|
|
*/
|
|
#define malloc_thing(thing) ((thing*)malloc(sizeof(thing)))
|
|
|
|
/**
|
|
* Get the number of elements in an array
|
|
*/
|
|
#define countof(array) (sizeof(array)/sizeof((array)[0]) \
|
|
+ BUILD_ASSERT_ARRAY(array))
|
|
|
|
/**
|
|
* Ignore result of functions tagged with warn_unused_result attributes
|
|
*/
|
|
#define ignore_result(call) { if(call){}; }
|
|
|
|
#if !defined(HAVE_SIGWAITINFO) && !defined(WIN32)
|
|
/**
|
|
* Block and wait for a set of signals
|
|
*
|
|
* We don't replicate the functionality of siginfo_t. If info is not NULL
|
|
* -1 is returned and errno is set to EINVAL.
|
|
*
|
|
* @param set set of signals to wait for
|
|
* @param info must be NULL
|
|
*/
|
|
int sigwaitinfo(const sigset_t *set, void *info);
|
|
#endif
|
|
|
|
/**
|
|
* Portable function to wait for SIGINT/SIGTERM (or equivalent).
|
|
*/
|
|
void wait_sigint();
|
|
|
|
#ifndef HAVE_CLOSEFROM
|
|
/**
|
|
* Close open file descriptors greater than or equal to lowfd.
|
|
*
|
|
* @param lowfd start closing file descriptors from here
|
|
*/
|
|
void closefrom(int lowfd);
|
|
#endif
|
|
|
|
/**
|
|
* returns null
|
|
*/
|
|
void *return_null();
|
|
|
|
/**
|
|
* No-Operation function
|
|
*/
|
|
void nop();
|
|
|
|
/**
|
|
* returns TRUE
|
|
*/
|
|
bool return_true();
|
|
|
|
/**
|
|
* returns FALSE
|
|
*/
|
|
bool return_false();
|
|
|
|
#endif /** UTILS_H_ @}*/
|