]> git.ozlabs.org Git - ccan-lca-2011.git/blob - ccan/oserver/oserver.c
5f120cbf2bd4342a3ae34cc7ee8a57e74ebc16fa
[ccan-lca-2011.git] / ccan / oserver / oserver.c
1 #include <ccan/oserver/oserver.h>
2 #include <ccan/read_write_all/read_write_all.h>
3 #include <sys/types.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6 #include <netinet/tcp.h>
7 #include <err.h>
8 #include <stdio.h>
9 #include <unistd.h>
10 #include <ctype.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <errno.h>
14
15 bool oserver_serve(int fd)
16 {
17         char buf[1024];
18         unsigned int i;
19
20         for (i = 0; i < sizeof(buf)-1; i++) {
21                 if (read(fd, &buf[i], 1) != 1) {
22                         errno = EIO;
23                         return false;
24                 }
25                 if (buf[i] == '\n' || buf[i] == '\r')
26                         break;
27                 buf[i] = toupper(buf[i]);
28         }
29         buf[i] = '\0';
30
31         if (!write_all(fd, "Louder, like this: '",
32                        strlen("Louder, like this: '"))
33             || !write_all(fd, buf, i)
34             || !write_all(fd, "'\r\n", strlen("'\r\n")))
35                 return false;
36         return true;
37 }
38
39 int oserver_setup(void)
40 {
41         int sockfd;
42         int one = 1;
43         union {
44                 struct sockaddr addr;
45                 struct sockaddr_in in;
46         } u;
47
48         sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
49         if (sockfd < 0)
50                 err(1, "Creating TCP socket");
51
52         if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
53                 warn("Setting socket reuse");
54
55         u.in.sin_family = AF_INET;
56         u.in.sin_port = htons(OSERVER_PORT);
57         u.in.sin_addr.s_addr = INADDR_ANY;
58         if (bind(sockfd, &u.addr, sizeof(u.in)) == -1)
59                 err(1, "Binding TCP socket");
60
61         if (listen(sockfd, 0) != 0)
62                 err(1, "Listening on TCP socket");
63         return sockfd;
64 }