Follow our own style guide.
[AROS.git] / arch / all-mingw32 / bsdsocket / host_socket.c
blob0fbcd9302972fe07aa91f667aff15316059b19d6
1 #include <aros/irq.h>
3 #include <stdio.h>
4 #include <windows.h>
5 #include <winsock2.h>
7 #include "host_socket.h"
9 #define D(x) x
11 static struct SocketController ctl;
13 static DWORD WINAPI ResolverThread(struct SocketController *ctl)
15 D(printf("[Resolver] Thread started\n"));
17 for (;;)
19 WaitForSingleObject(ctl->ResolverEvent, INFINITE);
21 switch(ctl->Command)
23 case SOCK_CMD_SHUTDOWN:
24 D(printf("[Resolver] Shutdown requested\n"));
26 CloseHandle(ctl->ResolverEvent);
27 return 0;
30 ctl->Command = 0;
31 KrnCauseIRQ(ctl->ResolverIRQ);
35 struct SocketController * __declspec(dllexport) __aros sock_init(void)
37 struct WSAData wsdata;
38 HANDLE thread;
39 int irq;
40 int state = WSAStartup(0x0002, &wsdata);
42 D(printf("[sock_init] WSAStartup reply: %u\n", state));
43 D(printf("[sock_init] Using WinSock v%u.%u (%s)\n", wsdata.wVersion & 0x00FF, wsdata.wVersion >> 8, wsdata.szDescription));
44 D(printf("[sock_init] Status: %s\n", wsdata.szSystemStatus));
45 if (state)
46 return NULL;
48 irq = KrnAllocIRQ();
49 if (irq != -1)
51 ctl.SocketIRQ = irq;
53 irq = KrnAllocIRQ();
54 if (irq != -1)
56 ctl.ResolverIRQ = irq;
58 ctl.ResolverEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
59 if (ctl.ResolverEvent)
61 DWORD id;
63 thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ResolverThread, &ctl, 0, &id);
64 if (thread)
66 CloseHandle(thread);
68 ctl.SocketEvent = KrnGetIRQObject(ctl.SocketIRQ);
69 return &ctl;
71 CloseHandle(ctl.ResolverEvent);
74 KrnFreeIRQ(ctl.SocketIRQ);
77 return NULL;
80 int __declspec(dllexport) __aros sock_shutdown(struct SocketController *ctl)
82 int res = WSACleanup();
84 if (res)
85 return res;
87 ctl->Command = SOCK_CMD_SHUTDOWN;
88 SetEvent(ctl->ResolverEvent);
90 KrnFreeIRQ(ctl->ResolverIRQ);
91 KrnFreeIRQ(ctl->SocketIRQ);
93 return 0;