summaryrefslogtreecommitdiff
path: root/src/netops.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-06-24 16:25:26 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2011-06-27 02:09:49 +0200
commitea7a5452f40147a510ae8d9e5805d9252e7ddef9 (patch)
tree0c0930203a29364b4969640948ef2905d8ab7e2e /src/netops.c
parentce90a407c7b873780456b182d82d3ba26adbd182 (diff)
downloadlibgit2-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.c47
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;