@@ -38,18 +38,29 @@ #import "socket_helpers.h" #ifdef OF_HAVE_THREADS # include "mutex.h" #endif #include "once.h" + +#ifdef OF_AMIGAOS +# include +#endif #ifdef OF_NINTENDO_3DS # include <3ds/types.h> # include <3ds/services/soc.h> #endif #ifdef OF_HAVE_THREADS static of_mutex_t mutex; +#endif +#ifdef OF_AMIGAOS +/* TODO: Support multiple threads */ +struct Library *SocketBase; +# ifdef OF_AMIGAOS4 +struct SocketIFace *ISocket = NULL; +# endif #endif static bool initSuccessful = false; static void init(void) @@ -57,10 +68,21 @@ #if defined(OF_WINDOWS) WSADATA wsa; if (WSAStartup(MAKEWORD(2, 0), &wsa)) return; +#elif defined(OF_AMIGAOS) + if ((SocketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) + return; + +# ifdef OF_AMIGAOS4 + if ((ISocket = (struct SocketIFace *) + GetInterface(SocketBase, "main", 1, NULL)) == NULL) { + CloseLibrary(SocketBase); + return; + } +# endif #elif defined(OF_WII) if (net_init() < 0) return; #elif defined(OF_NINTENDO_3DS) void *ctx; @@ -85,10 +107,23 @@ #endif initSuccessful = true; } +#ifdef OF_AMIGAOS +OF_DESTRUCTOR() +{ +# ifdef OF_AMIGAOS4 + if (ISocket != NULL) + DropInterface((struct Interface *)ISocket); +# endif + + if (SocketBase != NULL) + CloseLibrary(SocketBase); +} +#endif + bool of_socket_init() { static of_once_t onceControl = OF_ONCE_INIT; of_once(&onceControl, init); @@ -97,13 +132,11 @@ } int of_socket_errno() { -#ifndef OF_WINDOWS - return errno; -#else +#if defined(OF_WINDOWS) switch (WSAGetLastError()) { case WSAEACCES: return EACCES; case WSAEADDRINUSE: return EADDRINUSE; @@ -190,10 +223,14 @@ case WSAEWOULDBLOCK: return EWOULDBLOCK; } return 0; +#elif defined(OF_AMIGAOS) + return Errno(); +#else + return errno; #endif } #ifndef OF_WII int