Annotation of embedaddon/strongswan/src/libstrongswan/utils/utils.h, revision 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>