+GlPacket *packet_receive(int fd)
+{
+ int ret;
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ ret = select(fd+1, &fds, NULL, NULL, &tv);
+ if(ret>0)
+ {
+ if(!in_buffer)
+ in_buffer = (char *)malloc(1024);
+
+ if(in_offset)
+ {
+ 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;
+ }
+
+ if(ret>0 || in_fill>in_offset)
+ {
+ GlPacket *pkt;
+ unsigned pkt_length;
+
+ pkt_length = in_fill;
+ pkt = packet_receive_str(in_buffer+in_offset, &pkt_length);
+ if(pkt)
+ in_offset += pkt_length;
+
+ return pkt;
+ }
+
+ return NULL;
+}
+