2 * Acess GUI (AxWin) Version 2
3 * By John Hodge (thePowersGang)
8 #include <axwin2/messages.h>
11 #define AXWIN_PORT 4101
13 #define STATICBUF_SIZE 64
16 typedef void tMessages_Handle_Callback(void*, size_t, void*);
20 void IPC_FillSelect(int *nfds, fd_set *set);
21 void IPC_HandleSelect(fd_set *set);
22 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data);
23 void Messages_RespondIPC(void *Ident, size_t Length, void *Data);
24 void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond);
27 int giNetworkFileHandle = -1;
28 int giMessagesFileHandle = -1;
35 giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
36 tmp = AXWIN_PORT; ioctl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number
38 // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages
39 // giMessagesFileHandle = open("/Devices/"
42 void IPC_FillSelect(int *nfds, fd_set *set)
44 if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle;
45 FD_SET(giNetworkFileHandle, set);
48 void IPC_HandleSelect(fd_set *set)
50 if( FD_ISSET(giNetworkFileHandle, set) )
52 char staticBuf[STATICBUF_SIZE];
53 int readlen, identlen;
56 readlen = read(giNetworkFileHandle, sizeof(staticBuf), staticBuf);
58 // Assume that all connections are from localhost
59 identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] );
60 msg = staticBuf + identlen;
62 Messages_Handle(staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram);
65 while(SysGetMessage(NULL, NULL))
68 int len = SysGetMessage(&tid, NULL);
70 SysGetMessage(NULL, data);
72 Messages_Handle(&tid, len, (void*)data, Messages_RespondIPC);
76 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data)
78 int addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] );
79 char tmpbuf[ 4 + addrSize + Length ];
80 memcpy(tmpbuf, Ident, 4 + addrSize);
81 memcpy(tmpbuf + 4 + addrSize, Data, Length);
82 // TODO: Handle fragmented packets
83 write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf);
86 void Messages_RespondIPC(void *Ident, size_t Length, void *Data)
88 SysSendMessage( *(tid_t*)Ident, Length, Data );
91 void Messages_Handle(void *Ident, int MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond)
97 Msg->ID = MSG_SRSP_VERSION;
101 *(uint16_t*)&Msg->Data[2] = -1;
102 Respond(Ident, sizeof(Msg->ID), Msg);
106 fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
107 _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);