]> git.ozlabs.org Git - ccan-lca-2011.git/commitdiff
lca2011: The initial server.
authorRusty Russell <rusty@rustcorp.com.au>
Sun, 23 Jan 2011 12:04:10 +0000 (22:34 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Sun, 23 Jan 2011 12:04:10 +0000 (22:34 +1030)
Actually written as a CCAN module (ie. library).

ccan/oserver/oserver.c [new file with mode: 0644]
ccan/oserver/oserver.h [new file with mode: 0644]

diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c
new file mode 100644 (file)
index 0000000..5a40ff9
--- /dev/null
@@ -0,0 +1,61 @@
+#include <ccan/oserver/oserver.h>
+#include <ccan/read_write_all/read_write_all.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <err.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+void oserver_serve(int fd)
+{
+       char buf[1024];
+       unsigned int i;
+
+       for (i = 0; i < sizeof(buf)-1; i++) {
+               if (read(fd, &buf[i], 1) != 1)
+                       errx(1, "Client disconnected");
+               if (buf[i] == '\n' || buf[i] == '\r')
+                       break;
+               buf[i] = toupper(buf[i]);
+       }
+       buf[i] = '\0';
+
+       if (!write_all(fd, "Louder, like this: '",
+                      strlen("Louder, like this: '"))
+           || !write_all(fd, buf, i)
+           || !write_all(fd, "'\r\n", strlen("'\r\n")))
+               err(1, "Write failed");
+       exit(0);
+}
+
+int oserver_setup(void)
+{
+       int sockfd;
+       int one = 1;
+       union {
+               struct sockaddr addr;
+               struct sockaddr_in in;
+       } u;
+
+       sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+       if (sockfd < 0)
+               err(1, "Creating TCP socket");
+
+       if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
+               warn("Setting socket reuse");
+
+       u.in.sin_family = AF_INET;
+       u.in.sin_port = htons(OSERVER_PORT);
+       u.in.sin_addr.s_addr = INADDR_ANY;
+       if (bind(sockfd, &u.addr, sizeof(u.in)) == -1)
+               err(1, "Binding TCP socket");
+
+       if (listen(sockfd, 0) != 0)
+               err(1, "Listening on TCP socket");
+       return sockfd;
+}
diff --git a/ccan/oserver/oserver.h b/ccan/oserver/oserver.h
new file mode 100644 (file)
index 0000000..fa214b4
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef CCAN_OSERVER_H
+#define CCAN_OSERVER_H
+#include <ccan/compiler/compiler.h>
+
+void NORETURN oserver_serve(int fd);
+int oserver_setup(void);
+
+#define OSERVER_PORT 2727
+#endif /* CCAN_OSERVER_H */