]> git.ozlabs.org Git - ccan-lca-2011.git/blobdiff - ccan/oserver/oserver.c
lca2011: simpler testing by not having oserver_setup exit.
[ccan-lca-2011.git] / ccan / oserver / oserver.c
index 5a40ff98cce90c8c96908da83ff497d1bed921d1..b7495f307f6f552b93246d9975af2eefdd74cb27 100644 (file)
@@ -1,5 +1,6 @@
 #include <ccan/oserver/oserver.h>
 #include <ccan/read_write_all/read_write_all.h>
+#include <ccan/noerr/noerr.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
-void oserver_serve(int fd)
+bool 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 (read(fd, &buf[i], 1) != 1) {
+                       errno = EIO;
+                       return false;
+               }
                if (buf[i] == '\n' || buf[i] == '\r')
                        break;
                buf[i] = toupper(buf[i]);
@@ -29,8 +33,8 @@ void oserver_serve(int fd)
                       strlen("Louder, like this: '"))
            || !write_all(fd, buf, i)
            || !write_all(fd, "'\r\n", strlen("'\r\n")))
-               err(1, "Write failed");
-       exit(0);
+               return false;
+       return true;
 }
 
 int oserver_setup(void)
@@ -44,7 +48,7 @@ int oserver_setup(void)
 
        sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sockfd < 0)
-               err(1, "Creating TCP socket");
+               return -1;
 
        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)))
                warn("Setting socket reuse");
@@ -52,10 +56,14 @@ int oserver_setup(void)
        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 (bind(sockfd, &u.addr, sizeof(u.in)) == -1) {
+               close_noerr(sockfd);
+               return -1;
+       }
 
-       if (listen(sockfd, 0) != 0)
-               err(1, "Listening on TCP socket");
+       if (listen(sockfd, 0) != 0) {
+               close_noerr(sockfd);
+               return -1;
+       }
        return sockfd;
 }