Skip to content

Instantly share code, notes, and snippets.

@betawaffle
Created August 21, 2010 13:37
Show Gist options
  • Save betawaffle/542317 to your computer and use it in GitHub Desktop.
Save betawaffle/542317 to your computer and use it in GitHub Desktop.
size_t
Recv()
{
char* buffer;
size_t length, l, i;
ssize_t n;
length = 512;
buffer = malloc(length);
peek: n = recv(socket, buffer, length, MSG_PEEK);
if (n < 0) {
switch (errno) {
case EINTR: goto peek;
default: syslog(LOG_ERR, "Peek failed: %m");
}
}
for (i = 0, l = n - 1; i <= l; i++) {
if (i == l && l < length) break;
if (i == l) goto kill;
if (buffer[i] == '\r') { i++;
if (buffer[i] != '\n') goto kill;
goto read;
}
}
goto peek;
read: n = recv(socket, buffer, length = i + 1, MSG_WAITALL);
if (n < 0) {
switch (errno) {
case EINTR: goto read;
default: syslog(LOG_ERR, "Read failed: %m");
}
}
kill:
close(socket);
return length;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment