diff options
| author | Carlos Martín Nieto <carlos@cmartin.tk> | 2011-06-24 16:25:26 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <carlos@cmartin.tk> | 2011-06-27 02:09:49 +0200 |
| commit | ea7a5452f40147a510ae8d9e5805d9252e7ddef9 (patch) | |
| tree | 0c0930203a29364b4969640948ef2905d8ab7e2e /src/netops.c | |
| parent | ce90a407c7b873780456b182d82d3ba26adbd182 (diff) | |
| download | libgit2-ea7a5452f40147a510ae8d9e5805d9252e7ddef9.tar.gz | |
Add gitno_buffer as a recv wrapper
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Diffstat (limited to 'src/netops.c')
| -rw-r--r-- | src/netops.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/netops.c b/src/netops.c index 532d0d3d0..6c164a960 100644 --- a/src/netops.c +++ b/src/netops.c @@ -38,6 +38,53 @@ #include "common.h" #include "netops.h" +void gitno_buffer_setup(gitno_buffer *buf, void*data, unsigned int len, int fd) +{ + memset(buf, 0x0, sizeof(gitno_buffer)); + memset(data, 0x0, len); + buf->data = data; + buf->len = len - 1; + buf->offset = 0; + buf->fd = fd; +} + +int gitno_recv(gitno_buffer *buf) +{ + int ret; + + ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0); + if (ret < 0) + return git__throw(GIT_EOSERR, "Failed to receive data"); + if (ret == 0) /* Orderly shutdown, so exit */ + return GIT_SUCCESS; + + buf->offset += ret; + + return ret; +} + +/* Consume up to ptr and move the rest of the buffer to the beginning */ +void gitno_consume(gitno_buffer *buf, void *ptr) +{ + int left; + + assert(ptr - buf->data <= (int) buf->len); + + left = buf->len - (ptr - buf->data); + + memmove(buf->data, ptr, left); + memset(ptr, 0x0, left); + buf->offset = left; +} + +/* Consume const bytes and move the rest of the buffer to the beginning */ +void gitno_consume_n(gitno_buffer *buf, unsigned int cons) +{ + memmove(buf->data, buf->data + cons, buf->len - buf->offset); + memset(buf->data + cons, 0x0, buf->len - buf->offset); + buf->offset -= cons; +} + int gitno_connect(const char *host, const char *port) { struct addrinfo *info, *p; |
