Esempio n. 1
0
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"));
		}
	}
	
}
Esempio n. 2
0
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;
}