#include <stdio.h>
#include "kernel.h"
#include "Desk.Core.h"
#include "Desk.Resource.h"
#include "Desk.Event.h"
#include "Desk.EventMsg.h"
#include "Desk.Msgs.h"
#include "Desk.WimpSWIs.h"

#include "ssh.h"
#include "def.h"
#include "defstruc.h"
#include "sockets.h"
#include "event.h"
#include "sshdef.h"
#include "sshstrc.h"
#include "sshif.h"

#include "windows.h"
#include "winsock.h"
#include "errno.h"
#include "syslogif.h"

int WSAGetLastError(void)
{
	return errno;
}

int WSAAsyncSelect(SOCKET socket, HWND hWnd, unsigned int wMsg, long lEvent)
{
  int true=-1;
  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_HIGH,"Enabling handler for SSH socket %d\n",socket);
  if (event_register_handler(socket,sshinterface_handler))
    return SOCKET_ERROR;

  if (socket_ioctl(socket,FIOASYNC,&true) == EOF)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_CONNECTION,"WSAAsyncSelect: Set as async failed - error %X,%s\n",_inet_error.errnum,_inet_error.errmess);
    return SOCKET_ERROR;
  }

  if (socket_ioctl(socket,FIONBIO ,&true) == EOF)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_CONNECTION,"WSAAsyncSelect: Set as non-blocking failed - error %X,%s\n",_inet_error.errnum,_inet_error.errmess);
    return SOCKET_ERROR;
  }

  if (socket_setsockopt(socket,SOL_SOCKET,SO_KEEPALIVE,&true,4) == EOF)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_CONNECTION,"WSAAsyncSelect: Enable keepalive failed - error %X,%s\n",_inet_error.errnum,_inet_error.errmess);
    return SOCKET_ERROR;
  }

  return 0;
}

struct hostent *winsock_multitask_gethostbyname(const char *name)
{
  _kernel_swi_regs r;
  _kernel_oserror *err;

  r.r[0] = EINPROGRESS; /* allow at least one Wimp_Poll to print Resolving...*/
  do
  {
    if (r.r[0] == EINPROGRESS)
      event_poll_single(FALSE);
    r.r[0] = (int) name;
    err=_kernel_swi(0x66001 /*Resolver_GetHost*/, &r,&r);
    xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"winsock_multitask_gethostbyname: Resolver_GetHost returned error %x (%d,%s), r0 = %d",err,err->errnum,err->errmess,r.r[0]);
  }
  while ((!err) && (r.r[0] == EINPROGRESS));
  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"winsock_multitask_gethostbyname: done - err %x (%d,%s),r0=%d,r1=%x",err,err->errnum,err->errmess,r.r[0],r.r[1]);

  if (r.r[1]==(int)NULL)
    errno = r.r[0];
  return (struct hostent *) r.r[1];
}
