3f8ffc6d417bf6134bdc87048a7179e874baaa26
[strongswan.git] / src / libstrongswan / utils.h
1 /*
2 * Copyright (C) 2008-2009 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 utils
19 * @{ @ingroup libstrongswan
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 <arpa/inet.h>
30 #include <string.h>
31
32 #include <enum.h>
33
34 /**
35 * strongSwan program return codes
36 */
37 #define SS_RC_LIBSTRONGSWAN_INTEGRITY 64
38 #define SS_RC_DAEMON_INTEGRITY 65
39 #define SS_RC_INITIALIZATION_FAILED 66
40
41 #define SS_RC_FIRST SS_RC_LIBSTRONGSWAN_INTEGRITY
42 #define SS_RC_LAST SS_RC_INITIALIZATION_FAILED
43
44 /**
45 * Number of bits in a byte
46 */
47 #define BITS_PER_BYTE 8
48
49 /**
50 * Default length for various auxiliary text buffers
51 */
52 #define BUF_LEN 512
53
54 /**
55 * Macro compares two strings for equality
56 */
57 #define streq(x,y) (strcmp(x, y) == 0)
58
59 /**
60 * Macro compares two strings for equality
61 */
62 #define strneq(x,y,len) (strncmp(x, y, len) == 0)
63
64 /**
65 * Macro compares two strings for equality ignoring case
66 */
67 #define strcaseeq(x,y) (strcasecmp(x, y) == 0)
68
69 /**
70 * Macro compares two binary blobs for equality
71 */
72 #define memeq(x,y,len) (memcmp(x, y, len) == 0)
73
74 /**
75 * Macro gives back larger of two values.
76 */
77 #define max(x,y) ({ \
78 typeof(x) _x = (x); \
79 typeof(y) _y = (y); \
80 _x > _y ? _x : _y; })
81
82
83 /**
84 * Macro gives back smaller of two values.
85 */
86 #define min(x,y) ({ \
87 typeof(x) _x = (x); \
88 typeof(y) _y = (y); \
89 _x < _y ? _x : _y; })
90
91 /**
92 * Call destructor of an object, if object != NULL
93 */
94 #define DESTROY_IF(obj) if (obj) (obj)->destroy(obj)
95
96 /**
97 * Call offset destructor of an object, if object != NULL
98 */
99 #define DESTROY_OFFSET_IF(obj, offset) if (obj) obj->destroy_offset(obj, offset);
100
101 /**
102 * Call function destructor of an object, if object != NULL
103 */
104 #define DESTROY_FUNCTION_IF(obj, fn) if (obj) obj->destroy_function(obj, fn);
105
106 /**
107 * Debug macro to follow control flow
108 */
109 #define POS printf("%s, line %d\n", __FILE__, __LINE__)
110
111 /**
112 * Macro to allocate a sized type.
113 */
114 #define malloc_thing(thing) ((thing*)malloc(sizeof(thing)))
115
116 /**
117 * Get the number of elements in an array
118 */
119 #define countof(array) (sizeof(array)/sizeof(array[0]))
120
121 /**
122 * Ignore result of functions tagged with warn_unused_result attributes
123 */
124 #define ignore_result(call) { if(call); }
125
126 /**
127 * Assign a function as a class method
128 */
129 #define ASSIGN(method, function) (method = (typeof(method))function)
130
131 /**
132 * time_t not defined
133 */
134 #define UNDEFINED_TIME 0
135
136 /**
137 * Maximum time since epoch causing wrap-around on Jan 19 03:14:07 UTC 2038
138 */
139 #define TIME_32_BIT_SIGNED_MAX 0x7fffffff
140
141 /**
142 * General purpose boolean type.
143 */
144 #ifdef HAVE_STDBOOL_H
145 # include <stdbool.h>
146 #else
147 # ifndef HAVE__BOOL
148 # define _Bool signed char
149 # endif /* HAVE__BOOL */
150 # define bool _Bool
151 # define false 0
152 # define true 1
153 # define __bool_true_false_are_defined 1
154 #endif /* HAVE_STDBOOL_H */
155 #ifndef FALSE
156 # define FALSE false
157 #endif /* FALSE */
158 #ifndef TRUE
159 # define TRUE true
160 #endif /* TRUE */
161
162 /**
163 * define some missing fixed width int types on OpenSolaris.
164 * TODO: since the uintXX_t types are defined by the C99 standard we should
165 * probably use those anyway
166 */
167 #ifdef __sun
168 #include <stdint.h>
169 typedef uint8_t u_int8_t;
170 typedef uint16_t u_int16_t;
171 typedef uint32_t u_int32_t;
172 typedef uint64_t u_int64_t;
173 #endif
174
175 typedef enum status_t status_t;
176
177 /**
178 * Return values of function calls.
179 */
180 enum status_t {
181 /**
182 * Call succeeded.
183 */
184 SUCCESS,
185
186 /**
187 * Call failed.
188 */
189 FAILED,
190
191 /**
192 * Out of resources.
193 */
194 OUT_OF_RES,
195
196 /**
197 * The suggested operation is already done
198 */
199 ALREADY_DONE,
200
201 /**
202 * Not supported.
203 */
204 NOT_SUPPORTED,
205
206 /**
207 * One of the arguments is invalid.
208 */
209 INVALID_ARG,
210
211 /**
212 * Something could not be found.
213 */
214 NOT_FOUND,
215
216 /**
217 * Error while parsing.
218 */
219 PARSE_ERROR,
220
221 /**
222 * Error while verifying.
223 */
224 VERIFY_ERROR,
225
226 /**
227 * Object in invalid state.
228 */
229 INVALID_STATE,
230
231 /**
232 * Destroy object which called method belongs to.
233 */
234 DESTROY_ME,
235
236 /**
237 * Another call to the method is required.
238 */
239 NEED_MORE,
240 };
241
242 /**
243 * enum_names for type status_t.
244 */
245 extern enum_name_t *status_names;
246
247 /**
248 * deprecated pluto style return value:
249 * error message, NULL for success
250 */
251 typedef const char *err_t;
252
253 /**
254 * Handle struct timeval like an own type.
255 */
256 typedef struct timeval timeval_t;
257
258 /**
259 * Handle struct timespec like an own type.
260 */
261 typedef struct timespec timespec_t;
262
263 /**
264 * Handle struct chunk_t like an own type.
265 */
266 typedef struct sockaddr sockaddr_t;
267
268 /**
269 * Clone a data to a newly allocated buffer
270 */
271 void *clalloc(void *pointer, size_t size);
272
273 /**
274 * Same as memcpy, but XORs src into dst instead of copy
275 */
276 void memxor(u_int8_t dest[], u_int8_t src[], size_t n);
277
278 /**
279 * A variant of strstr with the characteristics of memchr, where haystack is not
280 * a null-terminated string but simply a memory area of length n.
281 */
282 void *memstr(const void *haystack, const char *needle, size_t n);
283
284 /**
285 * Creates a directory and all required parent directories.
286 *
287 * @param path path to the new directory
288 * @param mode permissions of the new directory/directories
289 * @return TRUE on success
290 */
291 bool mkdir_p(const char *path, mode_t mode);
292
293 /**
294 * Get a timestamp from a monotonic time source.
295 *
296 * While the time()/gettimeofday() functions are affected by leap seconds
297 * and system time changes, this function returns ever increasing monotonic
298 * time stamps.
299 *
300 * @param tv timeval struct receiving monotonic timestamps, or NULL
301 * @return monotonic timestamp in seconds
302 */
303 time_t time_monotonic(timeval_t *tv);
304
305 /**
306 * returns null
307 */
308 void *return_null();
309
310 /**
311 * No-Operation function
312 */
313 void nop();
314
315 /**
316 * returns TRUE
317 */
318 bool return_true();
319
320 /**
321 * returns FALSE
322 */
323 bool return_false();
324
325 /**
326 * Write a 16-bit host order value in network order to an unaligned address.
327 *
328 * @param host host order 16-bit value
329 * @param network unaligned address to write network order value to
330 */
331 static inline void htoun16(void *network, u_int16_t host)
332 {
333 host = htons(host);
334 memcpy(network, &host, sizeof(host));
335 }
336
337 /**
338 * Write a 32-bit host order value in network order to an unaligned address.
339 *
340 * @param host host order 32-bit value
341 * @param network unaligned address to write network order value to
342 */
343 static inline void htoun32(void *network, u_int32_t host)
344 {
345 host = htonl(host);
346 memcpy(network, &host, sizeof(host));
347 }
348
349 /**
350 * Read a 16-bit value in network order from an unaligned address to host order.
351 *
352 * @param network unaligned address to read network order value from
353 * @return host order value
354 */
355 static inline u_int16_t untoh16(void *network)
356 {
357 u_int16_t tmp;
358
359 memcpy(&tmp, network, sizeof(tmp));
360 return ntohs(tmp);
361 }
362
363 /**
364 * Read a 32-bit value in network order from an unaligned address to host order.
365 *
366 * @param network unaligned address to read network order value from
367 * @return host order value
368 */
369 static inline u_int32_t untoh32(void *network)
370 {
371 u_int32_t tmp;
372
373 memcpy(&tmp, network, sizeof(tmp));
374 return ntohs(tmp);
375 }
376
377 /**
378 * Special type to count references
379 */
380 typedef volatile u_int refcount_t;
381
382
383 #ifdef HAVE_GCC_ATOMIC_OPERATIONS
384
385 #define ref_get(ref) {__sync_fetch_and_add(ref, 1); }
386 #define ref_put(ref) (!__sync_sub_and_fetch(ref, 1))
387
388 #else /* !HAVE_GCC_ATOMIC_OPERATIONS */
389
390 /**
391 * Get a new reference.
392 *
393 * Increments the reference counter atomic.
394 *
395 * @param ref pointer to ref counter
396 */
397 void ref_get(refcount_t *ref);
398
399 /**
400 * Put back a unused reference.
401 *
402 * Decrements the reference counter atomic and
403 * says if more references available.
404 *
405 * @param ref pointer to ref counter
406 * @return TRUE if no more references counted
407 */
408 bool ref_put(refcount_t *ref);
409
410 #endif /* HAVE_GCC_ATOMIC_OPERATIONS */
411
412 /**
413 * printf hook for time_t.
414 *
415 * Arguments are:
416 * time_t* time, bool utc
417 */
418 int time_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec,
419 const void *const *args);
420
421 /**
422 * printf hook for time_t deltas.
423 *
424 * Arguments are:
425 * time_t* begin, time_t* end
426 */
427 int time_delta_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec,
428 const void *const *args);
429
430 /**
431 * printf hook for memory areas.
432 *
433 * Arguments are:
434 * u_char *ptr, int len
435 */
436 int mem_printf_hook(char *dst, size_t len, printf_hook_spec_t *spec,
437 const void *const *args);
438
439 #endif /** UTILS_H_ @}*/