packages feed

socket-0.3.0.1: cbits/hs_socket_win32.c

#include <hs_socket.h>

int hs_socket_init() {
  static int has_already_been_initialised = 0;

  if (!has_already_been_initialised) {
    WSADATA wsaData;

    int ini = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (ini != NO_ERROR) {
      WSACleanup();
      return -1;
    } else {
      has_already_been_initialised = 1;
    }
  }
  return 0;
};

int hs_socket(int domain, int type, int protocol) {
  if (hs_socket_init() != 0) {
    return -1;
  }

  return socket(domain, type, protocol);
};

int hs_bind(int sockfd, const struct sockaddr *name, int namelen) {
  return bind(sockfd, name, namelen);
};

int hs_connect(int sockfd, const struct sockaddr *name, int namelen) {
  int i = connect(sockfd, name, namelen);
  if (i != 0) {
    switch (WSAGetLastError()) {
      case WSAEWOULDBLOCK:
        return 0;
        break;
      // TODO: remap other error codes that don't behave the posix way.
      default:
        break;
    }
  }
  return i;
};

int hs_listen (int sockfd, int backlog) {
  return listen(sockfd, backlog);
};

int hs_accept(int sockfd, struct sockaddr *addr, int *addrlen) {
  return accept(sockfd, addr, addrlen);
}

int hs_close(int sockfd) {
  return closesocket(sockfd);
};

int hs_setnonblocking(int fd) {
  // If iMode = 0, blocking is enabled; 
  // If iMode != 0, non-blocking mode is enabled.
  u_long iMode = 1;
  //return ioctlsocket(fd, FIONBIO, &iMode);
  return 0;
};

int hs_send    (int sockfd, const void *buf, size_t len, int flags) {
  printf("send1");
  int x = send(sockfd, buf, len, flags);
  printf("send2\n");
  printf("%ld\n", x);
  return x;
};

int hs_recv    (int sockfd,       void *buf, size_t len, int flags) {
  return -1;
};

int hs_sendto  (int sockfd, const void *buf, size_t len, int flags,
                const struct sockaddr *dest_addr, int addrlen) {
  return -1;
};

int hs_recvfrom(int sockfd,       void *buf, size_t len, int flags,
                      struct sockaddr *src_addr, int *addrlen) {
  return -1;
};

int hs_get_last_socket_error(void) {
  return WSAGetLastError();
};

int hs_getsockopt(int sockfd, int level, int option_name,       void *option_value, int *option_len) {
  return getsockopt(sockfd, level, option_name, option_value, option_len);
};

int hs_setsockopt(int sockfd, int level, int option_name, const void *option_value, int  option_len) {
  return setsockopt(sockfd, level, option_name, option_value, option_len);
};

const char *hs_gai_strerror(int errcode) {
  return gai_strerror(errcode);
};

int  hs_getaddrinfo(const char *node, const char *service,
                    const struct addrinfo *hints,
                    struct addrinfo **res) {
  if (hs_socket_init() != 0) {
    return -1;
  }
  return getaddrinfo(node, service, hints, res);
};

int  hs_getnameinfo(const struct sockaddr *sa, int salen,
                    char *host, int hostlen,
                    char *serv, int servlen, int flags) {
  if (hs_socket_init() != 0) {
    return -1;
  }
  return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
};

void hs_freeaddrinfo(struct addrinfo *res) {
  freeaddrinfo(res);
  return;
};