Getting ENet to work with Marmalade
Through a bit of Googling and whatnot, I got in touch with Joe Delgado who was able to provide a patch to fix ENet to work with Marmalade. These are modifications to unix.c. When I am making a Marmalade build of my games, I always have PLATFORM_MARMALADE defined. So you can replace that with whatever you do.
After the #ifdef __APPLE__ segment, add this to set up the correct defines, etc.
#ifdef PLATFORM_MARMALADE #define SOMAXCONN 128 #undef HAS_POLL #undef HAS_MSGHDR_FLAGS #undef HAS_FCNTL #include <sys/select.h> #include <sys/uio.h> #define HAS_SOCKLEN_T #endif
In enet_socket_send, it turns out the Marmalade sendmsg is broken. So I replace:
msgHdr.msg_iov = (struct iovec *) buffers;
msgHdr.msg_iovlen = bufferCount;
sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL);
With
#ifdef PLATFORM_MARMALADE
// concatenates buffers together
ENetBuffer * newBuffers;
char* d;
int i, totalSize;
newBuffers = (ENetBuffer*)malloc(sizeof(ENetBuffer));
totalSize = 0;
for (i=0;i<bufferCount;i++) {
totalSize += (buffers+i)->dataLength;
}
newBuffers->data = malloc(totalSize);
newBuffers->dataLength = totalSize;
d = (char*)newBuffers->data;
for (i=0;i<bufferCount;i++) {
memcpy(d, (buffers+i)->data, (buffers+i)->dataLength);
d += (buffers+i)->dataLength;
}
msgHdr.msg_iov = (struct iovec *) newBuffers;
msgHdr.msg_iovlen = totalSize;
sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL);
free(newBuffers->data);
free(newBuffers);
#else
msgHdr.msg_iov = (struct iovec *) buffers;
msgHdr.msg_iovlen = bufferCount;
sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL);
#endif
And that seems to get ENet working 100% with Marmalade. I applied this patch to ENet 1.3.6 … The original patch was written for ENet 1.3.3, and I suspect it would work for the latest version of ENet. I built this with Marmalade 6.3.2. I’ve passed on a request to the Marmalade team to fix sendmsg so that the larger chunk of the code would no longer be necessary.
-Phil


August 10th, 2013 at 7:26 pm
[…] was able to get Galcon 2 working on Android, thanks to a helpful internet person! If you have an Android device, please check it […]