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 […]