X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Usermode%2FApplications%2Faxwin2_src%2FWM%2Fmessages.c;h=61ffc53042d94b4cb2dee1ae7aeb2ff15fe31a1a;hb=3117b20bcbfbed588ede9b29a7f90eafc762b138;hp=92137f076bf52e525ef782f011d58536665b75f0;hpb=85eb17b306404571aa39596946c87ad9bb1d9d13;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin2_src/WM/messages.c b/Usermode/Applications/axwin2_src/WM/messages.c index 92137f07..61ffc530 100644 --- a/Usermode/Applications/axwin2_src/WM/messages.c +++ b/Usermode/Applications/axwin2_src/WM/messages.c @@ -4,75 +4,118 @@ */ #include "common.h" #include -#include +#include +#include +#include + +#define AXWIN_PORT 4101 #define STATICBUF_SIZE 64 // === TYPES === -typedef void tMessages_Handle_Callback(int, size_t,void*); // === PROTOTYPES === -void Messages_PollIPC(); -void Messages_RespondIPC(int ID, size_t Length, void *Data); -void Messages_Handle(tAxWin_Message *Msg, tMessages_Handle_Callback *Respond, int ID); +void IPC_Init(void); +void IPC_FillSelect(int *nfds, fd_set *set); +void IPC_HandleSelect(fd_set *set); +void Messages_RespondDatagram(void *Ident, size_t Length, void *Data); +void Messages_RespondIPC(void *Ident, size_t Length, void *Data); +void Messages_Handle(size_t IdentLen, void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond); // === GLOBALS === + int giNetworkFileHandle = -1; + int giMessagesFileHandle = -1; // === CODE === -void Messages_PollIPC() +void IPC_Init(void) { - int len; - pid_t tid = 0; - char staticBuf[STATICBUF_SIZE]; - tAxWin_Message *msg; - - // Wait for a message - while( (len = SysGetMessage(&tid, NULL)) == 0 ) - sleep(); - - // Allocate the space for it - if( len <= STATICBUF_SIZE ) - msg = (void*)staticBuf; - else { - msg = malloc( len ); - if(!msg) { - fprintf( - stderr, - "ERROR - Unable to allocate message buffer, ignoring message from %i\n", - tid); - SysGetMessage(NULL, GETMSG_IGNORE); - return ; - } + int tmp; + // TODO: Check this + giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ); + tmp = AXWIN_PORT; ioctl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number +} + +void IPC_FillSelect(int *nfds, fd_set *set) +{ + if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle; + FD_SET(giNetworkFileHandle, set); +} + +void IPC_HandleSelect(fd_set *set) +{ + if( FD_ISSET(giNetworkFileHandle, set) ) + { + char staticBuf[STATICBUF_SIZE]; + int readlen, identlen; + char *msg; + + readlen = read(giNetworkFileHandle, sizeof(staticBuf), staticBuf); + + // Assume that all connections are from localhost + identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); + msg = staticBuf + identlen; + + Messages_Handle(identlen, staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram); + } + + while(SysGetMessage(NULL, NULL)) + { + pid_t tid; + int len = SysGetMessage(&tid, NULL); + char data[len]; + SysGetMessage(NULL, data); + + Messages_Handle(sizeof(tid), &tid, len, (void*)data, Messages_RespondIPC); } - - // Get message data - SysGetMessage(NULL, msg); - - Messages_Handle(msg, Messages_RespondIPC, tid); } -void Messages_RespondIPC(int ID, size_t Length, void *Data) +void Messages_RespondDatagram(void *Ident, size_t Length, void *Data) { - SysSendMessage(ID, Length, Data); + int addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] ); + char tmpbuf[ 4 + addrSize + Length ]; + memcpy(tmpbuf, Ident, 4 + addrSize); + memcpy(tmpbuf + 4 + addrSize, Data, Length); + // TODO: Handle fragmented packets + write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf); } -void Messages_Handle(tAxWin_Message *Msg, tMessages_Handle_Callback *Respond, int ID) +void Messages_RespondIPC(void *Ident, size_t Length, void *Data) { + SysSendMessage( *(tid_t*)Ident, Length, Data ); +} + +void Messages_Handle(size_t IdentLen, void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond) +{ + if( MsgLen < sizeof(tAxWin_Message) ) + return ; + if( MsgLen < sizeof(tAxWin_Message) + Msg->Size ) + return ; + switch(Msg->ID) { - #if 0 case MSG_SREQ_PING: + if( MsgLen < sizeof(tAxWin_Message) + 4 ) return; Msg->ID = MSG_SRSP_VERSION; - Msg->Size = 2; + Msg->Size = 4; Msg->Data[0] = 0; Msg->Data[1] = 1; *(uint16_t*)&Msg->Data[2] = -1; - Messages_RespondIPC(ID, sizeof(Msg->ID), Msg); + Respond(Ident, sizeof(Msg->ID), Msg); break; - #endif + + case MSG_SREQ_REGISTER: + if( Msg->Data[Msg->Size-1] != '\0' ) { + // Invalid message + return ; + } + + AxWin_RegisterClient(IdentLen, Ident, Respond, Msg->Data); + + break; + default: - fprintf(stderr, "WARNING: Unknown message %i from %i (%p)\n", Msg->ID, ID, Respond); - _SysDebug("WARNING: Unknown message %i from %i (%p)\n", Msg->ID, ID, Respond); + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); + _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond); break; } }