AxWin - Re-added Proc message support
[tpg/acess2.git] / Usermode / Applications / axwin2_src / WM / messages.c
index 61e3357..14718ab 100644 (file)
@@ -5,8 +5,8 @@
 #include "common.h"
 #include <acess/sys.h>
 #include <net.h>
-#include <axwin/messages.h>
-//#include <select.h>
+#include <axwin2/messages.h>
+#include <string.h>
 
 #define AXWIN_PORT     4101
 
 typedef void tMessages_Handle_Callback(void*, size_t, void*);
 
 // === PROTOTYPES ===
-void   Messages_PollIPC();
+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(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond);
 
 // === GLOBALS ===
- int   giIPCFileHandle;
+ int   giNetworkFileHandle = -1;
+ int   giMessagesFileHandle = -1;
 
 // === CODE ===
 void IPC_Init(void)
 {
         int    tmp;
        // TODO: Check this
-       giIPCFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
-       tmp = AXWIN_PORT;       ioctl(giIPCFileHandle, 4, &tmp);        // TODO: Don't hard-code IOCtl number
+       giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
+       tmp = AXWIN_PORT;       ioctl(giNetworkFileHandle, 4, &tmp);    // TODO: Don't hard-code IOCtl number
+
+       // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages
+//     giMessagesFileHandle = open("/Devices/"
 }
 
 void IPC_FillSelect(int *nfds, fd_set *set)
 {
-       if( giIPCFileHandle > *nfds )   *nfds = giIPCFileHandle;
-       FD_SET(giIPCFileHandle, set);
+       if( giNetworkFileHandle > *nfds )       *nfds = giNetworkFileHandle;
+       FD_SET(giNetworkFileHandle, set);
 }
 
 void IPC_HandleSelect(fd_set *set)
 {
-       if( FD_ISSET(giIPCFileHandle, set) )
+       if( FD_ISSET(giNetworkFileHandle, set) )
        {
                char    staticBuf[STATICBUF_SIZE];
                 int    readlen, identlen;
                char    *msg;
-               readlen = read(giIPCFileHandle, sizeof(staticBuf), staticBuf);
+
+               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(staticBuf, readlen - identlen, (void*)msg, Messages_RespondIPC);
+               Messages_Handle(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(&tid, len, (void*)data, Messages_RespondIPC);
        }
 }
 
-#if 0
-void Messages_PollIPC()
+void Messages_RespondDatagram(void *Ident, size_t Length, void *Data)
 {
-        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 ;
-               }
-       }
-       
-       // Get message data
-       SysGetMessage(NULL, msg);
-       
-       Messages_Handle(msg, Messages_RespondIPC, tid);
+        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);
 }
-#endif
 
 void Messages_RespondIPC(void *Ident, size_t Length, void *Data)
 {
@@ -105,7 +99,7 @@ void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Han
                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
        default:

UCC git Repository :: git.ucc.asn.au