]> git.ipfire.org Git - people/ms/strongswan.git/blob - src/libstrongswan/utils/utils.h
align: Move min/max/padding/alignment functions to separate files
[people/ms/strongswan.git] / src / libstrongswan / utils / utils.h
1 /*
2 * Copyright (C) 2008-2014 Tobias Brunner
3 * Copyright (C) 2008 Martin Willi
4 * 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 #include <sys/types.h>
26 #include <stdlib.h>
27 #include <stddef.h>
28 #include <sys/time.h>
29 #include <string.h>
30
31 #ifdef WIN32
32 # include "compat/windows.h"
33 #else
34 # define _GNU_SOURCE
35 # include <arpa/inet.h>
36 # include <sys/socket.h>
37 # include <netdb.h>
38 # include <netinet/in.h>
39 # include <sched.h>
40 # include <poll.h>
41 #endif
42
43 /**
44 * strongSwan program return codes
45 */
46 #define SS_RC_LIBSTRONGSWAN_INTEGRITY 64
47 #define SS_RC_DAEMON_INTEGRITY 65
48 #define SS_RC_INITIALIZATION_FAILED 66
49
50 #define SS_RC_FIRST SS_RC_LIBSTRONGSWAN_INTEGRITY
51 #define SS_RC_LAST SS_RC_INITIALIZATION_FAILED
52
53 /**
54 * Number of bits in a byte
55 */
56 #define BITS_PER_BYTE 8
57
58 /**
59 * Default length for various auxiliary text buffers
60 */
61 #define BUF_LEN 512
62
63 /**
64 * Build assertion macro for integer expressions, evaluates to 0
65 */
66 #define BUILD_ASSERT(x) (sizeof(char[(x) ? 0 : -1]))
67
68 /**
69 * Build time check to assert a is an array, evaluates to 0
70 *
71 * The address of an array element has a pointer type, which is not compatible
72 * to the array type.
73 */
74 #define BUILD_ASSERT_ARRAY(a) \
75 BUILD_ASSERT(!__builtin_types_compatible_p(typeof(a), typeof(&(a)[0])))
76
77 #include "utils/types.h"
78 #include "enum.h"
79 #include "utils/atomics.h"
80 #include "utils/align.h"
81 #include "utils/byteorder.h"
82 #include "utils/string.h"
83 #include "utils/memory.h"
84 #include "utils/strerror.h"
85 #include "utils/status.h"
86 #include "utils/object.h"
87 #include "utils/path.h"
88 #include "utils/time.h"
89 #include "utils/tty.h"
90 #ifdef __APPLE__
91 # include "compat/apple.h"
92 #endif
93
94 /**
95 * Initialize utility functions
96 */
97 void utils_init();
98
99 /**
100 * Deinitialize utility functions
101 */
102 void utils_deinit();
103
104 /**
105 * Debug macro to follow control flow
106 */
107 #define POS printf("%s, line %d\n", __FILE__, __LINE__)
108
109 /**
110 * This macro allows counting the number of arguments passed to a macro.
111 * Combined with the VA_ARGS_DISPATCH() macro this can be used to implement
112 * macro overloading based on the number of arguments.
113 * 0 to 10 arguments are currently supported.
114 */
115 #define VA_ARGS_NUM(...) _VA_ARGS_NUM(0,##__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0)
116 #define _VA_ARGS_NUM(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NUM,...) NUM
117
118 /**
119 * This macro can be used to dispatch a macro call based on the number of given
120 * arguments, for instance:
121 *
122 * @code
123 * #define MY_MACRO(...) VA_ARGS_DISPATCH(MY_MACRO, __VA_ARGS__)(__VA_ARGS__)
124 * #define MY_MACRO1(arg) one_arg(arg)
125 * #define MY_MACRO2(arg1,arg2) two_args(arg1,arg2)
126 * @endcode
127 *
128 * MY_MACRO() can now be called with either one or two arguments, which will
129 * resolve to one_arg(arg) or two_args(arg1,arg2), respectively.
130 */
131 #define VA_ARGS_DISPATCH(func, ...) _VA_ARGS_DISPATCH(func, VA_ARGS_NUM(__VA_ARGS__))
132 #define _VA_ARGS_DISPATCH(func, num) __VA_ARGS_DISPATCH(func, num)
133 #define __VA_ARGS_DISPATCH(func, num) func ## num
134
135 /**
136 * Macro to allocate a sized type.
137 */
138 #define malloc_thing(thing) ((thing*)malloc(sizeof(thing)))
139
140 /**
141 * Get the number of elements in an array
142 */
143 #define countof(array) (sizeof(array)/sizeof((array)[0]) \
144 + BUILD_ASSERT_ARRAY(array))
145
146 /**
147 * Ignore result of functions tagged with warn_unused_result attributes
148 */
149 #define ignore_result(call) { if(call){}; }
150
151 /**
152 * Portable function to wait for SIGINT/SIGTERM (or equivalent).
153 */
154 void wait_sigint();
155
156 #ifndef HAVE_CLOSEFROM
157 /**
158 * Close open file descriptors greater than or equal to lowfd.
159 *
160 * @param lowfd start closing file descriptors from here
161 */
162 void closefrom(int lowfd);
163 #endif
164
165 /**
166 * returns null
167 */
168 void *return_null();
169
170 /**
171 * No-Operation function
172 */
173 void nop();
174
175 /**
176 * returns TRUE
177 */
178 bool return_true();
179
180 /**
181 * returns FALSE
182 */
183 bool return_false();
184
185 #endif /** UTILS_H_ @}*/