Start of client/server

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/server.c b/server.c
new file mode 100644
index 0000000..bd49b9c
--- /dev/null
+++ b/server.c
@@ -0,0 +1,108 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <getopt.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/poll.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <signal.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include "fio.h"
+
+static int net_port = 8765;
+
+static int accept_loop(int listen_sk)
+{
+	struct sockaddr addr;
+	unsigned int len = sizeof(addr);
+	int sk;
+
+again:
+	sk = accept(listen_sk, &addr, &len);
+	printf("got a hit\n");
+	if (sk < 0) {
+		log_err("fio: accept failed\n");
+		return -1;
+	}
+
+	/* read forever */
+	for (;;) {
+		char buf[131072];
+		int ret;
+
+		ret = recv(sk, buf, 4096, 0);
+		if (ret > 0) {
+			parse_jobs_ini(buf, 1, 0);
+			exec_run();
+			reset_fio_state();
+			break;
+		} else if (!ret)
+			break;
+		if (errno == EAGAIN || errno == EINTR)
+			continue;
+		break;
+	}
+
+	close(sk);
+	printf("closed\n");
+	goto again;
+}
+
+int fio_server(void)
+{
+	struct sockaddr_in saddr_in;
+	struct sockaddr addr;
+	unsigned int len;
+	int sk, opt;
+
+	sk = socket(AF_INET, SOCK_STREAM, 0);
+	if (sk < 0) {
+		log_err("fio: socket\n");
+		return -1;
+	}
+
+	opt = 1;
+	if (setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
+		log_err("fio: setsockopt\n");
+		return -1;
+	}
+#ifdef SO_REUSEPORT
+	if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
+		td_verror(td, errno, "setsockopt");
+		return 1;
+	}
+#endif
+
+	saddr_in.sin_family = AF_INET;
+	saddr_in.sin_addr.s_addr = htonl(INADDR_ANY);
+	saddr_in.sin_port = htons(net_port);
+
+	if (bind(sk, (struct sockaddr *) &saddr_in, sizeof(saddr_in)) < 0) {
+		perror("bind");
+		log_err("fio: bind\n");
+		return -1;
+	}
+
+	if (listen(sk, 1) < 0) {
+		log_err("fio: listen\n");
+		return -1;
+	}
+
+	len = sizeof(addr);
+	if (getsockname(sk, &addr, &len) < 0) {
+		log_err("fio: getsockname");
+		return -1;
+	}
+
+	return accept_loop(sk);
+}