Exemple #1
0
SVMetadata*
SV_CreateMetadata (void)
{
	SVMetadata* self = CD_malloc(sizeof(SVMetadata));
	
	if (!self) {
		return NULL;
	}
	
	self->length = 0;
	self->item = CD_malloc(0);

	return self;
}
Exemple #2
0
CDPointer
CD_BufferRemove (CDBuffer* self, size_t length)
{
    CDPointer result = (CDPointer) CD_malloc(length);

    evbuffer_remove(self->raw, (void*) result, length);

    return result;
}
Exemple #3
0
CDPointer
CD_BufferContent (CDBuffer* self)
{
    CDPointer data = (CDPointer) CD_malloc(CD_BufferLength(self));

    evbuffer_copyout(self->raw, (void*) data, CD_BufferLength(self));

    return data;
}
Exemple #4
0
CDString*
CD_CreateStringFromBuffer (const char* buffer, size_t size)
{
	CDString* self = CD_malloc(sizeof(CDString));

	self->raw      = CD_malloc(sizeof(*self->raw));
	self->external = true;

	assert(self->raw);

	self->raw->data = (unsigned char*) buffer;
	self->raw->mlen = size;
	self->raw->slen = size;

	cd_UpdateLength(self);

	return self;
}
Exemple #5
0
CDEventCallback*
CD_CreateEventCallback (CDEventCallbackFunction function, int priority)
{
	CDEventCallback* self = CD_malloc(sizeof(CDEventCallback));

	self->function = function;
	self->priority = priority;

	return self;
}
Exemple #6
0
MCData*
MC_CreateData (void)
{
    MCData* self = CD_malloc(sizeof(MCData));

    if (!self) {
        return NULL;
    }

    return self;
}
Exemple #7
0
SVData*
SV_CreateData (void)
{
	SVData* self = CD_malloc(sizeof(SVData));

	if (!self) {
		return NULL;
	}

	return self;
}
Exemple #8
0
static
CDListItem*
cd_ListCreateItem (CDPointer data)
{
    CDListItem* item = (CDListItem*) CD_malloc(sizeof(CDListItem));

    item->next  = NULL;
    item->prev  = NULL;
    item->value = data;

    return item;
}
Exemple #9
0
CDBuffer*
CD_CreateBuffer (void)
{
	CDBuffer* self = CD_malloc(sizeof(CDBuffer));

	self->raw      = evbuffer_new();
	self->external = false;

	evbuffer_enable_locking(self->raw, NULL);

	return self;
}
Exemple #10
0
CDBuffer*
CD_WrapBuffer (CDRawBuffer buffer)
{
	CDBuffer* self = CD_malloc(sizeof(CDBuffer));

	self->raw      = buffer;
	self->external = true;

	evbuffer_enable_locking(self->raw, NULL);

	return self;
}
Exemple #11
0
CDWorker*
CD_CreateWorker (CDServer* server)
{
    CDWorker* self = CD_malloc(sizeof(CDWorker));

    self->server  = server;
    self->thread  = 0;
    self->id      = 0;
    self->working = false;
    self->job     = NULL;

    return self;
}
Exemple #12
0
CDString*
CD_CreateString (void)
{
	CDString* self = CD_malloc(sizeof(CDString));

	self->raw      = bfromcstr("");
	self->length   = 0;
	self->external = false;

	assert(self->raw);

	return self;
}
Exemple #13
0
CDString*
CD_CreateStringFromBufferCopy (const char* buffer, size_t length)
{
	CDString* self = CD_malloc(sizeof(CDString));

	self->raw      = blk2bstr(buffer, length);
	self->external = false;

	assert(self->raw);

	cd_UpdateLength(self);

	return self;
}
Exemple #14
0
CDATicket*
cdadmin_CreateTicket (CDPlayer* requester, CDString* content)
{
	CDATicket* self = CD_malloc(sizeof(CDATicket));

	assert(self);

	self->requester = requester;
	self->assignee  = NULL;
	self->status    = CDTicketOpen;
	self->content   = content;

	return self;
}
Exemple #15
0
CDString*
CD_CreateStringFromCStringCopy (const char* string)
{
	CDString* self = CD_malloc(sizeof(CDString));

	self->raw      = bfromcstr(string);
	self->external = false;

	assert(self->raw);

	cd_UpdateLength(self);

	return self;
}
Exemple #16
0
CDString*
CD_CreateStringFromCString (const char* string)
{
	CDString* self = CD_malloc(sizeof(CDString));

	self->raw = CD_malloc(sizeof(*self->raw));

	if (string == NULL) {
		self->raw->data = (unsigned char*) "";
	}
	else {
		self->raw->data = (unsigned char*) string;
	}

	self->raw->slen = strlen((const char*) self->raw->data);
	self->raw->mlen = self->raw->slen;

	self->external = true;

	cd_UpdateLength(self);

	return self;
}
Exemple #17
0
CDList*
CD_CreateList (void)
{
    CDList* self = CD_malloc(sizeof(CDList));

    self->head = NULL;
    self->tail = NULL;

    self->changed = false;
    self->length  = 0;

    if (pthread_rwlock_init(&self->lock, NULL) != 0) {
        CD_abort("pthread rwlock failed to initialize");
    }

    return self;
}
Exemple #18
0
CDList*
CD_CreateList (void)
{
    CDList* self = CD_malloc(sizeof(CDList));

    assert(self);

    self->head    = NULL;
    self->tail    = NULL;

    self->changed = false;
    self->length  = 0;

    assert(pthread_rwlock_init(&self->lock, NULL) == 0);

    return self;
}
Exemple #19
0
SVString
SV_BufferRemoveString (CDBuffer* self)
{
    char*     data   = NULL;
    SVShort   length = 0;
    CDString* result;

    evbuffer_remove(self->raw, &length, SVShortSize);

    length = ntohs(length);
    data   = CD_malloc(length + 1);

    evbuffer_remove(self->raw, data, length);

    data[length] = '\0';

    result           = CD_CreateStringFromBuffer(data, length + 1);
    result->external = false;

    return result;
}
Exemple #20
0
CDClient*
CD_CreateClient (CDServer* server)
{
	CDClient* self = CD_malloc(sizeof(CDClient));

	if (pthread_rwlock_init(&self->lock.status, NULL) != 0) {
		CD_abort("pthread rwlock failed to initialize");
	}

	self->server = server;

	self->status = CDClientConnect;
	self->jobs   = 0;

	self->buffers = NULL;

	DYNAMIC(self) = CD_CreateDynamic();
	ERROR(self)   = CDNull;

	return self;
}
Exemple #21
0
CDHTTPd*
CD_CreateHTTPd (CDServer* server)
{
    CDHTTPd* self = CD_malloc(sizeof(CDHTTPd));

    if (pthread_attr_init(&self->attributes) != 0) {
        CD_abort("pthread attribute failed to initialize");
    }

    if (pthread_attr_setdetachstate(&self->attributes, PTHREAD_CREATE_DETACHED) != 0) {
        CD_abort("pthread attribute failed to set in detach state");
    }

    self->server      = server;
    self->event.base  = event_base_new();
    self->event.httpd = evhttp_new(self->event.base);

    evhttp_set_cb(self->event.httpd, "/rpc/json", (void (*)(struct evhttp_request*, void*)) cd_JSONRequest, server);
    evhttp_set_gencb(self->event.httpd, (void (*)(struct evhttp_request*, void*)) cd_StaticRequest, server);

    return self;
}
Exemple #22
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;
}
Exemple #23
0
CDWorkers*
CD_CreateWorkers (CDServer* server)
{
    CDWorkers* self = CD_malloc(sizeof(CDWorkers));

    assert(self);

    self->server = server;
    self->last   = 0;
    self->length = 0;
    self->item   = NULL;

    self->jobs = CD_CreateList();

    if (pthread_attr_init(&self->attributes) != 0) {
        CD_abort("pthread attribute failed to initialize");
    }

    if (pthread_attr_setdetachstate(&self->attributes, PTHREAD_CREATE_DETACHED) != 0) {
        CD_abort("pthread attribute failed to set in detach state");
    }

    if (pthread_attr_setstacksize(&self->attributes, CD_THREAD_STACK) != 0) {
        CD_abort("pthread attribute failed to set stack size");
    }

    if (pthread_mutex_init(&self->lock.mutex, NULL) != 0) {
        CD_abort("pthread mutex failed to initialize");
    }

    if (pthread_cond_init(&self->lock.condition, NULL) != 0) {
        CD_abort("pthread cond failed to initialize");
    }

    return self;
}
Exemple #24
0
CDPointer
SV_GetPacketDataFromBuffer (SVPacket* self, CDBuffer* input)
{
    assert(self);
    assert(input);

    switch (self->type) {
        case SVKeepAlive: {
            return (CDPointer) CD_malloc(sizeof(SVPacketKeepAlive));
        }

        case SVLogin: {
            SVPacketLogin* packet = (SVPacketLogin*) CD_malloc(sizeof(SVPacketLogin));

            SV_BufferRemoveFormat(input, "iUlb",
                &packet->request.version,
                &packet->request.username,
                &packet->request.mapSeed,
                &packet->request.dimension
            );

            return (CDPointer) packet;
        }

        case SVHandshake: {
            SVPacketHandshake* packet = (SVPacketHandshake*) CD_malloc(sizeof(SVPacketHandshake));

            packet->request.username = SV_BufferRemoveString16(input);

            return (CDPointer) packet;
        }

        case SVChat: {
            SVPacketChat* packet = (SVPacketChat*) CD_malloc(sizeof(SVPacketChat));

            packet->request.message = SV_BufferRemoveString16(input);

            return (CDPointer) packet;
        }

        case SVUseEntity: {
            SVPacketUseEntity* packet = (SVPacketUseEntity*) CD_malloc(sizeof(SVPacketUseEntity));

            SV_BufferRemoveFormat(input, "iib",
                &packet->request.user,
                &packet->request.target,
                &packet->request.leftClick
            );

            return (CDPointer) packet;
        }

        case SVRespawn: {
            return (CDPointer) CD_malloc(sizeof(SVPacketRespawn));
        }

        case SVOnGround: {
            SVPacketOnGround* packet = (SVPacketOnGround*) CD_malloc(sizeof(SVPacketOnGround));

            packet->request.onGround = SV_BufferRemoveBoolean(input);

            return (CDPointer) packet;
        }

        case SVPlayerPosition: {
            SVPacketPlayerPosition* packet = (SVPacketPlayerPosition*) CD_malloc(sizeof(SVPacketPlayerPosition));

            SV_BufferRemoveFormat(input, "ddddb",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.stance,
                &packet->request.position.z,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case SVPlayerLook: {
            SVPacketPlayerLook* packet = (SVPacketPlayerLook*) CD_malloc(sizeof(SVPacketPlayerLook));

            SV_BufferRemoveFormat(input, "ffb",
                &packet->request.yaw,
                &packet->request.pitch,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case SVPlayerMoveLook: {
            SVPacketPlayerMoveLook* packet = (SVPacketPlayerMoveLook*) CD_malloc(sizeof(SVPacketPlayerMoveLook));

            SV_BufferRemoveFormat(input, "ddddffb",
                &packet->request.position.x,
                &packet->request.stance,
                &packet->request.position.y,
                &packet->request.position.z,
                &packet->request.yaw,
                &packet->request.pitch,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case SVPlayerDigging: {
            SVPacketPlayerDigging* packet = (SVPacketPlayerDigging*) CD_malloc(sizeof(SVPacketPlayerDigging));

            packet->request.status = SV_BufferRemoveByte(input);

            SV_BufferRemoveFormat(input, "ibi",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z
            );

            packet->request.face = SV_BufferRemoveByte(input);

            return (CDPointer) packet;
        }

        case SVPlayerBlockPlacement: {
            SVPacketPlayerBlockPlacement* packet = (SVPacketPlayerBlockPlacement*) CD_malloc(sizeof(SVPacketPlayerBlockPlacement));

            SV_BufferRemoveFormat(input, "ibibs",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z,

                &packet->request.direction,
                &packet->request.item.id
            );

            if (packet->request.item.id != -1) {
                SV_BufferRemoveFormat(input, "bs",
                    &packet->request.item.count,
                    &packet->request.item.uses
                );
            }

            return (CDPointer) packet;
        }

        case SVHoldChange: {
            SVPacketHoldChange* packet = (SVPacketHoldChange*) CD_malloc(sizeof(SVPacketHoldChange));

            packet->request.item.id = SV_BufferRemoveShort(input);

            return (CDPointer) packet;
        }

        case SVAnimation: {
            SVPacketAnimation* packet = (SVPacketAnimation*) CD_malloc(sizeof(SVPacketAnimation));

            SV_BufferRemoveFormat(input, "ib",
                &packet->request.entity.id,
                &packet->request.type
            );

            return (CDPointer) packet;
        }

        case SVEntityAction: {
            SVPacketEntityAction* packet = (SVPacketEntityAction*) CD_malloc(sizeof(SVPacketEntityAction));

            packet->request.entity.id = SV_BufferRemoveInteger(input);
            packet->request.action    = SV_BufferRemoveByte(input);

            return (CDPointer) packet;
        }

        case SVEntityMetadata: {
            SVPacketEntityMetadata* packet = (SVPacketEntityMetadata*) CD_malloc(sizeof(SVPacketEntityMetadata));

            SV_BufferRemoveFormat(input, "iM",
                &packet->request.entity.id,
                &packet->request.metadata
            );

            return (CDPointer) packet;
        }

        case SVCloseWindow: {
            SVPacketCloseWindow* packet = (SVPacketCloseWindow*) CD_malloc(sizeof(SVPacketCloseWindow));

            packet->request.id = SV_BufferRemoveByte(input);

            return (CDPointer) packet;
        }

        case SVWindowClick: {
            SVPacketWindowClick* packet = (SVPacketWindowClick*) CD_malloc(sizeof(SVPacketWindowClick));

            SV_BufferRemoveFormat(input, "bsBss",
                &packet->request.id,
                &packet->request.slot,
                &packet->request.rightClick,
                &packet->request.action,
                &packet->request.item.id
            );

            if (packet->request.item.id != -1) {
                SV_BufferRemoveFormat(input, "bs",
                    &packet->request.item.count,
                    &packet->request.item.uses
                );
            }

            return (CDPointer) packet;
        }

        case SVTransaction: {
            SVPacketTransaction* packet = (SVPacketTransaction*) CD_malloc(sizeof(SVPacketTransaction));

            SV_BufferRemoveFormat(input, "bsB",
                &packet->request.id,
                &packet->request.action,
                &packet->request.accepted
            );

            return (CDPointer) packet;
        }

        case SVUpdateSign: {
            SVPacketUpdateSign* packet = (SVPacketUpdateSign*) CD_malloc(sizeof(SVPacketUpdateSign));

            SV_BufferRemoveFormat(input, "iisiUUUU",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z,

                &packet->request.first,
                &packet->request.second,
                &packet->request.third,
                &packet->request.fourth
            );

            return (CDPointer) packet;
        }

        case SVIncrementStatistic: {
            SVPacketIncrementStatistic* packet = (SVPacketIncrementStatistic*) CD_malloc(sizeof(SVPacketIncrementStatistic));

            SV_BufferRemoveFormat(input, "ib",
                &packet->request.id,
                &packet->request.amount
            );

            return (CDPointer) packet;
        }

        case SVDisconnect: {
            SVPacketDisconnect* packet = (SVPacketDisconnect*) CD_malloc(sizeof(SVPacketDisconnect));

            packet->request.reason = SV_BufferRemoveString16(input);

            return (CDPointer) packet;
        }

        default: {
            return (CDPointer) NULL;
        }
    }
}
Exemple #25
0
CDPointer
CD_GetPacketDataFromBuffer (CDPacket* self, CDBuffer* input)
{
    assert(self);
    assert(input);

    switch (self->type) {
        case CDKeepAlive: {
            return (CDPointer) CD_malloc(sizeof(CDPacketKeepAlive));
        }

        case CDLogin: {
            CDPacketLogin* packet = (CDPacketLogin*) CD_malloc(sizeof(CDPacketLogin));

            CD_BufferRemoveFormat(input, "iSSlb",
                &packet->request.version,
                &packet->request.username,
                &packet->request.password,
                &packet->request.mapSeed,
                &packet->request.dimension
            );

            return (CDPointer) packet;
        }

        case CDHandshake: {
            CDPacketHandshake* packet = (CDPacketHandshake*) CD_malloc(sizeof(CDPacketHandshake));

            packet->request.username = CD_BufferRemoveString(input);

            return (CDPointer) packet;
        }

        case CDChat: {
            CDPacketChat* packet = (CDPacketChat*) CD_malloc(sizeof(CDPacketChat));

            packet->request.message = CD_BufferRemoveString(input);

            return (CDPointer) packet;
        }

        case CDUseEntity: {
            CDPacketUseEntity* packet = (CDPacketUseEntity*) CD_malloc(sizeof(CDPacketUseEntity));

            CD_BufferRemoveFormat(input, "iib",
                &packet->request.user,
                &packet->request.target,
                &packet->request.leftClick
            );

            return (CDPointer) packet;
        }

        case CDRespawn: {
            return (CDPointer) CD_malloc(sizeof(CDPacketRespawn));
        }

        case CDOnGround: {
            CDPacketOnGround* packet = (CDPacketOnGround*) CD_malloc(sizeof(CDPacketOnGround));

            packet->request.onGround = CD_BufferRemoveBoolean(input);

            return (CDPointer) packet;
        }

        case CDPlayerPosition: {
            CDPacketPlayerPosition* packet = (CDPacketPlayerPosition*) CD_malloc(sizeof(CDPacketPlayerPosition));

            CD_BufferRemoveFormat(input, "ddddb",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.stance,
                &packet->request.position.z,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case CDPlayerLook: {
            CDPacketPlayerLook* packet = (CDPacketPlayerLook*) CD_malloc(sizeof(CDPacketPlayerLook));

            CD_BufferRemoveFormat(input, "ffb",
                &packet->request.yaw,
                &packet->request.pitch,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case CDPlayerMoveLook: {
            CDPacketPlayerMoveLook* packet = (CDPacketPlayerMoveLook*) CD_malloc(sizeof(CDPacketPlayerMoveLook));

            CD_BufferRemoveFormat(input, "ddddffb",
                &packet->request.position.x,
                &packet->request.stance,
                &packet->request.position.y,
                &packet->request.position.z,
                &packet->request.yaw,
                &packet->request.pitch,
                &packet->request.is.onGround
            );

            return (CDPointer) packet;
        }

        case CDPlayerDigging: {
            CDPacketPlayerDigging* packet = (CDPacketPlayerDigging*) CD_malloc(sizeof(CDPacketPlayerDigging));

            CD_BufferRemoveFormat(input, "bibib",
                &packet->request.status,
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z,
                &packet->request.face
            );

            return (CDPointer) packet;
        }

        case CDPlayerBlockPlacement: {
            CDPacketPlayerBlockPlacement* packet = (CDPacketPlayerBlockPlacement*) CD_malloc(sizeof(CDPacketPlayerBlockPlacement));

            CD_BufferRemoveFormat(input, "ibibs",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z,

                &packet->request.direction,
                &packet->request.item.id
            );

            if (packet->request.item.id != -1) {
                CD_BufferRemoveFormat(input, "bs",
                    &packet->request.item.count,
                    &packet->request.item.uses
                );
            }

            return (CDPointer) packet;
        }

        case CDHoldChange: {
            CDPacketHoldChange* packet = (CDPacketHoldChange*) CD_malloc(sizeof(CDPacketHoldChange));

            packet->request.item.id = CD_BufferRemoveShort(input);

            return (CDPointer) packet;
        }

        case CDAnimation: {
            CDPacketAnimation* packet = (CDPacketAnimation*) CD_malloc(sizeof(CDPacketAnimation));

            CD_BufferRemoveFormat(input, "ib",
                &packet->request.entity.id,
                &packet->request.type
            );

            return (CDPointer) packet;
        }

        case CDEntityAction: {
            CDPacketEntityAction* packet = (CDPacketEntityAction*) CD_malloc(sizeof(CDPacketEntityAction));

            CD_BufferRemoveFormat(input, "ib",
                &packet->request.entity.id,
                &packet->request.action
            );

            return (CDPointer) packet;
        }

        case CDEntityMetadata: {
            CDPacketEntityMetadata* packet = (CDPacketEntityMetadata*) CD_malloc(sizeof(CDPacketEntityMetadata));

            CD_BufferRemoveFormat(input, "iM",
                &packet->request.entity.id,
                &packet->request.metadata
            );

            return (CDPointer) packet;
        }

        case CDCloseWindow: {
            CDPacketCloseWindow* packet = (CDPacketCloseWindow*) CD_malloc(sizeof(CDPacketCloseWindow));

            packet->request.id = CD_BufferRemoveByte(input);

            return (CDPointer) packet;
        }

        case CDWindowClick: {
            CDPacketWindowClick* packet = (CDPacketWindowClick*) CD_malloc(sizeof(CDPacketWindowClick));

            CD_BufferRemoveFormat(input, "bsBss",
                &packet->request.id,
                &packet->request.slot,
                &packet->request.rightClick,
                &packet->request.action,
                &packet->request.item.id
            );

            if (packet->request.item.id != -1) {
                CD_BufferRemoveFormat(input, "bs",
                    &packet->request.item.count,
                    &packet->request.item.uses
                );
            }

            return (CDPointer) packet;
        }

        case CDTransaction: {
            CDPacketTransaction* packet = (CDPacketTransaction*) CD_malloc(sizeof(CDPacketTransaction));

            CD_BufferRemoveFormat(input, "bsB",
                &packet->request.id,
                &packet->request.action,
                &packet->request.accepted
            );

            return (CDPointer) packet;
        }

        case CDUpdateSign: {
            CDPacketUpdateSign* packet = (CDPacketUpdateSign*) CD_malloc(sizeof(CDPacketUpdateSign));

            CD_BufferRemoveFormat(input, "iisiSSSS",
                &packet->request.position.x,
                &packet->request.position.y,
                &packet->request.position.z,

                &packet->request.first,
                &packet->request.second,
                &packet->request.third,
                &packet->request.fourth
            );

            return (CDPointer) packet;
        }

        case CDDisconnect: {
            CDPacketDisconnect* packet = (CDPacketDisconnect*) CD_malloc(sizeof(CDPacketDisconnect));

            packet->request.reason = CD_BufferRemoveString(input);

            return (CDPointer) packet;
        }

        default: {
            return (CDPointer) NULL;
        }
    }
}