#include "kernel.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "oslib/os.h"
#include "sockets.h"


#include "def.h"
#include "defstruc.h"
#include "connstrc.h"
#include "eventstrc.h"
#include "event.h"

#include "master.h"
#include "syslogif.h"

OSERROR *sock_send_string(SOCKET socket, unsigned char *string)
{
  int sizeToSend=0,sizeSent=0;
  unsigned char *sendPtr = NULL;

  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_send_string: sending string %s to socket %d\n",string,socket);

  sizeToSend = strlen((char *) string);
  sendPtr = string;

  do
  {
    sizeSent = send(socket,(char *) sendPtr,sizeToSend,0);
    sendPtr += sizeSent;
    sizeToSend -= sizeSent;
  }
  while(sizeToSend>0 && sizeSent>0);

  if (sizeSent<0)
  {
    memcpy(&errorBlock,&_inet_error,sizeof(OSERROR));
    return &errorBlock;
  }

  return NO_OSERROR;
}

OSERROR *sock_send_block(SOCKET socket, unsigned char *string,int sizeToSend)
{
  int sizeSent=0;
  unsigned char *sendPtr = NULL;

  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_send_block: sending %d bytes to socket %d\n",sizeToSend,socket);

  sendPtr = string;

  do
  {
    sizeSent = send(socket,(char *) sendPtr,sizeToSend,0);
    sendPtr += sizeSent;
    sizeToSend -= sizeSent;
  }
  while(sizeToSend>0 && sizeSent>0);

  if (sizeSent<0)
  {
    memcpy(&errorBlock,&_inet_error,sizeof(OSERROR));
    return &errorBlock;
  }

  return NO_OSERROR;
}

OSERROR *sock_get_string(SOCKET socket, unsigned char *buffer, int bufferLength, int *recSize)
{
  int gotSize=0;

  gotSize = recv(socket,(char *) buffer,bufferLength,0);
  if (gotSize>0)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_string: got %d bytes from socket %d\n",gotSize,socket);
    xsyslog_irq_logdata(SYSLOG_FILE,LOG_DEBUG_LOW,buffer,gotSize,0);
    *recSize = gotSize;
    return NO_OSERROR;
  }

  if (errno==EWOULDBLOCK)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_string: got no bytes from socket %d\n",socket);
    *recSize = 0;
    return NO_OSERROR;
  }

  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_string: error %X,%s from socket %d\n",_inet_error.errnum,_inet_error.errmess,socket);
  memcpy(&errorBlock,&_inet_error,sizeof(OSERROR));
  return &errorBlock;

}

OSERROR *sock_get_stringOOB(SOCKET socket, unsigned char *buffer, int bufferLength, int *recSize)
{
  int gotSize=0;

  gotSize = recv(socket,(char *) buffer,bufferLength,MSG_OOB);
  if (gotSize>0)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_stringOOB: got %d bytes from socket %d\n",gotSize,socket);
    xsyslog_irq_logdata(SYSLOG_FILE,LOG_DEBUG_LOW,buffer,gotSize,0);
    *recSize = gotSize;
    return NO_OSERROR;
  }

  if (errno==EWOULDBLOCK)
  {
    xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_stringOOB: got no bytes from socket %d\n",socket);
    *recSize = 0;
    return NO_OSERROR;
  }

  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_get_stringOOB: error %X,%s from socket %d\n",_inet_error.errnum,_inet_error.errmess,socket);
  memcpy(&errorBlock,&_inet_error,sizeof(OSERROR));
  return &errorBlock;

}
OSERROR *sock_flush_incoming(SOCKET socket)
{
  int receivedLength = 0;
  unsigned char scratchBuffer[256];

  xsyslogf_irq(SYSLOG_FILE,LOG_DEBUG_LOW,"sock_flush_incoming on socket %d\n",socket);
  do
  {
    receivedLength = recv(socket, (char *) scratchBuffer, 256, 0 /* flags */);
  }
  while (receivedLength>0);

  if (receivedLength == EOF && errno!=EWOULDBLOCK)
  {
    memcpy(&errorBlock,&_inet_error,sizeof(OSERROR));
    return &errorBlock;
  }

  return NO_OSERROR;
}



