Add gitno_buffer as a recv wrapper Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
diff --git a/src/netops.c b/src/netops.c
index 532d0d3..6c164a9 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;
diff --git a/src/netops.h b/src/netops.h
index 620fb12..9c52798 100644
--- a/src/netops.h
+++ b/src/netops.h
@@ -4,6 +4,18 @@
#ifndef INCLUDE_netops_h__
#define INCLUDE_netops_h__
+typedef struct gitno_buffer {
+ void *data;
+ unsigned int len;
+ unsigned int offset;
+ int fd;
+} gitno_buffer;
+
+void gitno_buffer_setup(gitno_buffer *buf, void *data, unsigned int len, int fd);
+int gitno_recv(gitno_buffer *buf);
+void gitno_consume(gitno_buffer *buf, void *ptr);
+void gitno_consume_n(gitno_buffer *buf, unsigned int cons);
+
int gitno_connect(const char *host, const char *port);
int gitno_send(int s, const char *msg, int len, int flags);