Annotation of embedaddon/strongswan/src/libstrongswan/utils/utils.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2008-2017 Tobias Brunner
                      3:  * Copyright (C) 2008 Martin Willi
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: /**
                     18:  * @defgroup utils_i utils
                     19:  * @{ @ingroup utils
                     20:  */
                     21: 
                     22: #ifndef UTILS_H_
                     23: #define UTILS_H_
                     24: 
                     25: #define _GNU_SOURCE
                     26: #include <sys/types.h>
                     27: #include <stdlib.h>
                     28: #include <stdint.h>
                     29: #include <stddef.h>
                     30: #include <sys/time.h>
                     31: #include <string.h>
                     32: #include <stdarg.h>
                     33: 
                     34: #ifdef HAVE_SYS_PARAM_H
                     35: #include <sys/param.h>
                     36: #endif
                     37: 
                     38: #ifdef WIN32
                     39: # include "compat/windows.h"
                     40: #else
                     41: # include <arpa/inet.h>
                     42: # include <sys/socket.h>
                     43: # include <netdb.h>
                     44: # include <netinet/in.h>
                     45: # include <sched.h>
                     46: # include <poll.h>
                     47: # include <signal.h>
                     48: #endif
                     49: 
                     50: #include "utils/types.h"
                     51: #include "enum.h"
                     52: #include "utils/atomics.h"
                     53: #include "utils/align.h"
                     54: #include "utils/byteorder.h"
                     55: #include "utils/string.h"
                     56: #include "utils/memory.h"
                     57: #include "utils/strerror.h"
                     58: #include "utils/status.h"
                     59: #include "utils/object.h"
                     60: #include "utils/path.h"
                     61: #include "utils/time.h"
                     62: #include "utils/tty.h"
                     63: #ifdef __APPLE__
                     64: # include "compat/apple.h"
                     65: #endif
                     66: #ifdef __ANDROID__
                     67: # include "compat/android.h"
                     68: #endif
                     69: 
                     70: /**
                     71:  * Initialize utility functions
                     72:  */
                     73: void utils_init();
                     74: 
                     75: /**
                     76:  * Deinitialize utility functions
                     77:  */
                     78: void utils_deinit();
                     79: 
                     80: /**
                     81:  * strongSwan program return codes
                     82:  */
                     83: #define SS_RC_LIBSTRONGSWAN_INTEGRITY  64
                     84: #define SS_RC_DAEMON_INTEGRITY                 65
                     85: #define SS_RC_INITIALIZATION_FAILED            66
                     86: 
                     87: #define SS_RC_FIRST    SS_RC_LIBSTRONGSWAN_INTEGRITY
                     88: #define SS_RC_LAST     SS_RC_INITIALIZATION_FAILED
                     89: 
                     90: /**
                     91:  * Number of bits in a byte
                     92:  */
                     93: #define BITS_PER_BYTE 8
                     94: 
                     95: /**
                     96:  * Default length for various auxiliary text buffers
                     97:  */
                     98: #define BUF_LEN 512
                     99: 
                    100: /**
                    101:  * Build assertion macro for integer expressions, evaluates to 0
                    102:  */
                    103: #define BUILD_ASSERT(x) (sizeof(char[(x) ? 0 : -1]))
                    104: 
                    105: /**
                    106:  * Build time check to assert a is an array, evaluates to 0
                    107:  *
                    108:  * The address of an array element has a pointer type, which is not compatible
                    109:  * to the array type.
                    110:  */
                    111: #define BUILD_ASSERT_ARRAY(a) \
                    112:                BUILD_ASSERT(!__builtin_types_compatible_p(typeof(a), typeof(&(a)[0])))
                    113: 
                    114: /**
                    115:  * Debug macro to follow control flow
                    116:  */
                    117: #define POS printf("%s, line %d\n", __FILE__, __LINE__)
                    118: 
                    119: /**
                    120:  * This macro allows counting the number of arguments passed to a macro.
                    121:  * Combined with the VA_ARGS_DISPATCH() macro this can be used to implement
                    122:  * macro overloading based on the number of arguments.
                    123:  * 0 to 10 arguments are currently supported.
                    124:  */
                    125: #define VA_ARGS_NUM(...) _VA_ARGS_NUM(0,##__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
                    126: #define _VA_ARGS_NUM(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NUM,...) NUM
                    127: 
                    128: /**
                    129:  * This macro can be used to dispatch a macro call based on the number of given
                    130:  * arguments, for instance:
                    131:  *
                    132:  * @code
                    133:  * #define MY_MACRO(...) VA_ARGS_DISPATCH(MY_MACRO, __VA_ARGS__)(__VA_ARGS__)
                    134:  * #define MY_MACRO1(arg) one_arg(arg)
                    135:  * #define MY_MACRO2(arg1,arg2) two_args(arg1,arg2)
                    136:  * @endcode
                    137:  *
                    138:  * MY_MACRO() can now be called with either one or two arguments, which will
                    139:  * resolve to one_arg(arg) or two_args(arg1,arg2), respectively.
                    140:  */
                    141: #define VA_ARGS_DISPATCH(func, ...) _VA_ARGS_DISPATCH(func, VA_ARGS_NUM(__VA_ARGS__))
                    142: #define _VA_ARGS_DISPATCH(func, num) __VA_ARGS_DISPATCH(func, num)
                    143: #define __VA_ARGS_DISPATCH(func, num) func ## num
                    144: 
                    145: /**
                    146:  * Assign variadic arguments to the given variables.
                    147:  *
                    148:  * @note The order and types of the variables are significant and must match the
                    149:  * variadic arguments passed to the function that calls this macro exactly.
                    150:  *
                    151:  * @param last         the last argument before ... in the function that calls this
                    152:  * @param ...          variable names
                    153:  */
                    154: #define VA_ARGS_GET(last, ...) ({ \
                    155:        va_list _va_args_get_ap; \
                    156:        va_start(_va_args_get_ap, last); \
                    157:        _VA_ARGS_GET_ASGN(__VA_ARGS__) \
                    158:        va_end(_va_args_get_ap); \
                    159: })
                    160: 
                    161: /**
                    162:  * Assign variadic arguments from a va_list to the given variables.
                    163:  *
                    164:  * @note The order and types of the variables are significant and must match the
                    165:  * variadic arguments passed to the function that calls this macro exactly.
                    166:  *
                    167:  * @param list         the va_list variable in the function that calls this
                    168:  * @param ...          variable names
                    169:  */
                    170: #define VA_ARGS_VGET(list, ...) ({ \
                    171:        va_list _va_args_get_ap; \
                    172:        va_copy(_va_args_get_ap, list); \
                    173:        _VA_ARGS_GET_ASGN(__VA_ARGS__) \
                    174:        va_end(_va_args_get_ap); \
                    175: })
                    176: 
                    177: #define _VA_ARGS_GET_ASGN(...) VA_ARGS_DISPATCH(_VA_ARGS_GET_ASGN, __VA_ARGS__)(__VA_ARGS__)
                    178: #define _VA_ARGS_GET_ASGN1(v1) __VA_ARGS_GET_ASGN(v1)
                    179: #define _VA_ARGS_GET_ASGN2(v1,v2) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2)
                    180: #define _VA_ARGS_GET_ASGN3(v1,v2,v3) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
                    181:        __VA_ARGS_GET_ASGN(v3)
                    182: #define _VA_ARGS_GET_ASGN4(v1,v2,v3,v4) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
                    183:        __VA_ARGS_GET_ASGN(v3) __VA_ARGS_GET_ASGN(v4)
                    184: #define _VA_ARGS_GET_ASGN5(v1,v2,v3,v4,v5) __VA_ARGS_GET_ASGN(v1) __VA_ARGS_GET_ASGN(v2) \
                    185:        __VA_ARGS_GET_ASGN(v3) __VA_ARGS_GET_ASGN(v4) __VA_ARGS_GET_ASGN(v5)
                    186: #define __VA_ARGS_GET_ASGN(v) v = va_arg(_va_args_get_ap, typeof(v));
                    187: 
                    188: /**
                    189:  * Macro to allocate a sized type.
                    190:  */
                    191: #define malloc_thing(thing) ((thing*)malloc(sizeof(thing)))
                    192: 
                    193: /**
                    194:  * Get the number of elements in an array
                    195:  */
                    196: #define countof(array) (sizeof(array)/sizeof((array)[0]) \
                    197:                                                + BUILD_ASSERT_ARRAY(array))
                    198: 
                    199: /**
                    200:  * Ignore result of functions tagged with warn_unused_result attributes
                    201:  */
                    202: #define ignore_result(call) { if(call){}; }
                    203: 
                    204: #if !defined(HAVE_SIGWAITINFO) && !defined(WIN32)
                    205: /**
                    206:  * Block and wait for a set of signals
                    207:  *
                    208:  * We don't replicate the functionality of siginfo_t.  If info is not NULL
                    209:  * -1 is returned and errno is set to EINVAL.
                    210:  *
                    211:  * @param set          set of signals to wait for
                    212:  * @param info         must be NULL
                    213:  */
                    214: int sigwaitinfo(const sigset_t *set, void *info);
                    215: #endif
                    216: 
                    217: /**
                    218:  * Portable function to wait for SIGINT/SIGTERM (or equivalent).
                    219:  */
                    220: void wait_sigint();
                    221: 
                    222: #ifndef HAVE_CLOSEFROM
                    223: /**
                    224:  * Close open file descriptors greater than or equal to lowfd.
                    225:  *
                    226:  * @param lowfd                start closing file descriptors from here
                    227:  */
                    228: void closefrom(int lowfd);
                    229: #endif
                    230: 
                    231: /**
                    232:  * returns null
                    233:  */
                    234: void *return_null();
                    235: 
                    236: /**
                    237:  * No-Operation function
                    238:  */
                    239: void nop();
                    240: 
                    241: /**
                    242:  * returns TRUE
                    243:  */
                    244: bool return_true();
                    245: 
                    246: /**
                    247:  * returns FALSE
                    248:  */
                    249: bool return_false();
                    250: 
                    251: #endif /** UTILS_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>