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
19 void IPC_FillSelect(int *nfds, fd_set *set);
20 void IPC_HandleSelect(fd_set *set);
21 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data);
22 void Messages_RespondIPC(void *Ident, size_t Length, void *Data);
23 void Messages_Handle(void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond);
26 int giNetworkFileHandle = -1;
27 int giMessagesFileHandle = -1;
34 giNetworkFileHandle = open("/Devices/ip/loop/udp", OPENFLAG_READ);
35 tmp = AXWIN_PORT; ioctl(giNetworkFileHandle, 4, &tmp); // TODO: Don't hard-code IOCtl number
37 // TODO: Open a handle to something like /Devices/proc/cur/messages to watch for messages
38 // giMessagesFileHandle = open("/Devices/"
41 void IPC_FillSelect(int *nfds, fd_set *set)
43 if( giNetworkFileHandle > *nfds ) *nfds = giNetworkFileHandle;
44 FD_SET(giNetworkFileHandle, set);
47 void IPC_HandleSelect(fd_set *set)
49 if( FD_ISSET(giNetworkFileHandle, set) )
51 char staticBuf[STATICBUF_SIZE];
52 int readlen, identlen;
55 readlen = read(giNetworkFileHandle, sizeof(staticBuf), staticBuf);
57 // Assume that all connections are from localhost
58 identlen = 4 + Net_GetAddressSize( ((uint16_t*)staticBuf)[1] );
59 msg = staticBuf + identlen;
61 Messages_Handle(staticBuf, readlen - identlen, (void*)msg, Messages_RespondDatagram);
64 while(SysGetMessage(NULL, NULL))
67 int len = SysGetMessage(&tid, NULL);
69 SysGetMessage(NULL, data);
71 Messages_Handle(&tid, len, (void*)data, Messages_RespondIPC);
75 void Messages_RespondDatagram(void *Ident, size_t Length, void *Data)
77 int addrSize = Net_GetAddressSize( ((uint16_t*)Ident)[1] );
78 char tmpbuf[ 4 + addrSize + Length ];
79 memcpy(tmpbuf, Ident, 4 + addrSize);
80 memcpy(tmpbuf + 4 + addrSize, Data, Length);
81 // TODO: Handle fragmented packets
82 write(giNetworkFileHandle, sizeof(tmpbuf), tmpbuf);
85 void Messages_RespondIPC(void *Ident, size_t Length, void *Data)
87 SysSendMessage( *(tid_t*)Ident, Length, Data );
90 void Messages_Handle(void *Ident, size_t MsgLen, tAxWin_Message *Msg, tMessages_Handle_Callback *Respond)
92 if( MsgLen < sizeof(tAxWin_Message) )
94 if( MsgLen < sizeof(tAxWin_Message) + Msg->Size )
100 if( MsgLen < sizeof(tAxWin_Message) + 4 ) return;
101 Msg->ID = MSG_SRSP_VERSION;
105 *(uint16_t*)&Msg->Data[2] = -1;
106 Respond(Ident, sizeof(Msg->ID), Msg);
109 case MSG_SREQ_REGISTER:
110 if( Msg->Len == strnlen(Msg->Len, Msg->Data) ) {
118 fprintf(stderr, "WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);
119 _SysDebug("WARNING: Unknown message %i (%p)\n", Msg->ID, Respond);