42a8158b1d
On localized, non-English versions of windows, it is common to have two active charsets -- for console applications and for GUI applications, together with localized error messages returned by windows. But two charsets are rarely compatible, so sending the same byte sequence to console and to windows event log makes one or another to be unreadable. So at least include the error number, this way it will be possible to lookup the actual error test using external ways. Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
78 lines
2.2 KiB
C
78 lines
2.2 KiB
C
/*
|
|
utils.c -- gathering of some stupid small functions
|
|
Copyright (C) 1999-2005 Ivo Timmermans
|
|
2000-2009 Guus Sliepen <guus@tinc-vpn.org>
|
|
|
|
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.
|
|
|
|
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.
|
|
*/
|
|
|
|
#include "system.h"
|
|
|
|
#include "../src/logger.h"
|
|
#include "utils.h"
|
|
|
|
static const char hexadecimals[] = "0123456789ABCDEF";
|
|
|
|
static int charhex2bin(char c) {
|
|
if(isdigit(c))
|
|
return c - '0';
|
|
else
|
|
return toupper(c) - 'A' + 10;
|
|
}
|
|
|
|
|
|
void hex2bin(char *src, char *dst, int length) {
|
|
int i;
|
|
for(i = 0; i < length; i++)
|
|
dst[i] = charhex2bin(src[i * 2]) * 16 + charhex2bin(src[i * 2 + 1]);
|
|
}
|
|
|
|
void bin2hex(char *src, char *dst, int length) {
|
|
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];
|
|
}
|
|
}
|
|
|
|
#if defined(HAVE_MINGW) || defined(HAVE_CYGWIN)
|
|
#ifdef HAVE_CYGWIN
|
|
#include <w32api/windows.h>
|
|
#endif
|
|
|
|
const char *winerror(int err) {
|
|
static char buf[1024], *ptr;
|
|
|
|
ptr = buf + sprintf(buf, "(%d) ", err);
|
|
|
|
if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), ptr, sizeof(buf) - (ptr - buf), NULL)) {
|
|
strcpy(ptr, "(unable to format errormessage)");
|
|
};
|
|
|
|
if((ptr = strchr(buf, '\r')))
|
|
*ptr = '\0';
|
|
|
|
return buf;
|
|
}
|
|
#endif
|
|
|
|
unsigned int bitfield_to_int(const void *bitfield, size_t size) {
|
|
unsigned int value = 0;
|
|
if(size > sizeof value)
|
|
size = sizeof value;
|
|
memcpy(&value, bitfield, size);
|
|
return value;
|
|
}
|