]> git.ozlabs.org Git - ccan-lca-2011.git/blobdiff - ccan/oserver/oserver.c
lca2011: add option parsing using ccan/opt.
[ccan-lca-2011.git] / ccan / oserver / oserver.c
index 5f120cbf2bd4342a3ae34cc7ee8a57e74ebc16fa..20edfcbc19a79c846d3e2f31d834eebccd64fced 100644 (file)
@@ -1,5 +1,7 @@
 #include <ccan/oserver/oserver.h>
 #include <ccan/read_write_all/read_write_all.h>
+#include <ccan/opt/opt.h>
+#include <ccan/noerr/noerr.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -36,7 +38,7 @@ bool oserver_serve(int fd)
        return true;
 }
 
-int oserver_setup(void)
+int oserver_setup(unsigned short port)
 {
        int sockfd;
        int one = 1;
@@ -47,18 +49,22 @@ 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");
 
        u.in.sin_family = AF_INET;
-       u.in.sin_port = htons(OSERVER_PORT);
+       u.in.sin_port = htons(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;
 }