summaryrefslogtreecommitdiffstats
path: root/nserver/src/nserve.c
diff options
context:
space:
mode:
Diffstat (limited to 'nserver/src/nserve.c')
-rw-r--r--nserver/src/nserve.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/nserver/src/nserve.c b/nserver/src/nserve.c
new file mode 100644
index 0000000..3d27c19
--- /dev/null
+++ b/nserver/src/nserve.c
@@ -0,0 +1,59 @@
+#include <nserve.h>
+
+int slurpsock(char *buf, size_t buf_sz, int sock)
+{
+ ssize_t bytes;
+
+ bytes = recv(sock, buf, buf_sz, 0);
+ check(bytes >= 0, "Failed to read from socket: %d", sock);
+
+ return bytes;
+
+ error:
+ return -1;
+}
+
+int barfsock(char *buf, size_t buf_sz, int sock)
+{
+ ssize_t bytes = 0;
+
+ bytes = send(sock, buf, buf_sz, 0);
+ check(bytes >= 0, "barfsock: send failed");
+
+ return bytes;
+ error:
+ return -1;
+}
+
+void nserve(int sock)
+{
+ size_t buf_sz = 200;
+ char *buf = calloc(sizeof(char), buf_sz);
+ check_mem(buf);
+
+ // Read command from socket.
+ ssize_t bytes = slurpsock(buf, buf_sz, sock);
+ check(bytes >= 0, "nserve: slurpsock failed");
+
+ // Write response to socket.
+ int rc = barfsock(buf, bytes, sock);
+ check(rc != -1, "nserve: echo failed");
+
+ // Close socket.
+ rc = close(sock);
+ check(rc == 0, "nserve: close failed");
+
+ // Cleanup.
+ free(buf)
+
+ exit(0);
+ error:
+ rc = close(sock);
+ check(rc == 0, "nserve: close failed");
+
+ // Cleanup if needed.
+ if (buf)
+ free(buf);
+
+ exit(1);
+}