From: Rusty Russell Date: Sun, 23 Jan 2011 12:04:10 +0000 (+1030) Subject: lca2011: The initial server. X-Git-Url: http://git.ozlabs.org/?p=ccan-lca-2011.git;a=commitdiff_plain;h=75020f977fecd26610845171aaba4f9accc75c6e lca2011: The initial server. Actually written as a CCAN module (ie. library). --- diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c new file mode 100644 index 0000000..5a40ff9 --- /dev/null +++ b/ccan/oserver/oserver.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 index 0000000..fa214b4 --- /dev/null +++ b/ccan/oserver/oserver.h @@ -0,0 +1,9 @@ +#ifndef CCAN_OSERVER_H +#define CCAN_OSERVER_H +#include + +void NORETURN oserver_serve(int fd); +int oserver_setup(void); + +#define OSERVER_PORT 2727 +#endif /* CCAN_OSERVER_H */