]> git.tdb.fi Git - gldbg.git/blobdiff - source/packet.c
Query implementation limits on process startup
[gldbg.git] / source / packet.c
index e0b687ac7c54846c2a9dd9d7710d15f5a9650d1c..95190c56cb0c148a7c9fc65dbd57c132b9445712 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of gldbg
-Copyright © 2010  Mikko Rasa, Mikkosoft Productions
-Distributed under the GPL
-*/
-
 #include <stdlib.h>
 #include <string.h>
 #include <sys/uio.h>
@@ -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)