Follow our own style guide.
[AROS.git] / arch / all-mingw32 / bsdsocket / bsdsocket_init.c
blob25341c26248989af3002e4cf60413e87724e6d0b
1 #include <aros/symbolsets.h>
2 #include <proto/alib.h>
3 #include <proto/hostlib.h>
5 #include "bsdsocket_intern.h"
7 static const char *ws_functions[] = {
8 "WSAGetLastError",
9 "inet_addr",
10 "inet_ntoa",
11 "getprotobyname",
12 "socket",
13 "closesocket",
14 "ioctlsocket",
15 "setsockopt",
16 "recvfrom",
17 "sendto",
18 "WSAEventSelect",
19 NULL
22 static const char *res_functions[] = {
23 "sock_init",
24 "sock_shutdown",
25 NULL
28 static int bsdsocket_Init(struct bsdsocketBase *SocketBase)
30 APTR HostLibBase = OpenResource("hostlib.resource");
32 if (!HostLibBase)
33 return FALSE;
34 SocketBase->HostLibBase = HostLibBase;
36 SocketBase->winsock = HostLib_Open("Ws2_32.dll", NULL);
37 if (!SocketBase->winsock)
38 return FALSE;
40 SocketBase->resolver = HostLib_Open("Libs\\Host\\bsdsocket.dll", NULL);
41 if (!SocketBase->resolver)
42 return FALSE;
44 SocketBase->WSIFace = (struct WinSockInterface *)HostLib_GetInterface(SocketBase->winsock, ws_functions, NULL);
45 if (!SocketBase->WSIFace)
47 D(bug("[socket] Failed to obtain winsock interface\n"));
48 return FALSE;
51 SocketBase->ResIFace = (struct HostSocketInterface *)HostLib_GetInterface(SocketBase->resolver, res_functions, NULL);
52 if (!SocketBase->ResIFace)
53 return FALSE;
55 NewList((struct List *)&SocketBase->socks);
57 Forbid();
58 SocketBase->ctl = SocketBase->ResIFace->sock_init();
59 Permit();
61 if (!SocketBase->ctl)
62 return FALSE;
64 return TRUE;
67 static int bsdsocket_Cleanup(struct bsdsocketBase *SocketBase)
69 APTR HostLibBase = SocketBase->HostLibBase;
71 D(bug("[socket] Cleanup, HostLibBase is 0x%p\n", HostLibBase));
72 if (!HostLibBase)
73 return TRUE;
75 if (SocketBase->ResIFace)
77 if (SocketBase->ctl)
79 int res;
81 Forbid();
82 res = SocketBase->ResIFace->sock_shutdown(SocketBase->ctl);
83 Permit();
85 if (res)
86 return FALSE;
90 if (SocketBase->WSIFace)
91 HostLib_DropInterface((void **)SocketBase->WSIFace);
93 if (SocketBase->winsock)
94 HostLib_Close(SocketBase->winsock, NULL);
96 return TRUE;
99 ADD2INITLIB(bsdsocket_Init, 0);
100 ADD2EXPUNGELIB(bsdsocket_Cleanup, 0);