mirror of https://github.com/c-ares/c-ares.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.2 KiB
107 lines
2.2 KiB
#include "setup.h" |
|
|
|
/* $Id: */ |
|
|
|
/* only do the following on windows |
|
*/ |
|
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <ctype.h> |
|
#include <string.h> |
|
#include <errno.h> |
|
#include <malloc.h> |
|
|
|
#ifdef WATT32 |
|
#include <sys/socket.h> |
|
#else |
|
#include "nameser.h" |
|
#endif |
|
#include "ares.h" |
|
#include "ares_private.h" |
|
|
|
#ifndef __MINGW32__ |
|
int |
|
ares_strncasecmp(const char *a, const char *b, int n) |
|
{ |
|
int i; |
|
|
|
for (i = 0; i < n; i++) { |
|
int c1 = isupper(a[i]) ? tolower(a[i]) : a[i]; |
|
int c2 = isupper(b[i]) ? tolower(b[i]) : b[i]; |
|
if (c1 != c2) return c1-c2; |
|
} |
|
return 0; |
|
} |
|
|
|
int |
|
ares_strcasecmp(const char *a, const char *b) |
|
{ |
|
return strncasecmp(a, b, strlen(a)+1); |
|
} |
|
#endif |
|
|
|
/* |
|
* Number of micro-seconds between the beginning of the Windows epoch |
|
* (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970). |
|
*/ |
|
#if defined(_MSC_VER) || defined(__WATCOMC__) |
|
#define EPOCH_FILETIME 11644473600000000Ui64 |
|
#else |
|
#define EPOCH_FILETIME 11644473600000000ULL |
|
#endif |
|
|
|
int |
|
ares_gettimeofday(struct timeval *tv, struct timezone *tz) |
|
{ |
|
FILETIME ft; |
|
LARGE_INTEGER li; |
|
__int64 t; |
|
|
|
if (tv) |
|
{ |
|
GetSystemTimeAsFileTime(&ft); |
|
li.LowPart = ft.dwLowDateTime; |
|
li.HighPart = ft.dwHighDateTime; |
|
t = li.QuadPart / 10; /* In micro-second intervals */ |
|
t -= EPOCH_FILETIME; /* Offset to the Epoch time */ |
|
tv->tv_sec = (long)(t / 1000000); |
|
tv->tv_usec = (long)(t % 1000000); |
|
} |
|
(void) tz; |
|
return 0; |
|
} |
|
|
|
int |
|
ares_writev (ares_socket_t s, const struct iovec *vector, size_t count) |
|
{ |
|
char *buffer, *bp; |
|
size_t i, bytes = 0; |
|
|
|
/* Find the total number of bytes to write |
|
*/ |
|
for (i = 0; i < count; i++) |
|
bytes += vector[i].iov_len; |
|
|
|
if (bytes == 0) /* not an error */ |
|
return (0); |
|
|
|
/* Allocate a temporary buffer to hold the data |
|
*/ |
|
buffer = bp = (char*) alloca (bytes); |
|
if (!buffer) |
|
{ |
|
errno = ENOMEM; |
|
return (-1); |
|
} |
|
|
|
/* Copy the data into buffer. |
|
*/ |
|
for (i = 0; i < count; ++i) |
|
{ |
|
memcpy (bp, vector[i].iov_base, vector[i].iov_len); |
|
bp += vector[i].iov_len; |
|
} |
|
return send (s, (const void*)buffer, bytes, 0); |
|
} |
|
#endif /* WIN32 builds only */
|
|
|