#include <unistd.h>
#include <stdio.h>
#include "compat.h"
#include <windows.h>

unsigned int
sleep (unsigned int seconds)
{
  Sleep (seconds * 1000);
  return 0;
}

static struct
{
  int num;
  char *msg;
} win32_error[] =
{
  /* Errors that we might vaguely expect to see */
  {
  WSAEINTR, "Winsock: Interrupted system call"},
  {
  WSAEBADF, "Winsock: Bad file number"},
  {
  WSAEFAULT, "Winsock: Bad address"},
  {
  WSAEINVAL, "Winsock: Invalid argument"},
  {
  WSAEMFILE, "Winsock: Too many open files"},
  {
  WSAEWOULDBLOCK, "Winsock: Operation would block"},
  {
  WSAEINPROGRESS, "Winsock: Operation now in progress"},
  {
  WSAEALREADY, "Winsock: Operation already in progress"},
  {
  WSAENOTSOCK, "Winsock: Socket operation on nonsocket"},
  {
  WSAEADDRINUSE, "Winsock: Address already in use"},
  {
  WSAEADDRNOTAVAIL, "Winsock: Cannot assign requested address"},
  {
  WSAENETDOWN, "Winsock: Network is down"},
  {
  WSAENETUNREACH, "Winsock: Network is unreachable"},
  {
  WSAENETRESET, "Winsock: Network dropped connection on reset"},
  {
  WSAECONNABORTED, "Winsock: Software caused connection abort"},
  {
  WSAECONNRESET, "Winsock: Connection reset by peer"},
  {
  WSAETIMEDOUT, "Winsock: Connection timed out"},
  {
  WSAECONNREFUSED, "Winsock: Connection refused"},
  {
  WSAEHOSTDOWN, "Winsock: Host is down"},
  {
  WSAEHOSTUNREACH, "Winsock: No route to host"},
  {
  WSAVERNOTSUPPORTED, "Winsock: Unsupported Winsock version"},
  {
  ETIMEDOUT, "Connection timed out"},
  {
  ENOTCONN, "Not connected"},
  {
-1, NULL},};
char *
compat_strerror (int errnum)
{
  int i;
  static char buf[128];

  for (i = 0; win32_error[i].num != -1; i++)
    if (errnum == win32_error[i].num)
      return win32_error[i].msg;
  if (errnum >= 10000)
    {
      sprintf (buf, "Winsock: unknown error %d\n", errnum);
      return buf;
    }
  return strerror (errnum);
}

#ifdef __WIN32__

/*const char *compat_inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
{
        if (af == AF_INET)
        {
                struct sockaddr_in in;
                memset(&in, 0, sizeof(in));
                in.sin_family = AF_INET;
                memcpy(&in.sin_addr, src, sizeof(struct in_addr));
                getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in), dst, cnt, NULL, 0, NI_NUMERICHOST);
                return dst;
        }
        else if (af == AF_INET6)
        {
                struct sockaddr_in6 in;
                memset(&in, 0, sizeof(in));
                in.sin6_family = AF_INET6;
                memcpy(&in.sin6_addr, src, sizeof(struct in_addr6));
                getnameinfo((struct sockaddr *)&in, sizeof(struct sockaddr_in6), dst, cnt, NULL, 0, NI_NUMERICHOST);
                return dst;
        }
        return NULL;
}
*/
#endif