X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fpacket.c;h=95190c56cb0c148a7c9fc65dbd57c132b9445712;hb=d72ef6d75a11f6cc05ab8ec039520719e1044741;hp=e0b687ac7c54846c2a9dd9d7710d15f5a9650d1c;hpb=ea3d851aa52e999b1c5a5fa52c97ff5019756c0e;p=gldbg.git diff --git a/source/packet.c b/source/packet.c index e0b687a..95190c5 100644 --- a/source/packet.c +++ b/source/packet.c @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of gldbg -Copyright © 2010 Mikko Rasa, Mikkosoft Productions -Distributed under the GPL -*/ - #include #include #include @@ -43,7 +36,8 @@ static char *out_buffer = NULL; static struct iovec *iovecs = NULL; static GlPacket packet; static char *in_buffer = NULL; -static unsigned in_length; +static unsigned in_fill = 0; +static unsigned in_offset = 0; static void next_vec(GlPacket *pkt) { @@ -192,7 +186,14 @@ void packet_write_pointer(GlPacket *pkt, const void *p) void packet_write_data(GlPacket *pkt, const void *data, unsigned size) { - if(data) + if(!data) + packet_write_int(pkt, 0); + else if((unsigned long)data<0x100000) + { + packet_write_int(pkt, ~0); + packet_write_pointer(pkt, data); + } + else { GlOutPacket *out = &pkt->out; @@ -204,8 +205,6 @@ void packet_write_data(GlPacket *pkt, const void *data, unsigned size) ++out->vec; out->vec->iov_base = out->ptr; } - else - packet_write_int(pkt, 0); } void packet_write_string(GlPacket *pkt, const char *s) @@ -285,24 +284,29 @@ GlPacket *packet_receive(int fd) if(!in_buffer) in_buffer = (char *)malloc(1024); - ret = read(fd, in_buffer+in_length, 1024-in_length); - if(ret>0) + if(in_offset) { - GlPacket *pkt; - unsigned pkt_length; + memmove(in_buffer, in_buffer+in_offset, in_fill-in_offset); + in_fill -= in_offset; + in_offset = 0; + } + + ret = read(fd, in_buffer+in_fill, 1024-in_fill); + if(ret>0) + in_fill += ret; + } - in_length += ret; + if(ret>0 || in_fill>in_offset) + { + GlPacket *pkt; + unsigned pkt_length; - pkt_length = in_length; - pkt = packet_receive_str(in_buffer, &pkt_length); - if(pkt) - { - in_length -= pkt_length; - memmove(in_buffer, in_buffer+pkt_length, in_length); - } + pkt_length = in_fill; + pkt = packet_receive_str(in_buffer+in_offset, &pkt_length); + if(pkt) + in_offset += pkt_length; - return pkt; - } + return pkt; } return NULL; @@ -402,13 +406,17 @@ void packet_read_data(GlPacket *pkt, const void **v) int vlen; packet_read_int(pkt, &vlen); - if(vlen) + if(vlen==~0) + packet_read_pointer(pkt, v); + else if(vlen) + { *v = in->ptr; + in->ptr += vlen; + in->chunk -= vlen; + in->length -= vlen; + } else *v = NULL; - in->ptr += vlen; - in->chunk -= vlen; - in->length -= vlen; } void packet_read_string(GlPacket *pkt, const char **v)