#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]);
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)
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_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;
}