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:
Vincent Torri 2017-10-01 17:07:02 +01:00 committed by Andy Williams
parent 3462390b5c
commit 10ba064b65
14 changed files with 54 additions and 863 deletions

View File

@ -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}"

View File

@ -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

View File

@ -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

View File

@ -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 \

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -55,7 +55,7 @@
#include <fcntl.h>
#ifdef _WIN32
# include <winsock2.h>
# include <ws2tcpip.h>
# include <Evil.h>
#endif

View File

@ -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"

View File

@ -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

View File

@ -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__ */

View File

@ -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

View File

@ -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
*/

View File

@ -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;