+ int b = getNetworkBuffer8BitInteger(nb_from);
+
+ putNetworkBuffer8BitInteger(nb_to, b);
+ }
+}
+
+static void increaseNetworkBuffer(struct NetworkBuffer *nb, int additional_size)
+{
+ // add some more buffer size than is really required this time
+ nb->max_size += additional_size + MAX_BUFFER_SIZE;
+ nb->buffer = checked_realloc(nb->buffer, nb->max_size);
+}
+
+int receiveNetworkBufferBytes(struct NetworkBuffer *nb, TCPsocket socket,
+ int num_bytes)
+{
+ if (num_bytes > MAX_PACKET_SIZE)
+ {
+ Debug("network:server", "protocol error: invalid packet size %d",
+ num_bytes);
+
+ return -1;
+ }
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ int result = SDLNet_TCP_Recv(socket, &nb->buffer[nb->pos], num_bytes);
+
+ if (result != num_bytes)
+ return result;
+
+ nb->pos += num_bytes;
+ nb->size = nb->pos;
+
+ return num_bytes;
+}
+
+int receiveNetworkBufferPacket(struct NetworkBuffer *nb, TCPsocket socket)
+{
+ int num_bytes, num_bytes_head, num_bytes_body;
+
+ num_bytes_head = 4;
+ num_bytes = receiveNetworkBufferBytes(nb, socket, num_bytes_head);
+
+ if (num_bytes != num_bytes_head)
+ return num_bytes;
+
+ num_bytes_body = getNetwork32BitInteger(nb->buffer);
+ num_bytes = receiveNetworkBufferBytes(nb, socket, num_bytes_body);
+
+ return num_bytes;
+}
+
+int getNetworkBuffer8BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 1;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork8BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer8BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 1;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork8BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+int getNetworkBuffer16BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 2;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork16BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer16BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 2;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork16BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+int getNetworkBuffer32BitInteger(struct NetworkBuffer *nb)
+{
+ int num_bytes = 4;
+
+ if (nb->pos + num_bytes > nb->size)
+ return 0;
+
+ int value = getNetwork32BitInteger(&nb->buffer[nb->pos]);
+
+ nb->pos += num_bytes;
+
+ return value;
+}
+
+void putNetworkBuffer32BitInteger(struct NetworkBuffer *nb, int value)
+{
+ int num_bytes = 4;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetwork32BitInteger(&nb->buffer[nb->pos], value);
+ nb->size = nb->pos;
+}
+
+char *getNetworkBufferString(struct NetworkBuffer *nb)
+{
+ char *s = getNetworkString(&nb->buffer[nb->pos]);
+
+ nb->pos += strlen(s) + 1;
+
+ return s;
+}
+
+void putNetworkBufferString(struct NetworkBuffer *nb, char *s)
+{
+ int num_bytes = strlen(s) + 1;
+
+ if (nb->pos + num_bytes > nb->max_size)
+ increaseNetworkBuffer(nb, num_bytes);
+
+ nb->pos += putNetworkString(&nb->buffer[nb->pos], s);
+ nb->size = nb->pos;
+}
+
+int getNetworkBufferFile(struct NetworkBuffer *nb, char *filename)
+{
+ FILE *file;
+ int num_bytes = getNetworkBuffer32BitInteger(nb);
+ int i;
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Warn("cannot write file '%s' from network buffer", filename);
+
+ return 0;