Debarshi Ray wrote: > size_t > recvbuf (int sockfd, void **buffer, size_t *size) > { > size_t block = BUFSIZ; > size_t count = 0; > ssize_t nread; > > if (*buffer == NULL) > *size = block; > > for (;;) > { > *buffer = xrealloc (*buffer, *size); > nread = recv (sockfd, *buffer + count, block, 0); > > if (nread == -1) > error (EXIT_FAILURE, errno, "recv"); > > count += nread; > > if (nread < block) > break; > else > { > block = (*size / 2 > BUFSIZ) ? *size / 2 : BUFSIZ; > *size += block; > } > } > > return count; > }
What's the use-case of this function? You said that you want to "safely" read from sockfd, but can you explain what you mean by that? I don't see the point in performing the loop here, since - for SOCK_DGRAM sockets (e.g. UDP) the parts of the first message that don't fit in BUFSIZ bytes will be discarded; performing more recv() calls afterwards will not recover them, but will read a different packet each, - for SOCK_STREAM sockets (e.g. TCP) your function is reading all that is currently available. What's the point? Why not return a block of BUFSIZ bytes to the caller, then in the next call another block of BUFSIZ bytes and so on? BUFSIZ is large enough that this should hardly have a measurable effect on speed. Bruno