forked from enlightenment/efl
Windows: remove XP support and forbid compilation and run on this platform
Test Plan: run on XP Reviewers: jpeg, cedric, ajwillia.ms Reviewed By: ajwillia.ms Subscribers: ajwillia.ms Differential Revision: https://phab.enlightenment.org/D5245
This commit is contained in:
parent
3462390b5c
commit
10ba064b65
|
@ -427,7 +427,7 @@ m4_defn([UP])_LIBS=" ${m4_defn([UP])_LDFLAGS} ${EFLALL_COV_LIBS} ${EFLALL_LIBS}
|
|||
m4_defn([UP])_INTERNAL_LIBS="${m4_defn([UP])_INTERNAL_LIBS} ${requirements_internal_libs_[]m4_defn([DOWN])}"
|
||||
USE_[]m4_defn([UP])_LIBS="${m4_defn([UP])_LIBS} lib/${libdirname}/lib${libname}.la"
|
||||
USE_[]m4_defn([UP])_INTERNAL_LIBS="${m4_defn([UP])_INTERNAL_LIBS} lib/${libdirname}/lib${libname}.la"
|
||||
m4_defn([UP])_CFLAGS="${EFLALL_COV_CFLAGS} ${EFLALL_CFLAGS} ${m4_defn([UP])_CFLAGS} -I\$(top_srcdir)/src/lib/${libdirname} -I\$(top_builddir)/src/lib/${libdirname} -I\$(top_srcdir)/src/bindings/cxx/${libdirname} -I\$(top_builddir)/src/bindings/${libdirname} ${requirements_cflags_[]m4_defn([DOWN])} ${requirements_cflags_eflall} -DEFL_[]m4_defn([UP])_BUILD=1"
|
||||
m4_defn([UP])_CFLAGS="${EFL_WINDOWS_VERSION_CFLAGS} ${EFLALL_COV_CFLAGS} ${EFLALL_CFLAGS} ${m4_defn([UP])_CFLAGS} -I\$(top_srcdir)/src/lib/${libdirname} -I\$(top_builddir)/src/lib/${libdirname} -I\$(top_srcdir)/src/bindings/cxx/${libdirname} -I\$(top_builddir)/src/bindings/${libdirname} ${requirements_cflags_[]m4_defn([DOWN])} ${requirements_cflags_eflall} -DEFL_[]m4_defn([UP])_BUILD=1"
|
||||
requirements_pc_[]m4_defn([DOWN])="${requirements_pc_[]m4_defn([DOWN])} ${requirements_pc_eflall}"
|
||||
requirements_pc_deps_[]m4_defn([DOWN])="${requirements_pc_deps_[]m4_defn([DOWN])} ${requirements_pc_deps_eflall}"
|
||||
|
||||
|
|
|
@ -12,15 +12,15 @@ AC_DEFUN([EFL_SELECT_WINDOWS_VERSION],
|
|||
dnl configure option
|
||||
|
||||
AC_ARG_WITH([windows-version],
|
||||
[AC_HELP_STRING([--with-windows-version], [select the target Windows version (xp, vista or win7) @<:@default=win7@:>@])],
|
||||
[AC_HELP_STRING([--with-windows-version], [select the target Windows version (vista or win7) @<:@default=win7@:>@])],
|
||||
[
|
||||
if test "x${with_windows_version}" = "xvista" ; then
|
||||
_winver="vista"
|
||||
else
|
||||
if test "x${with_windows_version}" = "xxp" ; then
|
||||
_winver="xp"
|
||||
else
|
||||
if test "x${with_windows_version}" = "xwin7" ; then
|
||||
_winver="win7"
|
||||
else
|
||||
_winver="error"
|
||||
fi
|
||||
fi
|
||||
],
|
||||
|
@ -39,8 +39,7 @@ case "${_winver}" in
|
|||
_efl_windows_version="Windows 7"
|
||||
;;
|
||||
*)
|
||||
EFL_WINDOWS_VERSION_CFLAGS="-D_WIN32_WINNT=0x0501"
|
||||
_efl_windows_version="Windows XP"
|
||||
AC_MSG_ERROR([Wrong Windows version passed to configure. Run ./configure --help])
|
||||
;;
|
||||
esac
|
||||
|
||||
|
|
|
@ -262,6 +262,7 @@ $(CWARNFLAGS) \
|
|||
-DTARGET_VT=11
|
||||
if HAVE_WIN32
|
||||
bin_edje_epp_epp_CPPFLAGS += \
|
||||
@EFL_WINDOWS_VERSION_CFLAGS@ \
|
||||
-I$(top_srcdir)/src/lib/evil \
|
||||
-I$(top_builddir)/src/lib/evil
|
||||
bin_edje_epp_epp_LDADD = lib/evil/libevil.la
|
||||
|
|
|
@ -9,7 +9,6 @@ dist_install_evilheaders_DATA = \
|
|||
lib/evil/Evil.h \
|
||||
lib/evil/evil_dlfcn.h \
|
||||
lib/evil/evil_fcntl.h \
|
||||
lib/evil/evil_inet.h \
|
||||
lib/evil/evil_langinfo.h \
|
||||
lib/evil/evil_locale.h \
|
||||
lib/evil/evil_macro.h \
|
||||
|
@ -36,7 +35,6 @@ lib/evil/evil_dlfcn.c \
|
|||
lib/evil/evil_fcntl.c \
|
||||
lib/evil/evil_fnmatch.c \
|
||||
lib/evil/evil_fnmatch_list_of_states.c \
|
||||
lib/evil/evil_inet.c \
|
||||
lib/evil/evil_langinfo.c \
|
||||
lib/evil/evil_locale.c \
|
||||
lib/evil/evil_link_xp.cpp \
|
||||
|
|
|
@ -36,7 +36,7 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data *
|
|||
Eina_Error err;
|
||||
HANDLE h;
|
||||
char cstr[256], sstr[256];
|
||||
ULONG cpid = 0, spid = 0;
|
||||
ULONG cpid, spid;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(address, EINVAL);
|
||||
EINA_SAFETY_ON_TRUE_RETURN_VAL(strchr(address, '/') != NULL, EINVAL);
|
||||
|
@ -81,30 +81,25 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data *
|
|||
return err;
|
||||
}
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
if (!GetNamedPipeClientProcessId(_efl_net_socket_windows_handle_get(o), &cpid))
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s", o, address, msg);
|
||||
free(msg);
|
||||
}
|
||||
if (!GetNamedPipeServerProcessId(_efl_net_socket_windows_handle_get(o), &spid))
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s", o, address, msg);
|
||||
free(msg);
|
||||
}
|
||||
#endif
|
||||
if (GetNamedPipeClientProcessId(_efl_net_socket_windows_handle_get(o), &cpid))
|
||||
snprintf(cstr, sizeof(cstr), "%s:%lu", address, cpid);
|
||||
else
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s", o, address, msg);
|
||||
free(msg);
|
||||
eina_strlcpy(cstr, address, sizeof(cstr));
|
||||
}
|
||||
|
||||
if (cpid)
|
||||
snprintf(cstr, sizeof(cstr), "%s:%lu", address, cpid);
|
||||
else
|
||||
eina_strlcpy(cstr, address, sizeof(cstr));
|
||||
|
||||
if (spid)
|
||||
snprintf(sstr, sizeof(sstr), "%s:%lu", address, spid);
|
||||
else
|
||||
eina_strlcpy(sstr, address, sizeof(sstr));
|
||||
if (GetNamedPipeServerProcessId(_efl_net_socket_windows_handle_get(o), &spid))
|
||||
snprintf(sstr, sizeof(sstr), "%s:%lu", address, spid);
|
||||
else
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s", o, address, msg);
|
||||
free(msg);
|
||||
eina_strlcpy(sstr, address, sizeof(sstr));
|
||||
}
|
||||
|
||||
efl_net_socket_address_remote_set(o, sstr);
|
||||
efl_net_socket_address_local_set(o, cstr);
|
||||
|
|
|
@ -52,35 +52,30 @@ _efl_net_server_windows_client_listen_success(void *data, Eo *client, DWORD used
|
|||
Eo *o = data;
|
||||
Efl_Net_Server_Windows_Data *pd = efl_data_scope_get(o, MY_CLASS);
|
||||
char cstr[256], sstr[256];
|
||||
ULONG cpid = 0, spid = 0;
|
||||
ULONG cpid, spid;
|
||||
const char *addr = efl_net_server_address_get(o);
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(pd, EINVAL);
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
if (!GetNamedPipeClientProcessId(_efl_net_socket_windows_handle_get(client), &cpid))
|
||||
if (GetNamedPipeClientProcessId(_efl_net_socket_windows_handle_get(client), &cpid))
|
||||
snprintf(cstr, sizeof(cstr), "%s:%lu", addr, cpid);
|
||||
else
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeClientProcessId(client): %s", o, addr, msg);
|
||||
free(msg);
|
||||
eina_strlcpy(cstr, addr, sizeof(cstr));
|
||||
}
|
||||
if (!GetNamedPipeServerProcessId(_efl_net_socket_windows_handle_get(client), &spid))
|
||||
|
||||
if (GetNamedPipeServerProcessId(_efl_net_socket_windows_handle_get(client), &spid))
|
||||
snprintf(sstr, sizeof(sstr), "%s:%lu", addr, spid);
|
||||
else
|
||||
{
|
||||
char *msg = evil_last_error_get();
|
||||
WRN("server=%p (%s) could not GetNamedPipeServerProcessId(client): %s", o, addr, msg);
|
||||
free(msg);
|
||||
eina_strlcpy(sstr, addr, sizeof(sstr));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cpid)
|
||||
snprintf(cstr, sizeof(cstr), "%s:%lu", addr, cpid);
|
||||
else
|
||||
eina_strlcpy(cstr, addr, sizeof(cstr));
|
||||
|
||||
if (spid)
|
||||
snprintf(sstr, sizeof(sstr), "%s:%lu", addr, spid);
|
||||
else
|
||||
eina_strlcpy(sstr, addr, sizeof(sstr));
|
||||
|
||||
DBG("server=%p received incoming connection at %s<->%s", o, sstr, cstr);
|
||||
|
||||
|
|
|
@ -27,10 +27,8 @@
|
|||
|
||||
/* FIXME: uncomment when mingw-w64 will be updated in win-builds */
|
||||
|
||||
/* #if _WIN32_WINNT >= 0x0600 */
|
||||
/* # ifndef WM_CLIPBOARDUPDATE */
|
||||
# define WM_CLIPBOARDUPDATE 0x031D
|
||||
/* # endif */
|
||||
/* #ifndef WM_CLIPBOARDUPDATE */
|
||||
# define WM_CLIPBOARDUPDATE 0x031D
|
||||
/* #endif */
|
||||
|
||||
/* OLE IID for Drag'n Drop */
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
#include <fcntl.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
# include <winsock2.h>
|
||||
# include <ws2tcpip.h>
|
||||
# include <Evil.h>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -110,7 +110,6 @@ typedef unsigned long gid_t;
|
|||
#include "evil_macro.h"
|
||||
#include "evil_dlfcn.h"
|
||||
#include "evil_fcntl.h"
|
||||
#include "evil_inet.h"
|
||||
#include "evil_langinfo.h"
|
||||
#include "evil_locale.h"
|
||||
#include "evil_main.h"
|
||||
|
|
|
@ -1,645 +0,0 @@
|
|||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modifications: Vincent Torri, for the integration in Evil
|
||||
* - modification of the name of some functions
|
||||
* * modification of the management of the error
|
||||
*/
|
||||
|
||||
#if ! (_WIN32_WINNT >= 0x600 /* _WIN32_WINNT_VISTA */)
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <winsock2.h>
|
||||
#undef WIN32_LEAN_AND_MEAN
|
||||
|
||||
#include "evil_macro.h"
|
||||
#include "evil_inet.h"
|
||||
|
||||
#ifndef EMSGSIZE
|
||||
# define EMSGSIZE WSAEMSGSIZE
|
||||
#endif
|
||||
|
||||
#ifndef EAFNOSUPPORT
|
||||
# define EAFNOSUPPORT WSAEAFNOSUPPORT
|
||||
#endif
|
||||
|
||||
#define SPRINTF(x) ((size_t)sprintf x)
|
||||
|
||||
#define ERRNO ((int)GetLastError())
|
||||
#define SET_ERRNO(x) (SetLastError((DWORD)(x)))
|
||||
|
||||
#define ISDIGIT(x) (isdigit((int) ((unsigned char)x)))
|
||||
#define ISXDIGIT(x) (isxdigit((int) ((unsigned char)x)))
|
||||
#define ISUPPER(x) (isupper((int) ((unsigned char)x)))
|
||||
|
||||
#define NS_IN6ADDRSZ 16
|
||||
#define NS_INT16SZ 2
|
||||
#define NS_INADDRSZ sizeof(IN_ADDR)
|
||||
|
||||
|
||||
struct ares_in6_addr {
|
||||
union {
|
||||
unsigned char _S6_u8[16];
|
||||
} _S6_un;
|
||||
};
|
||||
|
||||
const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } };
|
||||
|
||||
|
||||
/*
|
||||
* static int
|
||||
* inet_net_pton_ipv4(src, dst, size)
|
||||
* convert IPv4 network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not an IPv4 network specification.
|
||||
* note:
|
||||
* network byte order assumed. this means 192.5.5.240/28 has
|
||||
* 0b11110000 in its fourth octet.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
static int
|
||||
inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size)
|
||||
{
|
||||
static const char xdigits[] = "0123456789abcdef";
|
||||
static const char digits[] = "0123456789";
|
||||
int n, ch, tmp = 0, dirty, bits;
|
||||
const unsigned char *odst = dst;
|
||||
|
||||
ch = *src++;
|
||||
if (ch == '0' && (src[0] == 'x' || src[0] == 'X')
|
||||
&& ISXDIGIT(src[1])) {
|
||||
/* Hexadecimal: Eat nybble string. */
|
||||
if (!size)
|
||||
goto emsgsize;
|
||||
dirty = 0;
|
||||
src++; /* skip x or X. */
|
||||
while ((ch = *src++) != '\0' && ISXDIGIT(ch)) {
|
||||
if (ISUPPER(ch))
|
||||
ch = tolower(ch);
|
||||
n = (int)(strchr(xdigits, ch) - xdigits);
|
||||
if (dirty == 0)
|
||||
tmp = n;
|
||||
else
|
||||
tmp = (tmp << 4) | n;
|
||||
if (++dirty == 2) {
|
||||
if (!size--)
|
||||
goto emsgsize;
|
||||
*dst++ = (unsigned char) tmp;
|
||||
dirty = 0;
|
||||
}
|
||||
}
|
||||
if (dirty) { /* Odd trailing nybble? */
|
||||
if (!size--)
|
||||
goto emsgsize;
|
||||
*dst++ = (unsigned char) (tmp << 4);
|
||||
}
|
||||
} else if (ISDIGIT(ch)) {
|
||||
/* Decimal: eat dotted digit string. */
|
||||
for (;;) {
|
||||
tmp = 0;
|
||||
do {
|
||||
n = (int)(strchr(digits, ch) - digits);
|
||||
tmp *= 10;
|
||||
tmp += n;
|
||||
if (tmp > 255)
|
||||
goto enoent;
|
||||
} while ((ch = *src++) != '\0' &&
|
||||
ISDIGIT(ch));
|
||||
if (!size--)
|
||||
goto emsgsize;
|
||||
*dst++ = (unsigned char) tmp;
|
||||
if (ch == '\0' || ch == '/')
|
||||
break;
|
||||
if (ch != '.')
|
||||
goto enoent;
|
||||
ch = *src++;
|
||||
if (!ISDIGIT(ch))
|
||||
goto enoent;
|
||||
}
|
||||
} else
|
||||
goto enoent;
|
||||
|
||||
bits = -1;
|
||||
if (ch == '/' &&
|
||||
ISDIGIT(src[0]) && dst > odst) {
|
||||
/* CIDR width specifier. Nothing can follow it. */
|
||||
ch = *src++; /* Skip over the /. */
|
||||
bits = 0;
|
||||
do {
|
||||
n = (int)(strchr(digits, ch) - digits);
|
||||
bits *= 10;
|
||||
bits += n;
|
||||
} while ((ch = *src++) != '\0' && ISDIGIT(ch));
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
if (bits > 32)
|
||||
goto emsgsize;
|
||||
}
|
||||
|
||||
/* Firey death and destruction unless we prefetched EOS. */
|
||||
if (ch != '\0')
|
||||
goto enoent;
|
||||
|
||||
/* If nothing was written to the destination, we found no address. */
|
||||
if (dst == odst)
|
||||
goto enoent;
|
||||
/* If no CIDR spec was given, infer width from net class. */
|
||||
if (bits == -1) {
|
||||
if (*odst >= 240) /* Class E */
|
||||
bits = 32;
|
||||
else if (*odst >= 224) /* Class D */
|
||||
bits = 8;
|
||||
else if (*odst >= 192) /* Class C */
|
||||
bits = 24;
|
||||
else if (*odst >= 128) /* Class B */
|
||||
bits = 16;
|
||||
else /* Class A */
|
||||
bits = 8;
|
||||
/* If imputed mask is narrower than specified octets, widen. */
|
||||
if (bits < ((dst - odst) * 8))
|
||||
bits = (int)(dst - odst) * 8;
|
||||
/*
|
||||
* If there are no additional bits specified for a class D
|
||||
* address adjust bits to 4.
|
||||
*/
|
||||
if (bits == 8 && *odst == 224)
|
||||
bits = 4;
|
||||
}
|
||||
/* Extend network to cover the actual mask. */
|
||||
while (bits > ((dst - odst) * 8)) {
|
||||
if (!size--)
|
||||
goto emsgsize;
|
||||
*dst++ = '\0';
|
||||
}
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static int
|
||||
getbits(const char *src, int *bitsp)
|
||||
{
|
||||
static const char digits[] = "0123456789";
|
||||
int n;
|
||||
int val;
|
||||
char ch;
|
||||
|
||||
val = 0;
|
||||
n = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
pch = strchr(digits, ch);
|
||||
if (pch != NULL) {
|
||||
if (n++ != 0 && val == 0) /* no leading zeros */
|
||||
return (0);
|
||||
val *= 10;
|
||||
val += (pch - digits);
|
||||
if (val > 128) /* range */
|
||||
return (0);
|
||||
continue;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
if (n == 0)
|
||||
return (0);
|
||||
*bitsp = val;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
getv4(const char *src, unsigned char *dst, int *bitsp)
|
||||
{
|
||||
static const char digits[] = "0123456789";
|
||||
unsigned char *odst = dst;
|
||||
int n;
|
||||
unsigned int val;
|
||||
char ch;
|
||||
|
||||
val = 0;
|
||||
n = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
pch = strchr(digits, ch);
|
||||
if (pch != NULL) {
|
||||
if (n++ != 0 && val == 0) /* no leading zeros */
|
||||
return (0);
|
||||
val *= 10;
|
||||
val += (pch - digits);
|
||||
if (val > 255) /* range */
|
||||
return (0);
|
||||
continue;
|
||||
}
|
||||
if (ch == '.' || ch == '/') {
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = (unsigned char)val;
|
||||
if (ch == '/')
|
||||
return (getbits(src, bitsp));
|
||||
val = 0;
|
||||
n = 0;
|
||||
continue;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
if (n == 0)
|
||||
return (0);
|
||||
if (dst - odst > 3) /* too many octets? */
|
||||
return (0);
|
||||
*dst++ = (unsigned char)val;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static int
|
||||
inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size)
|
||||
{
|
||||
static const char xdigits_l[] = "0123456789abcdef",
|
||||
xdigits_u[] = "0123456789ABCDEF";
|
||||
unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp;
|
||||
const char *xdigits, *curtok;
|
||||
int ch, saw_xdigit;
|
||||
unsigned int val;
|
||||
int digits;
|
||||
int bits;
|
||||
size_t bytes;
|
||||
int words;
|
||||
int ipv4;
|
||||
|
||||
memset((tp = tmp), '\0', NS_IN6ADDRSZ);
|
||||
endp = tp + NS_IN6ADDRSZ;
|
||||
colonp = NULL;
|
||||
/* Leading :: requires some special handling. */
|
||||
if (*src == ':')
|
||||
if (*++src != ':')
|
||||
goto enoent;
|
||||
curtok = src;
|
||||
saw_xdigit = 0;
|
||||
val = 0;
|
||||
digits = 0;
|
||||
bits = -1;
|
||||
ipv4 = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
const char *pch;
|
||||
|
||||
if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
|
||||
pch = strchr((xdigits = xdigits_u), ch);
|
||||
if (pch != NULL) {
|
||||
val <<= 4;
|
||||
val |= (pch - xdigits);
|
||||
if (++digits > 4)
|
||||
goto enoent;
|
||||
saw_xdigit = 1;
|
||||
continue;
|
||||
}
|
||||
if (ch == ':') {
|
||||
curtok = src;
|
||||
if (!saw_xdigit) {
|
||||
if (colonp)
|
||||
goto enoent;
|
||||
colonp = tp;
|
||||
continue;
|
||||
} else if (*src == '\0')
|
||||
goto enoent;
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
return (0);
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
saw_xdigit = 0;
|
||||
digits = 0;
|
||||
val = 0;
|
||||
continue;
|
||||
}
|
||||
if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) &&
|
||||
getv4(curtok, tp, &bits) > 0) {
|
||||
tp += NS_INADDRSZ;
|
||||
saw_xdigit = 0;
|
||||
ipv4 = 1;
|
||||
break; /* '\0' was seen by inet_pton4(). */
|
||||
}
|
||||
if (ch == '/' && getbits(src, &bits) > 0)
|
||||
break;
|
||||
goto enoent;
|
||||
}
|
||||
if (saw_xdigit) {
|
||||
if (tp + NS_INT16SZ > endp)
|
||||
goto enoent;
|
||||
*tp++ = (unsigned char)((val >> 8) & 0xff);
|
||||
*tp++ = (unsigned char)(val & 0xff);
|
||||
}
|
||||
if (bits == -1)
|
||||
bits = 128;
|
||||
|
||||
words = (bits + 15) / 16;
|
||||
if (words < 2)
|
||||
words = 2;
|
||||
if (ipv4)
|
||||
words = 8;
|
||||
endp = tmp + 2 * words;
|
||||
|
||||
if (colonp != NULL) {
|
||||
/*
|
||||
* Since some memmove()'s erroneously fail to handle
|
||||
* overlapping regions, we'll do the shift by hand.
|
||||
*/
|
||||
const ssize_t n = tp - colonp;
|
||||
ssize_t i;
|
||||
|
||||
if (tp == endp)
|
||||
goto enoent;
|
||||
for (i = 1; i <= n; i++) {
|
||||
*(endp - i) = *(colonp + n - i);
|
||||
*(colonp + n - i) = 0;
|
||||
}
|
||||
tp = endp;
|
||||
}
|
||||
if (tp != endp)
|
||||
goto enoent;
|
||||
|
||||
bytes = (bits + 7) / 8;
|
||||
if (bytes > size)
|
||||
goto emsgsize;
|
||||
memcpy(dst, tmp, bytes);
|
||||
return (bits);
|
||||
|
||||
enoent:
|
||||
SET_ERRNO(ENOENT);
|
||||
return (-1);
|
||||
|
||||
emsgsize:
|
||||
SET_ERRNO(EMSGSIZE);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* int
|
||||
* inet_net_pton(af, src, dst, size)
|
||||
* convert network number from presentation to network format.
|
||||
* accepts hex octets, hex strings, decimal octets, and /CIDR.
|
||||
* "size" is in bytes and describes "dst".
|
||||
* return:
|
||||
* number of bits, either imputed classfully or specified with /CIDR,
|
||||
* or -1 if some failure occurred (check errno). ENOENT means it was
|
||||
* not a valid network specification.
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning (-1), not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie (ISC), June 1996
|
||||
*/
|
||||
static int
|
||||
ares_inet_net_pton(int af, const char *src, void *dst, size_t size)
|
||||
{
|
||||
switch (af) {
|
||||
case AF_INET:
|
||||
return (inet_net_pton_ipv4(src, dst, size));
|
||||
case AF_INET6:
|
||||
return (inet_net_pton_ipv6(src, dst, size));
|
||||
default:
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
evil_inet_pton(int af, const char *src, void *dst)
|
||||
{
|
||||
int result;
|
||||
size_t size;
|
||||
|
||||
if (af == AF_INET)
|
||||
size = sizeof(struct in_addr);
|
||||
else if (af == AF_INET6)
|
||||
size = sizeof(struct ares_in6_addr);
|
||||
else
|
||||
{
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return -1;
|
||||
}
|
||||
result = ares_inet_net_pton(af, src, dst, size);
|
||||
if ((result == -1) && (ERRNO == ENOENT))
|
||||
return 0;
|
||||
return (result > -1 ? 1 : -1);
|
||||
}
|
||||
|
||||
/* const char *
|
||||
* inet_ntop4(src, dst, size)
|
||||
* format an IPv4 address, more or less like inet_ntoa()
|
||||
* return:
|
||||
* `dst' (as a const)
|
||||
* notes:
|
||||
* (1) uses no statics
|
||||
* (2) takes a unsigned char* not an in_addr as input
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
inet_ntop4(const unsigned char *src, char *dst, size_t size)
|
||||
{
|
||||
static const char fmt[] = "%u.%u.%u.%u";
|
||||
char tmp[sizeof "255.255.255.255"];
|
||||
|
||||
if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size)
|
||||
{
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
/* const char *
|
||||
* inet_ntop6(src, dst, size)
|
||||
* convert IPv6 binary address into presentation (printable) format
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
inet_ntop6(const unsigned char *src, char *dst, size_t size)
|
||||
{
|
||||
/*
|
||||
* Note that int32_t and int16_t need only be "at least" large enough
|
||||
* to contain a value of the specified size. On some systems, like
|
||||
* Crays, there is no such thing as an integer variable with 16 bits.
|
||||
* Keep this in mind if you think this function should have been coded
|
||||
* to use pointer overlays. All the world's not a VAX.
|
||||
*/
|
||||
char tmp[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
|
||||
char *tp;
|
||||
struct {
|
||||
long base;
|
||||
long len;
|
||||
} best, cur;
|
||||
unsigned long words[NS_IN6ADDRSZ / NS_INT16SZ];
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Preprocess:
|
||||
* Copy the input (bytewise) array into a wordwise array.
|
||||
* Find the longest run of 0x00's in src[] for :: shorthanding.
|
||||
*/
|
||||
memset(words, '\0', sizeof(words));
|
||||
for (i = 0; i < NS_IN6ADDRSZ; i++)
|
||||
words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));
|
||||
|
||||
best.base = -1;
|
||||
cur.base = -1;
|
||||
best.len = 0;
|
||||
cur.len = 0;
|
||||
|
||||
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
|
||||
{
|
||||
if (words[i] == 0)
|
||||
{
|
||||
if (cur.base == -1)
|
||||
cur.base = i, cur.len = 1;
|
||||
else
|
||||
cur.len++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cur.base != -1)
|
||||
{
|
||||
if (best.base == -1 || cur.len > best.len)
|
||||
best = cur;
|
||||
cur.base = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cur.base != -1)
|
||||
{
|
||||
if (best.base == -1 || cur.len > best.len)
|
||||
best = cur;
|
||||
}
|
||||
if (best.base != -1 && best.len < 2)
|
||||
best.base = -1;
|
||||
|
||||
/*
|
||||
* Format the result.
|
||||
*/
|
||||
tp = tmp;
|
||||
for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
|
||||
{
|
||||
/* Are we inside the best run of 0x00's? */
|
||||
if (best.base != -1 && i >= best.base &&
|
||||
i < (best.base + best.len))
|
||||
{
|
||||
if (i == best.base)
|
||||
*tp++ = ':';
|
||||
continue;
|
||||
}
|
||||
/* Are we following an initial run of 0x00s or any real hex? */
|
||||
if (i != 0)
|
||||
*tp++ = ':';
|
||||
/* Is this address an encapsulated IPv4? */
|
||||
if (i == 6 && best.base == 0 &&
|
||||
(best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
|
||||
{
|
||||
if (!inet_ntop4(src+12, tp, sizeof(tmp) - (tp - tmp)))
|
||||
return (NULL);
|
||||
tp += strlen(tp);
|
||||
break;
|
||||
}
|
||||
tp += SPRINTF((tp, "%lx", words[i]));
|
||||
}
|
||||
|
||||
/* Was it a trailing run of 0x00's? */
|
||||
if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ))
|
||||
*tp++ = ':';
|
||||
*tp++ = '\0';
|
||||
|
||||
/*
|
||||
* Check for overflow, copy, and we're done.
|
||||
*/
|
||||
if ((size_t)(tp - tmp) > size)
|
||||
{
|
||||
SET_ERRNO(ENOSPC);
|
||||
return (NULL);
|
||||
}
|
||||
strcpy(dst, tmp);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
/* char *
|
||||
* inet_ntop(af, src, dst, size)
|
||||
* convert a network format address to presentation format.
|
||||
* return:
|
||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||
* note:
|
||||
* On Windows we store the error in the thread errno, not
|
||||
* in the winsock error code. This is to avoid loosing the
|
||||
* actual last winsock error. So use macro ERRNO to fetch the
|
||||
* errno this funtion sets when returning NULL, not SOCKERRNO.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
static const char *
|
||||
ares_inet_ntop(int af, const void *src, char *dst, size_t size)
|
||||
{
|
||||
switch (af)
|
||||
{
|
||||
case AF_INET:
|
||||
return (inet_ntop4(src, dst, size));
|
||||
case AF_INET6:
|
||||
return (inet_ntop6(src, dst, size));
|
||||
default:
|
||||
SET_ERRNO(EAFNOSUPPORT);
|
||||
return (NULL);
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
const char *evil_inet_ntop(int af, const char *src, void *dst, size_t size)
|
||||
{
|
||||
const char *result;
|
||||
result = ares_inet_ntop(af, src, dst, size);
|
||||
if ((result == NULL) && (ERRNO == ENOSPC))
|
||||
return NULL;
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,141 +0,0 @@
|
|||
|
||||
/* Copyright (C) 2005 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef __EVIL_INET_H__
|
||||
#define __EVIL_INET_H__
|
||||
|
||||
|
||||
#if ! (_WIN32_WINNT >= 0x600 /* _WIN32_WINNT_VISTA */)
|
||||
|
||||
|
||||
/**
|
||||
* @file evil_inet.h
|
||||
* @brief The file that provides functions ported from Unix in arpa/inet.h.
|
||||
* @defgroup Evil_Inet_Group Inet.h functions
|
||||
* @ingroup Evil
|
||||
*
|
||||
* This header provides functions ported from Unix in arpa/inet.h.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Convert IPv4 and IPv6 addresses from text to binary form.
|
||||
*
|
||||
* @param af The address family.
|
||||
* @param src The address to convert.
|
||||
* @param dst The converted address structure.
|
||||
* @return 1 on success, 0 or -1 otherwise.
|
||||
*
|
||||
* This function converts IPv4 and IPv6 addresses from @p src to the
|
||||
* binary form @p dst. The following address families to pass to @p af
|
||||
* are currently supported:
|
||||
*
|
||||
* <ul>
|
||||
* <li>i AF_INET: @p src points to a character string containing an IPv4
|
||||
* network address in dotted-decimal format, "ddd.ddd.ddd.ddd", where
|
||||
* ddd is a decimal number of up to three digits in the range 0 to
|
||||
* 255. The address is converted to a struct in_addr and copied to
|
||||
* dst, which must be sizeof(struct in_addr) (4) bytes (32 bits) long.
|
||||
* <li> AF_INET6: @p src points to a character string containing an
|
||||
* IPv6 network address. The address is converted to a struct in6_addr
|
||||
* and copied to dst, which must be sizeof(struct in6_addr) (16) bytes
|
||||
* (128 bits) long. The allowed formats for IPv6 addresses follow
|
||||
* these rules:
|
||||
* <ol>
|
||||
* <li>The preferred format is x:x:x:x:x:x:x:x. This form consists of
|
||||
* eight hexadecimal numbers, each of which expresses a 16-bit value
|
||||
* (i.e., each x can be up to 4 hex digits).
|
||||
* <li>A series of contiguous zero values in the preferred format can
|
||||
* be abbreviated to ::. Only one instance of :: can occur in an
|
||||
* address. For example, the loopback address 0:0:0:0:0:0:0:1 can be
|
||||
* abbreviated as ::1. The wildcard address, consisting of all zeros,
|
||||
* can be written as ::.
|
||||
* <li>An alternate format is useful for expressing IPv4-mapped IPv6
|
||||
* addresses. This form is written as x:x:x:x:x:x:d.d.d.d, where the
|
||||
* six leading xs are hexadecimal values that define the six
|
||||
* most-significant 16-bit pieces of the address (i.e., 96 bits), and
|
||||
* the ds express a value in dotted-decimal notation that defines the
|
||||
* least significant 32 bits of the address. An example of such an
|
||||
* address is :: FFFF:204.152.189.116.
|
||||
* </ul>
|
||||
* </ul>
|
||||
* On success this function returns 1 (network address was successfully
|
||||
* converted). 0 is returned if @p src does not contain a character
|
||||
* string representing a valid network address in the specified
|
||||
* address family. If af does not contain a valid address family, -1
|
||||
* is returned and errno is set to EAFNOSUPPORT.
|
||||
*
|
||||
* @see evil_inet_ntop()
|
||||
* @see inet_ntop()
|
||||
*
|
||||
* Conformity: POSIX.1-2001.
|
||||
*
|
||||
* Supported OS: Windows XP, CE.
|
||||
*
|
||||
*/
|
||||
EAPI int evil_inet_pton(int af, const char *src, void *dst);
|
||||
|
||||
/**
|
||||
* @brief Convert IPv4 and IPv6 addresses from binary to text form.
|
||||
*
|
||||
* @param af The address family.
|
||||
* @param src The address structure to convert.
|
||||
* @param dst A buffer containing the converted string.
|
||||
* @param size The size of the buffer.
|
||||
* @return 1 on success, 0 otherwise.
|
||||
*
|
||||
* This function converts the network address structure @p src in the
|
||||
* @p af address family into a character string. The resulting string
|
||||
* is copied to the buffer pointed to by @p dst, which must be a
|
||||
* non-NULL pointer. The caller specifies the number of bytes
|
||||
* available in this buffer in the argument @p size. The following
|
||||
* address families to pass to @p af are currently supported:
|
||||
*
|
||||
* @li AF_INET: @p src points to a struct in_addr (in network byte
|
||||
* order) which is converted to an IPv4 network address in the
|
||||
* dotted-decimal format, "ddd.ddd.ddd.ddd". The buffer @p dst must be
|
||||
* at least INET_ADDRSTRLEN bytes long.
|
||||
* @li AF_INET6: @p src points to a struct in6_addr (in network byte
|
||||
* order) which is converted to a representation of this address in
|
||||
* the most appropriate IPv6 network address format for this
|
||||
* address. The buffer @p dst must be at least INET6_ADDRSTRLEN bytes
|
||||
* long.
|
||||
*
|
||||
* On success, this function returns a non-NULL pointer to @p dst. NULL is
|
||||
* returned if there was an error, with errno set to indicate the
|
||||
* error.
|
||||
*
|
||||
* @see evil_inet_pton()
|
||||
* @see inet_pton()
|
||||
*
|
||||
* Conformity: POSIX.1-2001.
|
||||
*
|
||||
* Supported OS: Windows XP, CE.
|
||||
*
|
||||
*/
|
||||
EAPI const char *evil_inet_ntop(int af, const char *src, void *dst, size_t size);
|
||||
|
||||
|
||||
#endif /* _WIN32_WINNT >= _WIN32_WINNT_VISTA */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
#endif /* __EVIL_INET_H__ */
|
|
@ -1,6 +1,10 @@
|
|||
#ifndef __EVIL_MACRO_H__
|
||||
#define __EVIL_MACRO_H__
|
||||
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
# error Windows XP not supported anymore
|
||||
#endif
|
||||
|
||||
#ifdef EAPI
|
||||
# undef EAPI
|
||||
#endif
|
||||
|
|
|
@ -2,29 +2,6 @@
|
|||
#define __EVIL_MACRO_WRAPPER_H__
|
||||
|
||||
|
||||
/*
|
||||
* evil_inet.h
|
||||
*/
|
||||
|
||||
#if ! (_WIN32_WINNT >= 0x600 /* _WIN32_WINNT_VISTA */)
|
||||
|
||||
/**
|
||||
* @def inet_pton(x,y,z)
|
||||
*
|
||||
* Wrapper around evil_inet_pton().
|
||||
*/
|
||||
#define inet_pton(x,y,z) evil_inet_pton(x,y,z)
|
||||
|
||||
/**
|
||||
* @def inet_ntop(x,y,z,s)
|
||||
*
|
||||
* Wrapper around evil_inet_ntop().
|
||||
*/
|
||||
#define inet_ntop(x,y,z,s) evil_inet_ntop(x,y,z,s)
|
||||
|
||||
|
||||
#endif /* _WIN32_WINNT >= _WIN32_WINNT_VISTA */
|
||||
|
||||
/*
|
||||
* evil_locale.h
|
||||
*/
|
||||
|
|
|
@ -35,6 +35,17 @@ evil_init(void)
|
|||
if (++_evil_init_count != 1)
|
||||
return _evil_init_count;
|
||||
|
||||
{
|
||||
DWORD v;
|
||||
|
||||
v = GetVersion();
|
||||
if (!v || ((DWORD)(LOBYTE(LOWORD(v))) < 6))
|
||||
{
|
||||
fprintf(stderr, "Windows XP not supported anymore, exiting.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (!QueryPerformanceFrequency(&freq))
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue