From: John Hodge Date: Tue, 26 Feb 2013 05:49:30 +0000 (+0800) Subject: Usermode/AxWin3 - Added ipcpipe support X-Git-Tag: rel0.15~549 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=fbe188f3c0fbb02da55567b0570a042d818d98ce;p=tpg%2Facess2.git Usermode/AxWin3 - Added ipcpipe support --- diff --git a/Usermode/Applications/axwin3_src/WM/ipc.c b/Usermode/Applications/axwin3_src/WM/ipc.c index 51692a64..44601841 100644 --- a/Usermode/Applications/axwin3_src/WM/ipc.c +++ b/Usermode/Applications/axwin3_src/WM/ipc.c @@ -53,7 +53,11 @@ void IPC_Type_Datagram_Send(const void *Ident, size_t Length, const void *Data); int IPC_Type_Sys_GetSize(const void *Ident); int IPC_Type_Sys_Compare(const void *Ident1, const void *Ident2); void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data); -void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg); + int IPC_Type_IPCPipe_GetSize(const void *Ident); + int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2); +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data); +tIPC_Client *IPC_int_GetClient(const tIPC_Type *IPCType, const void *Ident); +void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg); // === GLOBALS === const tIPC_Type gIPC_Type_Datagram = { @@ -65,9 +69,14 @@ const tIPC_Type gIPC_Type_SysMessage = { IPC_Type_Sys_GetSize, IPC_Type_Sys_Compare, IPC_Type_Sys_Send +}; +const tIPC_Type gIPC_Type_IPCPipe = { + IPC_Type_IPCPipe_GetSize, + IPC_Type_IPCPipe_Compare, + IPC_Type_IPCPipe_Send }; int giNetworkFileHandle = -1; - int giMessagesFileHandle = -1; + int giIPCPipeHandle = -1; int giIPC_ClientCount; tIPC_Client **gIPC_Clients; @@ -82,34 +91,69 @@ void IPC_Init(void) tmp = AXWIN_PORT; _SysIOCtl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number } + + giIPCPipeHandle = _SysOpen("/Devices/ipcpipe/axwin"/*-$USER*/, OPENFLAG_CREATE); + _SysDebug("giIPCPipeHandle = %i", giIPCPipeHandle); + if( giIPCPipeHandle == -1 ) + _SysDebug("ERROR: Can't create IPCPipe handle"); +} + +void _setfd(int fd, int *nfds, fd_set *set) +{ + if( fd >= 0 ) + { + if( fd >= *nfds ) *nfds = fd+1; + FD_SET(fd, set); + } } void IPC_FillSelect(int *nfds, fd_set *set) { - if( giNetworkFileHandle != -1 ) + _setfd(giNetworkFileHandle, nfds, set); + _setfd(giIPCPipeHandle, nfds, set); + for( int i = 0; i < giIPC_ClientCount; i ++ ) { - if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle; - FD_SET(giNetworkFileHandle, set); + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + _setfd( *(int*)(gIPC_Clients[i]->Ident), nfds, set ); } } void IPC_HandleSelect(fd_set *set) { - if( giNetworkFileHandle != -1 ) + if( giNetworkFileHandle != -1 && FD_ISSET(giNetworkFileHandle, set) ) { - if( FD_ISSET(giNetworkFileHandle, set) ) - { - char staticBuf[STATICBUF_SIZE]; - int readlen, identlen; - char *msg; + char staticBuf[STATICBUF_SIZE]; + int readlen, identlen; + char *msg; + + readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); + + identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); + msg = staticBuf + identlen; + + IPC_Handle( IPC_int_GetClient(&gIPC_Type_Datagram, staticBuf), readlen - identlen, (void*)msg); + //_SysDebug("IPC_HandleSelect: UDP handled"); + } - readlen = _SysRead(giNetworkFileHandle, staticBuf, sizeof(staticBuf)); - - identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] ); - msg = staticBuf + identlen; + if( giIPCPipeHandle != -1 && FD_ISSET(giIPCPipeHandle, set) ) + { + int newfd = _SysOpenChild(giIPCPipeHandle, "newclient", OPENFLAG_READ|OPENFLAG_WRITE); + _SysDebug("newfd = %i"); + IPC_int_GetClient(&gIPC_Type_IPCPipe, &newfd); + } - IPC_Handle(&gIPC_Type_Datagram, staticBuf, readlen - identlen, (void*)msg); -// _SysDebug("IPC_HandleSelect: UDP handled"); + for( int i = 0; i < giIPC_ClientCount; i ++ ) + { + if( gIPC_Clients[i] && gIPC_Clients[i]->IPCType == &gIPC_Type_IPCPipe ) + { + int fd = *(const int*)gIPC_Clients[i]->Ident; + if( FD_ISSET(fd, set) ) + { + char staticBuf[STATICBUF_SIZE]; + size_t len; + len = _SysRead(fd, staticBuf, sizeof(staticBuf)); + IPC_Handle( gIPC_Clients[i], len, (void*)staticBuf ); + } } } @@ -120,7 +164,7 @@ void IPC_HandleSelect(fd_set *set) char data[len]; _SysGetMessage(NULL, len, data); - IPC_Handle(&gIPC_Type_SysMessage, &tid, len, (void*)data); + IPC_Handle( IPC_int_GetClient(&gIPC_Type_SysMessage, &tid), len, (void*)data ); // _SysDebug("IPC_HandleSelect: Message handled"); } } @@ -163,6 +207,22 @@ void IPC_Type_Sys_Send(const void *Ident, size_t Length, const void *Data) _SysSendMessage( *(const tid_t*)Ident, Length, Data ); } +int IPC_Type_IPCPipe_GetSize(const void *Ident) +{ + return sizeof(int); +} +int IPC_Type_IPCPipe_Compare(const void *Ident1, const void *Ident2) +{ + return *(const int*)Ident1 - *(const int*)Ident2; +} +void IPC_Type_IPCPipe_Send(const void *Ident, size_t Length, const void *Data) +{ + size_t rv = _SysWrite( *(const int*)Ident, Data, Length ); + if(rv != Length) { + _SysDebug("Sent message oversize %x", Length); + } +} + // --- Client -> Window Mappings int _CompareClientPtrs(const void *_a, const void *_b) { @@ -552,9 +612,8 @@ int (*gIPC_MessageHandlers[])(tIPC_Client *Client, tAxWin_IPCMessage *Msg) = { }; const int giIPC_NumMessageHandlers = sizeof(gIPC_MessageHandlers)/sizeof(gIPC_MessageHandlers[0]); -void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxWin_IPCMessage *Msg) +void IPC_Handle(tIPC_Client *Client, size_t MsgLen, tAxWin_IPCMessage *Msg) { - tIPC_Client *client; int rv = 0; // _SysDebug("IPC_Handle: (IPCType=%p, Ident=%p, MsgLen=%i, Msg=%p)", @@ -565,14 +624,9 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW if( MsgLen < sizeof(tAxWin_IPCMessage) + Msg->Size ) return ; - client = IPC_int_GetClient(IPCType, Ident); - if( !client ) { - // Oops? - } - if( Msg->Flags & IPCMSG_FLAG_RENDERER ) { - tWindow *win = IPC_int_GetWindow(client, Msg->Window); + tWindow *win = IPC_int_GetWindow(Client, Msg->Window); if( !win ) { _SysDebug("WARNING: NULL window in message %i", Msg->ID); return ; @@ -594,8 +648,8 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW else { if( Msg->ID >= giIPC_NumMessageHandlers ) { - fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, IPCType); - _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, IPCType); + fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Client); + _SysDebug("WARNING: Unknown message %i (%p)", Msg->ID, Client); return ; } @@ -606,7 +660,7 @@ void IPC_Handle(const tIPC_Type *IPCType, const void *Ident, size_t MsgLen, tAxW } _SysDebug("IPC_Handle: Call WM-%i", Msg->ID); - rv = gIPC_MessageHandlers[Msg->ID](client, Msg); + rv = gIPC_MessageHandlers[Msg->ID](Client, Msg); if( rv ) _SysDebug("IPC_Handle: rv != 0 (%i)", rv); } diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/main.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/main.c index da2ffe77..ab764d24 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/main.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/main.c @@ -17,7 +17,8 @@ int giAxWin3_MainLoopExit; int SoMain(void *Base, int argc, const char *argv[], const char **envp) { // TODO: Parse the environment for the AXWIN3_SERVER variable - gsAxWin3_int_ServerDesc = getenv("AXWIN3_SERVER"); + //gsAxWin3_int_ServerDesc = getenv("AXWIN3_SERVER"); + gsAxWin3_int_ServerDesc = "pipe:/Devices/ipcpipe/axwin"; return 0; } diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c index a9a79a30..955da447 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/msg.c @@ -13,11 +13,16 @@ #include "include/internal.h" #include "include/ipc.h" +#define assert(cnd) do{if(!(cnd)){_SysDebug("Assertion failed: %s", #cnd);}}while(0) + +#define STATICBUF_SIZE 0x1000 + // === CONSTANTS === enum eConnectionType { CONNTYPE_NONE, CONNTYPE_SENDMESSAGE, + CONNTYPE_IPCPIPE, CONNTYPE_UDP, CONNTYPE_TCP }; @@ -33,7 +38,6 @@ tAxWin3_MessageCallback gAxWin3_MessageCallback; // === CODE === void AxWin3_Connect(const char *ServerDesc) { - _SysDebug("ServerDesc (argument) = %s", ServerDesc); if( !ServerDesc ) { ServerDesc = gsAxWin3_int_ServerDesc; } @@ -64,6 +68,20 @@ void AxWin3_Connect(const char *ServerDesc) ServerDesc ++; // TODO: Open socket break; + case 'p': + assert( strncmp(ServerDesc, "pipe:", 5) == 0 ); + ServerDesc += 5; + giConnectionType = CONNTYPE_IPCPIPE; + giConnectionNum = _SysOpen(ServerDesc, OPENFLAG_READ|OPENFLAG_WRITE); + if( giConnectionNum == -1 ) { + _SysDebug("Cannot open IPC Pipe '%s'", ServerDesc); + exit(-1); + } + break; + default: + _SysDebug("Unknown server desc format '%s'", ServerDesc); + exit(-1); + break; } } @@ -110,6 +128,7 @@ void AxWin3_int_SendIPCMessage(tAxWin_IPCMessage *Msg) _SysWrite(giConnectionNum, tmpbuf, sizeof(tmpbuf)); } break; + case CONNTYPE_IPCPIPE: case CONNTYPE_TCP: _SysWrite(giConnectionNum, Msg, size); break; @@ -123,6 +142,17 @@ tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(int nFD, fd_set *fds) int len; tAxWin_IPCMessage *ret = NULL; int tid; + fd_set local_set; + + if(!fds) + fds = &local_set; + + if( giConnectionType != CONNTYPE_SENDMESSAGE ) + { + if(nFD <= giConnectionNum) + nFD = giConnectionNum+1; + FD_SET(giConnectionNum, fds); + } _SysSelect(nFD, fds, NULL, NULL, NULL, THREAD_EVENT_IPCMSG); @@ -151,9 +181,24 @@ tAxWin_IPCMessage *AxWin3_int_GetIPCMessage(int nFD, fd_set *fds) break; } - if( giConnectionType == CONNTYPE_TCP || giConnectionType == CONNTYPE_UDP ) + if( giConnectionType != CONNTYPE_SENDMESSAGE ) { - // Check fds + if( FD_ISSET(giConnectionNum, fds) ) + { + char tmpbuf[STATICBUF_SIZE]; + char *data = tmpbuf; + size_t len = _SysRead(giConnectionNum, tmpbuf, sizeof(tmpbuf)); + + if( giConnectionType == CONNTYPE_UDP ) + { + assert(len > giAxWin3_int_UDPHeaderLen); + len -= giAxWin3_int_UDPHeaderLen; + data += giAxWin3_int_UDPHeaderLen; + } + assert(len >= sizeof(tAxWin_IPCMessage)); + ret = malloc(len); + memcpy(ret, data, len); + } } return ret;