static void cdsurvivalproxy_ProxyReadCallback (struct bufferevent* event, CDClient* client) { assert(client); CDServer* server = client->server; assert(server); CDBuffers* proxyBuffers = (CDBuffers*)CD_DynamicGet(client, "Client.proxyBuffers"); assert(proxyBuffers); void* packet; if (server->protocol->parsable(proxyBuffers)) { if ((packet = server->protocol->parse(proxyBuffers, true))) { CD_BufferReadIn(proxyBuffers, CDNull, CDNull); //TODO: worker, or something cdsurvivalproxy_ProxyProcess(server, client, packet); SV_DestroyPacket(packet); } } else { if (errno == EILSEQ) { CD_ServerKick(server, client, CD_CreateStringFromCString("bad packet")); } } }
SVPacket* SV_PacketFromBuffers (CDBuffers* buffers) { SVPacket* self = CD_malloc(sizeof(SVPacket)); assert(self); self->chain = SVRequest; self->type = (uint32_t) (uint8_t) SV_BufferRemoveByte(buffers->input); self->data = SV_GetPacketDataFromBuffer(self, buffers->input); if (!self->data) { ERR("unparsable packet 0x%.2X", self->type); SV_DestroyPacket(self); errno = EILSEQ; return NULL; } return self; }