int recv_string(int conn, char **buf, size_t *len)
{
char tmp[4];
+ int size, more;
if (read(conn, tmp, 4) != 4)
{
fail(conn, ENOMEM, "reading string");
return ENOMEM;
}
- if (read(conn, *buf, *len) != *len)
+ for (size = 0; size < *len; size += more)
+ {
+ more = read(conn, *buf + size, *len - size);
+ if (!more)
+ break;
+ }
+
+ if (size != *len)
{
free(buf);
fail(conn, errno, "reading string");