2 * Copyright (C) 2008-2011 Tobias Brunner
3 * Copyright (C) 2008 Martin Willi
4 * Hochschule fuer Technik Rapperswil
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>.
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
18 * @defgroup utils utils
19 * @{ @ingroup libstrongswan
25 #include <sys/types.h>
29 #include <arpa/inet.h>
35 * strongSwan program return codes
37 #define SS_RC_LIBSTRONGSWAN_INTEGRITY 64
38 #define SS_RC_DAEMON_INTEGRITY 65
39 #define SS_RC_INITIALIZATION_FAILED 66
41 #define SS_RC_FIRST SS_RC_LIBSTRONGSWAN_INTEGRITY
42 #define SS_RC_LAST SS_RC_INITIALIZATION_FAILED
45 * Number of bits in a byte
47 #define BITS_PER_BYTE 8
50 * Default length for various auxiliary text buffers
55 * Macro compares two strings for equality
57 #define streq(x,y) (strcmp(x, y) == 0)
60 * Macro compares two strings for equality, length limited
62 #define strneq(x,y,len) (strncmp(x, y, len) == 0)
65 * Macro compares two strings for equality ignoring case
67 #define strcaseeq(x,y) (strcasecmp(x, y) == 0)
70 * Macro compares two strings for equality ignoring case, length limited
72 #define strncaseeq(x,y,len) (strncasecmp(x, y, len) == 0)
75 * NULL-safe strdup variant
77 #define strdupnull(x) ({ char *_x = x; _x ? strdup(_x) : NULL; })
80 * Macro compares two binary blobs for equality
82 #define memeq(x,y,len) (memcmp(x, y, len) == 0)
85 * Macro gives back larger of two values.
94 * Macro gives back smaller of two values.
102 * Call destructor of an object, if object != NULL
104 #define DESTROY_IF(obj) if (obj) (obj)->destroy(obj)
107 * Call offset destructor of an object, if object != NULL
109 #define DESTROY_OFFSET_IF(obj, offset) if (obj) obj->destroy_offset(obj, offset);
112 * Call function destructor of an object, if object != NULL
114 #define DESTROY_FUNCTION_IF(obj, fn) if (obj) obj->destroy_function(obj, fn);
117 * Debug macro to follow control flow
119 #define POS printf("%s, line %d\n", __FILE__, __LINE__)
122 * Object allocation/initialization macro, using designated initializer.
124 #define INIT(this, ...) ({ (this) = malloc(sizeof(*(this))); \
125 *(this) = (typeof(*(this))){ __VA_ARGS__ }; \
129 * Method declaration/definition macro, providing private and public interface.
131 * Defines a method name with this as first parameter and a return value ret,
132 * and an alias for this method with a _ prefix, having the this argument
133 * safely casted to the public interface iface.
134 * _name is provided a function pointer, but will get optimized out by GCC.
136 #define METHOD(iface, name, ret, this, ...) \
137 static ret name(union {iface *_public; this;} \
138 __attribute__((transparent_union)), ##__VA_ARGS__); \
139 static const typeof(name) *_##name = (const typeof(name)*)name; \
140 static ret name(this, ##__VA_ARGS__)
143 * Same as METHOD(), but is defined for two public interfaces.
145 #define METHOD2(iface1, iface2, name, ret, this, ...) \
146 static ret name(union {iface1 *_public1; iface2 *_public2; this;} \
147 __attribute__((transparent_union)), ##__VA_ARGS__); \
148 static const typeof(name) *_##name = (const typeof(name)*)name; \
149 static ret name(this, ##__VA_ARGS__)
152 * Architecture independent bitfield definition helpers (at least with GCC).
154 * Defines a bitfield with a type t and a fixed size of bitfield members, e.g.:
155 * BITFIELD2(u_int8_t,
159 * The member defined first placed at bit 0.
161 #if BYTE_ORDER == LITTLE_ENDIAN
162 #define BITFIELD2(t, a, b,...) struct { t a; t b; __VA_ARGS__}
163 #define BITFIELD3(t, a, b, c,...) struct { t a; t b; t c; __VA_ARGS__}
164 #define BITFIELD4(t, a, b, c, d,...) struct { t a; t b; t c; t d; __VA_ARGS__}
165 #define BITFIELD5(t, a, b, c, d, e,...) struct { t a; t b; t c; t d; t e; __VA_ARGS__}
166 #elif BYTE_ORDER == BIG_ENDIAN
167 #define BITFIELD2(t, a, b,...) struct { t b; t a; __VA_ARGS__}
168 #define BITFIELD3(t, a, b, c,...) struct { t c; t b; t a; __VA_ARGS__}
169 #define BITFIELD4(t, a, b, c, d,...) struct { t d; t c; t b; t a; __VA_ARGS__}
170 #define BITFIELD5(t, a, b, c, d, e,...) struct { t e; t d; t c; t b; t a; __VA_ARGS__}
174 * Macro to allocate a sized type.
176 #define malloc_thing(thing) ((thing*)malloc(sizeof(thing)))
179 * Get the number of elements in an array
181 #define countof(array) (sizeof(array)/sizeof(array[0]))
184 * Ignore result of functions tagged with warn_unused_result attributes
186 #define ignore_result(call) { if(call){}; }
189 * Assign a function as a class method
191 #define ASSIGN(method, function) (method = (typeof(method))function)
196 #define UNDEFINED_TIME 0
199 * Maximum time since epoch causing wrap-around on Jan 19 03:14:07 UTC 2038
201 #define TIME_32_BIT_SIGNED_MAX 0x7fffffff
204 * General purpose boolean type.
206 #ifdef HAVE_STDBOOL_H
207 # include <stdbool.h>
210 # define _Bool signed char
211 # endif /* HAVE__BOOL */
215 # define __bool_true_false_are_defined 1
216 #endif /* HAVE_STDBOOL_H */
225 * define some missing fixed width int types on OpenSolaris.
226 * TODO: since the uintXX_t types are defined by the C99 standard we should
227 * probably use those anyway
231 typedef uint8_t u_int8_t
;
232 typedef uint16_t u_int16_t
;
233 typedef uint32_t u_int32_t
;
234 typedef uint64_t u_int64_t
;
237 typedef enum status_t status_t
;
240 * Return values of function calls.
259 * The suggested operation is already done
269 * One of the arguments is invalid.
274 * Something could not be found.
279 * Error while parsing.
284 * Error while verifying.
289 * Object in invalid state.
294 * Destroy object which called method belongs to.
299 * Another call to the method is required.
305 * enum_names for type status_t.
307 extern enum_name_t
*status_names
;
310 * deprecated pluto style return value:
311 * error message, NULL for success
313 typedef const char *err_t
;
316 * Handle struct timeval like an own type.
318 typedef struct timeval timeval_t
;
321 * Handle struct timespec like an own type.
323 typedef struct timespec timespec_t
;
326 * Handle struct chunk_t like an own type.
328 typedef struct sockaddr sockaddr_t
;
331 * Clone a data to a newly allocated buffer
333 void *clalloc(void *pointer
, size_t size
);
336 * Same as memcpy, but XORs src into dst instead of copy
338 void memxor(u_int8_t dest
[], u_int8_t src
[], size_t n
);
341 * Safely overwrite n bytes of memory at ptr with zero, non-inlining variant.
343 void memwipe_noinline(void *ptr
, size_t n
);
346 * Safely overwrite n bytes of memory at ptr with zero, inlining variant.
348 static inline void memwipe_inline(void *ptr
, size_t n
)
350 volatile char *c
= (volatile char*)ptr
;
353 /* byte wise until long aligned */
354 for (i
= 0; (uintptr_t)&c
[i
] % sizeof(long) && i
< n
; i
++)
359 if (n
>= sizeof(long))
361 for (m
= n
- sizeof(long); i
<= m
; i
+= sizeof(long))
363 *(volatile long*)&c
[i
] = 0;
366 /* byte wise of the rest */
374 * Safely overwrite n bytes of memory at ptr with zero, auto-inlining variant.
376 static inline void memwipe(void *ptr
, size_t n
)
378 if (__builtin_constant_p(n
))
380 memwipe_inline(ptr
, n
);
384 memwipe_noinline(ptr
, n
);
389 * A variant of strstr with the characteristics of memchr, where haystack is not
390 * a null-terminated string but simply a memory area of length n.
392 void *memstr(const void *haystack
, const char *needle
, size_t n
);
395 * Translates the characters in the given string, searching for characters
396 * in 'from' and mapping them to characters in 'to'.
397 * The two characters sets 'from' and 'to' must contain the same number of
400 char *translate(char *str
, const char *from
, const char *to
);
403 * Creates a directory and all required parent directories.
405 * @param path path to the new directory
406 * @param mode permissions of the new directory/directories
407 * @return TRUE on success
409 bool mkdir_p(const char *path
, mode_t mode
);
411 #ifndef HAVE_CLOSEFROM
413 * Close open file descriptors greater than or equal to lowfd.
415 * @param lowfd start closing file descriptoros from here
417 void closefrom(int lowfd
);
421 * Get a timestamp from a monotonic time source.
423 * While the time()/gettimeofday() functions are affected by leap seconds
424 * and system time changes, this function returns ever increasing monotonic
427 * @param tv timeval struct receiving monotonic timestamps, or NULL
428 * @return monotonic timestamp in seconds
430 time_t time_monotonic(timeval_t
*tv
);
438 * No-Operation function
455 status_t
return_failed();
458 * Write a 16-bit host order value in network order to an unaligned address.
460 * @param host host order 16-bit value
461 * @param network unaligned address to write network order value to
463 static inline void htoun16(void *network
, u_int16_t host
)
465 char *unaligned
= (char*)network
;
468 memcpy(unaligned
, &host
, sizeof(host
));
472 * Write a 32-bit host order value in network order to an unaligned address.
474 * @param host host order 32-bit value
475 * @param network unaligned address to write network order value to
477 static inline void htoun32(void *network
, u_int32_t host
)
479 char *unaligned
= (char*)network
;
482 memcpy((char*)unaligned
, &host
, sizeof(host
));
486 * Read a 16-bit value in network order from an unaligned address to host order.
488 * @param network unaligned address to read network order value from
489 * @return host order value
491 static inline u_int16_t
untoh16(void *network
)
493 char *unaligned
= (char*)network
;
496 memcpy(&tmp
, unaligned
, sizeof(tmp
));
501 * Read a 32-bit value in network order from an unaligned address to host order.
503 * @param network unaligned address to read network order value from
504 * @return host order value
506 static inline u_int32_t
untoh32(void *network
)
508 char *unaligned
= (char*)network
;
511 memcpy(&tmp
, unaligned
, sizeof(tmp
));
516 * Special type to count references
518 typedef volatile u_int refcount_t
;
521 #ifdef HAVE_GCC_ATOMIC_OPERATIONS
523 #define ref_get(ref) {__sync_fetch_and_add(ref, 1); }
524 #define ref_put(ref) (!__sync_sub_and_fetch(ref, 1))
526 #else /* !HAVE_GCC_ATOMIC_OPERATIONS */
529 * Get a new reference.
531 * Increments the reference counter atomic.
533 * @param ref pointer to ref counter
535 void ref_get(refcount_t
*ref
);
538 * Put back a unused reference.
540 * Decrements the reference counter atomic and
541 * says if more references available.
543 * @param ref pointer to ref counter
544 * @return TRUE if no more references counted
546 bool ref_put(refcount_t
*ref
);
548 #endif /* HAVE_GCC_ATOMIC_OPERATIONS */
551 * printf hook for time_t.
554 * time_t* time, bool utc
556 int time_printf_hook(char *dst
, size_t len
, printf_hook_spec_t
*spec
,
557 const void *const *args
);
560 * printf hook for time_t deltas.
563 * time_t* begin, time_t* end
565 int time_delta_printf_hook(char *dst
, size_t len
, printf_hook_spec_t
*spec
,
566 const void *const *args
);
569 * printf hook for memory areas.
572 * u_char *ptr, int len
574 int mem_printf_hook(char *dst
, size_t len
, printf_hook_spec_t
*spec
,
575 const void *const *args
);
577 #endif /** UTILS_H_ @}*/