rubidium@5774: /* $Id$ */ rubidium@5774: rubidium@5774: #ifdef ENABLE_NETWORK rubidium@5774: rubidium@5774: #include "../../stdafx.h" rubidium@5774: #include "os_abstraction.h" rubidium@5774: rubidium@5774: #ifdef __MORPHOS__ rubidium@5774: /* the library base is required here */ rubidium@5774: struct Library *SocketBase = NULL; rubidium@5774: #endif rubidium@5774: rubidium@5774: /** rubidium@5774: * Initializes the network core (as that is needed for some platforms rubidium@5774: */ rubidium@5775: bool NetworkCoreInitialize(void) rubidium@5774: { rubidium@5774: #if defined(__MORPHOS__) || defined(__AMIGA__) rubidium@5774: /* rubidium@5774: * IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_ rubidium@5774: * network related function, else: crash. rubidium@5774: */ rubidium@5774: DEBUG(net, 3, "[core] loading bsd socket library"); rubidium@5774: SocketBase = OpenLibrary("bsdsocket.library", 4); rubidium@5774: if (SocketBase == NULL) { rubidium@5774: DEBUG(net, 0, "[core] can't open bsdsocket.library version 4, network unavailable"); rubidium@5775: return false; rubidium@5774: } rubidium@5774: rubidium@5774: #if defined(__AMIGA__) rubidium@5774: /* for usleep() implementation (only required for legacy AmigaOS builds) */ rubidium@5774: TimerPort = CreateMsgPort(); rubidium@5774: if (TimerPort != NULL) { rubidium@5774: TimerRequest = (struct timerequest*)CreateIORequest(TimerPort, sizeof(struct timerequest); rubidium@5774: if (TimerRequest != NULL) { rubidium@5774: if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest*)TimerRequest, 0) == 0) { rubidium@5774: TimerBase = TimerRequest->tr_node.io_Device; rubidium@5774: if (TimerBase == NULL) { rubidium@5775: /* free ressources... */ rubidium@5774: DEBUG(net, 0, "[core] can't initialize timer, network unavailable"); rubidium@5775: return false; rubidium@5774: } rubidium@5774: } rubidium@5774: } rubidium@5774: } rubidium@5774: #endif // __AMIGA__ rubidium@5774: #endif // __MORPHOS__ / __AMIGA__ rubidium@5774: rubidium@5774: /* Let's load the network in windows */ rubidium@5774: #ifdef WIN32 rubidium@5774: { rubidium@5774: WSADATA wsa; rubidium@5774: DEBUG(net, 3, "[core] loading windows socket library"); rubidium@5774: if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) { rubidium@5774: DEBUG(net, 0, "[core] WSAStartup failed, network unavailable"); rubidium@5775: return false; rubidium@5774: } rubidium@5774: } rubidium@5774: #endif /* WIN32 */ rubidium@5775: rubidium@5775: return true; rubidium@5774: } rubidium@5774: rubidium@5774: /** rubidium@5774: * Shuts down the network core (as that is needed for some platforms rubidium@5774: */ rubidium@5774: void NetworkCoreShutdown(void) rubidium@5774: { rubidium@5774: #if defined(__MORPHOS__) || defined(__AMIGA__) rubidium@5774: /* free allocated ressources */ rubidium@5774: #if defined(__AMIGA__) rubidium@5774: if (TimerBase != NULL) CloseDevice((struct IORequest*)TimerRequest); // XXX This smells wrong rubidium@5774: if (TimerRequest != NULL) DeleteIORequest(TimerRequest); rubidium@5774: if (TimerPort != NULL) DeleteMsgPort(TimerPort); rubidium@5774: #endif rubidium@5774: rubidium@5774: if (SocketBase != NULL) CloseLibrary(SocketBase); rubidium@5774: #endif rubidium@5774: rubidium@5774: #if defined(WIN32) rubidium@5774: WSACleanup(); rubidium@5774: #endif rubidium@5774: } rubidium@5774: rubidium@5774: #endif /* ENABLE_NETWORK */