@@ -1,7 +1,7 @@
1// C-Side of the Idris network library
1// C-Side of the Idris network library
2// (C) Simon Fowler, 2014
2// (C) Simon Fowler, 2014
3// MIT Licensed. Have fun!
3// MIT Licensed. Have fun!
4−#include "idris_net.h"
4+#include "../idris_net.h"
6#include <errno.h>
6#include <errno.h>
7#include <stdbool.h>
7#include <stdbool.h>
@@ -11,6 +11,12 @@
11#include <Winsock2.h>
11#include <Winsock2.h>
12#include <Ws2tcpip.h>
12#include <Ws2tcpip.h>
15+// inet_ntop isn't defined in the old mingw delivered with GHC,
16+// so put the prototype here, cribbed from a newer version of it
17+WINSOCK_API_LINKAGE LPCSTR WSAAPI InetNtopA(INT Family, PVOID pAddr,
18+ LPSTR pStringBuf, size_t StringBufSize);
14static int socket_inited = 0;
20static int socket_inited = 0;
15static WSADATA wsa_data;
21static WSADATA wsa_data;
@@ -22,12 +28,17 @@ void idrnet_free(void* ptr) {
22 free(ptr);
28 free(ptr);
31+static void clean_sockets(void) {
25−static int check_init()
35+static int check_init(void)
27 if (!socket_inited) {
37 if (!socket_inited) {
28 int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
38 int result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
29 if (result == NO_ERROR) {
39 if (result == NO_ERROR) {
30 socket_inited = 1;
40 socket_inited = 1;
41+ atexit(clean_sockets);
33 return socket_inited;
44 return socket_inited;
@@ -104,7 +115,7 @@ int idrnet_sockaddr_family(void* sockaddr) {
104char* idrnet_sockaddr_ipv4(void* sockaddr) {
115char* idrnet_sockaddr_ipv4(void* sockaddr) {
105 struct sockaddr_in* addr = (struct sockaddr_in*) sockaddr;
116 struct sockaddr_in* addr = (struct sockaddr_in*) sockaddr;
106 char* ip_addr = (char*) malloc(sizeof(char) * INET_ADDRSTRLEN);
117 char* ip_addr = (char*) malloc(sizeof(char) * INET_ADDRSTRLEN);
107− inet_ntop(AF_INET, &(addr->sin_addr), ip_addr, INET_ADDRSTRLEN);
118+ InetNtopA(AF_INET, &(addr->sin_addr), ip_addr, INET_ADDRSTRLEN);
108 return ip_addr;
119 return ip_addr;
@@ -139,7 +150,7 @@ int idrnet_send_buf(int sockfd, void* data, int len) {
140void* idrnet_recv(int sockfd, int len) {
151void* idrnet_recv(int sockfd, int len) {
141 if (!check_init()) {
152 if (!check_init()) {
142− return -1;
153+ return NULL;
144 idrnet_recv_result* res_struct =
155 idrnet_recv_result* res_struct =
145 (idrnet_recv_result*) malloc(sizeof(idrnet_recv_result));
156 (idrnet_recv_result*) malloc(sizeof(idrnet_recv_result));