tinc/src/utils.c

81 lines
2.2 KiB
C
Raw Normal View History

2019-08-26 11:44:36 +00:00
/*
utils.c -- gathering of some stupid small functions
2019-08-26 11:44:38 +00:00
Copyright (C) 1999-2005 Ivo Timmermans
2000-2009 Guus Sliepen <guus@tinc-vpn.org>
2019-08-26 11:44:36 +00:00
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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
2019-08-26 11:44:38 +00:00
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2019-08-26 11:44:36 +00:00
*/
2019-08-26 11:44:36 +00:00
#include "system.h"
2019-08-26 11:44:36 +00:00
2019-08-26 11:44:36 +00:00
#include "../src/logger.h"
#include "utils.h"
2019-08-26 11:44:36 +00:00
2019-08-26 11:44:41 +00:00
static const char hexadecimals[] = "0123456789ABCDEF";
2019-08-26 11:44:36 +00:00
2019-08-26 11:44:41 +00:00
static int charhex2bin(char c) {
2019-08-26 11:44:36 +00:00
if(isdigit(c))
return c - '0';
else
return toupper(c) - 'A' + 10;
2019-08-26 11:44:36 +00:00
}
2019-08-26 11:44:43 +00:00
bool hex2bin(char *src, char *dst, int length) {
for(int i = 0; i < length; i++) {
if(!isxdigit(src[i * 2]) || !isxdigit(src[i * 2 + 1]))
return false;
2019-08-26 11:44:36 +00:00
dst[i] = charhex2bin(src[i * 2]) * 16 + charhex2bin(src[i * 2 + 1]);
2019-08-26 11:44:43 +00:00
}
return true;
2019-08-26 11:44:36 +00:00
}
2019-08-26 11:44:38 +00:00
void bin2hex(char *src, char *dst, int length) {
2019-08-26 11:44:36 +00:00
int i;
for(i = length - 1; i >= 0; i--) {
dst[i * 2 + 1] = hexadecimals[(unsigned char) src[i] & 15];
dst[i * 2] = hexadecimals[(unsigned char) src[i] >> 4];
}
2019-08-26 11:44:36 +00:00
}
2019-08-26 11:44:36 +00:00
#if defined(HAVE_MINGW) || defined(HAVE_CYGWIN)
#ifdef HAVE_CYGWIN
#include <w32api/windows.h>
#endif
2019-08-26 11:44:38 +00:00
const char *winerror(int err) {
2019-08-26 11:44:42 +00:00
static char buf[1024], *ptr;
ptr = buf + sprintf(buf, "(%d) ", err);
2019-08-26 11:44:36 +00:00
if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
2019-08-26 11:44:42 +00:00
NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), ptr, sizeof(buf) - (ptr - buf), NULL)) {
strcpy(ptr, "(unable to format errormessage)");
2019-08-26 11:44:36 +00:00
};
2019-08-26 11:44:42 +00:00
if((ptr = strchr(buf, '\r')))
*ptr = '\0';
2019-08-26 11:44:36 +00:00
return buf;
2019-08-26 11:44:36 +00:00
}
#endif
2019-08-26 11:44:36 +00:00
2019-08-26 11:44:41 +00:00
unsigned int bitfield_to_int(const void *bitfield, size_t size) {
2019-08-26 11:44:38 +00:00
unsigned int value = 0;
if(size > sizeof value)
size = sizeof value;
memcpy(&value, bitfield, size);
return value;
}