Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -44,17 +44,16 @@ ;; m68k-*-amigaos*) AS_IF([test x"$OBJCFLAGS" = x""], [ OBJCFLAGS="-O0" ]) - OBJCFLAGS="$OBJCFLAGS -noixemul" + OBJCFLAGS="$OBJCFLAGS -noixemul -D__NO_NET_API" OBJFW_OBJCFLAGS="$OBJFW_OBJCFLAGS -noixemul" LDFLAGS="$LDFLAGS -noixemul" enable_shared="no" enable_threads="no" - enable_sockets="no" enable_files="yes" # Required for reading ENV: supports_amiga_lib="yes" ac_cv_snprintf_useful_ret="yes" AS_IF([test x"$enable_amiga_lib" != x"no"], [ @@ -1222,28 +1221,37 @@ AC_CHECK_FUNCS([strtod_l strtof_l asprintf_l]) AC_CHECK_HEADERS(sys/utsname.h) AC_CHECK_FUNCS(uname) -AC_CHECK_FUNC(pipe, [ - AC_DEFINE(OF_HAVE_PIPE, 1, [Whether we have pipe()]) -]) +case "$host_os" in + amigaos*) + ;; + *) + AC_CHECK_FUNC(pipe, [ + AC_DEFINE(OF_HAVE_PIPE, 1, [Whether we have pipe()]) + ]) + ;; +esac AC_ARG_ENABLE(sockets, AS_HELP_STRING([--disable-sockets], [disable socket support])) AS_IF([test x"$enable_sockets" != x"no"], [ AC_DEFINE(OF_HAVE_SOCKETS, 1, [Whether we have sockets]) AC_SUBST(USE_SRCS_SOCKETS, '${SRCS_SOCKETS}') - AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket") - case "$host_os" in + amigaos*) + ;; + haiku*) + LIBS="$LIBS -lnetwork" + ;; mingw*) LIBS="$LIBS -lws2_32 -liphlpapi" ;; - haiku*) - LIBS="$LIBS -lnetwork" + *) + AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket") ;; esac AC_CHECK_HEADER(sys/socket.h, [ AC_DEFINE(OF_HAVE_SYS_SOCKET_H, 1, @@ -1259,11 +1267,13 @@ ]) AC_CHECK_HEADERS([arpa/inet.h netdb.h]) AC_CHECK_MEMBER([struct sockaddr_in6.sin6_addr], [ AC_EGREP_CPP(egrep_cpp_yes, [ + #ifdef _WIN32 typedef int BOOL; + #endif #ifdef OF_HAVE_SYS_SOCKET_H # include #endif @@ -1284,11 +1294,13 @@ ], [ AC_DEFINE(OF_HAVE_IPV6, 1, [Whether we have IPv6]) ]) ], [ ], [ + #ifdef _WIN32 typedef int BOOL; + #endif #ifdef OF_HAVE_NETINET_IN_H # include #endif @@ -1331,11 +1343,11 @@ "OFPollKernelEventObserver.m") ]) ]) case "$host_os" in - mingw* | morphos*) + amigaos* | mingw* | morphos*) AC_DEFINE(HAVE_SELECT, 1, [Whether we have select() or similar]) AC_SUBST(OFSELECTKERNELEVENTOBSERVER_M, "OFSelectKernelEventObserver.m") ;; Index: src/OFDNSResolver.m ================================================================== --- src/OFDNSResolver.m +++ src/OFDNSResolver.m @@ -53,14 +53,14 @@ # define interface struct # include # undef interface #endif -#ifdef OF_AMIGAOS4 -# define __USE_INLINE__ -# define __NOLIBBASE__ -# define __NOGLOBALIFACE__ +#ifdef OF_AMIGAOS +# ifdef OF_AMIGAOS4 +# define __USE_INLINE__ +# endif # include # include #endif #ifdef OF_NINTENDO_3DS @@ -95,25 +95,10 @@ # define HOSTS_PATH @"AmiTCP:db/hosts" # define RESOLV_CONF_PATH @"AmiTCP:db/resolv.conf" #else # define HOSTS_PATH @"/etc/hosts" # define RESOLV_CONF_PATH @"/etc/resolv.conf" -#endif - -#ifdef OF_AMIGAOS4 -extern struct ExecIFace *IExec; -static struct Library *SocketBase = NULL; -static struct SocketIFace *ISocket = NULL; - -OF_DESTRUCTOR() -{ - if (ISocket != NULL) - DropInterface((struct Interface *)ISocket); - - if (SocketBase != NULL) - CloseLibrary(SocketBase); -} #endif /* * TODO: * @@ -1138,22 +1123,17 @@ @synthesize localDomain = _localDomain, searchDomains = _searchDomains; @synthesize timeout = _timeout, maxAttempts = _maxAttempts; @synthesize minNumberOfDotsInAbsoluteName = _minNumberOfDotsInAbsoluteName; @synthesize usesTCP = _usesTCP, configReloadInterval = _configReloadInterval; -#ifdef OF_AMIGAOS4 +#ifdef OF_AMIGAOS + (void)initialize { if (self != [OFDNSResolver class]) return; - if ((SocketBase = OpenLibrary("bsdsocket.library", 4)) == NULL) - @throw [OFInitializationFailedException - exceptionWithClass: self]; - - if ((ISocket = (struct SocketIFace *) - GetInterface(SocketBase, "main", 1, NULL)) == NULL) + if (!of_socket_init()) @throw [OFInitializationFailedException exceptionWithClass: self]; } #endif Index: src/OFKernelEventObserver.m ================================================================== --- src/OFKernelEventObserver.m +++ src/OFKernelEventObserver.m @@ -122,12 +122,11 @@ @throw [OFInitializationFailedException exceptionWithClass: self.class]; _cancelAddr.sin_family = AF_INET; _cancelAddr.sin_port = 0; - _cancelAddr.sin_addr.s_addr = - inet_addr((const void *)"127.0.0.1"); + _cancelAddr.sin_addr.s_addr = inet_addr((void *)"127.0.0.1"); # ifdef OF_WII _cancelAddr.sin_len = 8; # endif # if !defined(OF_WII) && !defined(OF_NINTENDO_3DS) @@ -421,10 +420,10 @@ OF_ENSURE(write(_cancelFD[1], "", 1) > 0); #elif defined(OF_WII) OF_ENSURE(sendto(_cancelFD[1], "", 1, 0, (struct sockaddr *)&_cancelAddr, 8) > 0); #else - OF_ENSURE(sendto(_cancelFD[1], (const void *)"", 1, 0, + OF_ENSURE(sendto(_cancelFD[1], (void *)"", 1, 0, (struct sockaddr *)&_cancelAddr, sizeof(_cancelAddr)) > 0); #endif } @end Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -1805,11 +1805,11 @@ return _blocking; } - (void)setBlocking: (bool)enable { -#if defined(HAVE_FCNTL) && !defined(OF_MORPHOS) +#if defined(HAVE_FCNTL) && !defined(OF_AMIGAOS) bool readImplemented = false, writeImplemented = false; @try { int readFlags; Index: src/OFStreamSocket.m ================================================================== --- src/OFStreamSocket.m +++ src/OFStreamSocket.m @@ -99,11 +99,11 @@ ssize_t bytesWritten; if (length > SSIZE_MAX) @throw [OFOutOfRangeException exception]; - if ((bytesWritten = send(_socket, buffer, length, 0)) < 0) + if ((bytesWritten = send(_socket, (void *)buffer, length, 0)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 errNo: of_socket_errno()]; @@ -122,11 +122,11 @@ #endif return (size_t)bytesWritten; } -#if defined(OF_WINDOWS) || defined(OF_MORPHOS) +#if defined(OF_WINDOWS) || defined(OF_AMIGAOS) - (void)setBlocking: (bool)enable { # ifdef OF_WINDOWS u_long v = enable; # else Index: src/OFTCPSocket.m ================================================================== --- src/OFTCPSocket.m +++ src/OFTCPSocket.m @@ -675,11 +675,11 @@ errNo: (int *)errNo { if (_socket == INVALID_SOCKET) @throw [OFNotOpenException exceptionWithObject: self]; - if (connect(_socket, &address->sockaddr.sockaddr, + if (connect(_socket, (struct sockaddr *)&address->sockaddr.sockaddr, address->length) != 0) { *errNo = of_socket_errno(); return false; } @@ -832,11 +832,11 @@ if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); #endif setsockopt(_socket, SOL_SOCKET, SO_REUSEADDR, - (const char *)&one, (socklen_t)sizeof(one)); + (char *)&one, (socklen_t)sizeof(one)); #if defined(OF_WII) || defined(OF_NINTENDO_3DS) if (port != 0) { #endif if (bind(_socket, &address.sockaddr.sockaddr, Index: src/OFUDPSocket.m ================================================================== --- src/OFUDPSocket.m +++ src/OFUDPSocket.m @@ -385,12 +385,13 @@ ssize_t bytesWritten; if (length > SSIZE_MAX) @throw [OFOutOfRangeException exception]; - if ((bytesWritten = sendto(_socket, buffer, length, 0, - &receiver->sockaddr.sockaddr, receiver->length)) < 0) + if ((bytesWritten = sendto(_socket, (void *)buffer, length, 0, + (struct sockaddr *)&receiver->sockaddr.sockaddr, + receiver->length)) < 0) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length bytesWritten: 0 errNo: of_socket_errno()]; Index: src/socket.m ================================================================== --- src/socket.m +++ src/socket.m @@ -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 Index: src/socket_helpers.h ================================================================== --- src/socket_helpers.h +++ src/socket_helpers.h @@ -46,24 +46,43 @@ #ifndef SOCK_CLOEXEC # define SOCK_CLOEXEC 0 #endif -#if defined(OF_MORPHOS) +#if defined(OF_AMIGAOS) +# ifdef OF_AMIGAOS4 +# define __USE_INLINE__ +# endif +# include # include # define closesocket(sock) CloseSocket(sock) # define ioctlsocket(fd, req, arg) IoctlSocket(fd, req, arg) # define hstrerror(err) "unknown (no hstrerror)" # define SOCKET_ERROR -1 +# ifdef OF_MORPHOS typedef uint32_t in_addr_t; +# endif #elif !defined(OF_WINDOWS) && !defined(OF_WII) # define closesocket(sock) close(sock) #endif #ifdef OF_MORPHOS_IXEMUL typedef uint32_t in_addr_t; #endif + +#if defined(OF_AMIGAOS_M68K) +# define select(nfds, readfds, writefds, errorfds, timeout) \ + WaitSelect(nfds, readfds, writefds, errorfds, (struct __timeval *)timeout, \ + NULL) +#elif defined(OF_AMIGAOS4) +# define select(nfds, readfds, writefds, errorfds, timeout) \ + WaitSelect(nfds, readfds, writefds, errorfds, (struct TimeVal *)timeout, \ + NULL) +#elif defined(OF_MORPHOS) +# define select(nfds, readfds, writefds, errorfds, timeout) \ + WaitSelect(nfds, readfds, writefds, errorfds, timeout, NULL) +#endif #ifdef OF_WII # define accept(sock, addr, addrlen) net_accept(sock, addr, addrlen) # define bind(sock, addr, addrlen) net_bind(sock, addr, addrlen) # define closesocket(sock) net_close(sock)