+#ifndef MESHLINK_UTILS_H
+#define MESHLINK_UTILS_H
+
/*
utils.h -- header file for utils.c
- Copyright (C) 1999-2005 Ivo Timmermans
- 2000-2009 Guus Sliepen <guus@tinc-vpn.org>
+ Copyright (C) 2014, 2017 Guus Sliepen <guus@meshlink.io>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef __TINC_UTILS_H__
-#define __TINC_UTILS_H__
+int hex2bin(const char *src, void *dst, int length);
+int bin2hex(const void *src, char *dst, int length);
-extern void hex2bin(char *src, char *dst, int length);
-extern void bin2hex(char *src, char *dst, int length);
+int b64encode(const void *src, char *dst, int length);
+int b64encode_urlsafe(const void *src, char *dst, int length);
+int b64decode(const char *src, void *dst, int length);
#ifdef HAVE_MINGW
-extern const char *winerror(int);
+const char *winerror(int);
#define strerror(x) ((x)>0?strerror(x):winerror(GetLastError()))
#define sockerrno WSAGetLastError()
#define sockstrerror(x) winerror(x)
#define sockinuse(x) ((x) == EADDRINUSE)
#endif
-extern unsigned int bitfield_to_int(const void *bitfield, size_t size);
+unsigned int bitfield_to_int(const void *bitfield, size_t size) __attribute__((__warn_unused_result__));
+
+static inline void timespec_add(const struct timespec *a, const struct timespec *b, struct timespec *r) {
+ r->tv_sec = a->tv_sec + b->tv_sec;
+ r->tv_nsec = a->tv_nsec + b->tv_nsec;
+
+ if(r->tv_nsec > 1000000000) {
+ r->tv_sec++, r->tv_nsec -= 1000000000;
+ }
+}
+
+static inline void timespec_sub(const struct timespec *a, const struct timespec *b, struct timespec *r) {
+ r->tv_sec = a->tv_sec - b->tv_sec;
+ r->tv_nsec = a->tv_nsec - b->tv_nsec;
+
+ if(r->tv_nsec < 0) {
+ r->tv_sec--, r->tv_nsec += 1000000000;
+ }
+}
-#endif /* __TINC_UTILS_H__ */
+static inline bool timespec_lt(const struct timespec *a, const struct timespec *b) {
+ if(a->tv_sec == b->tv_sec) {
+ return a->tv_nsec < b->tv_nsec;
+ } else {
+ return a->tv_sec < b->tv_sec;
+ }
+}
+
+static inline void timespec_clear(struct timespec *a) {
+ a->tv_sec = 0;
+ a->tv_nsec = 0;
+}
+
+static inline bool timespec_isset(const struct timespec *a) {
+ return a->tv_sec || a->tv_nsec;
+}
+
+#endif