From 0b1cb00c4391dee4d633f92c5c42c7a0d4ff4861 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 21 Jan 2011 14:10:45 +1030 Subject: [PATCH] lca2011: simpler testing by not having oserver_serve exit. This makes it easier to test error paths, too. --- ccan/oserver/_info | 5 +++-- ccan/oserver/oserver.c | 13 ++++++++----- ccan/oserver/oserver.h | 8 ++++---- ccan/oserver/test/run.c | 11 ++--------- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/ccan/oserver/_info b/ccan/oserver/_info index a05fa03..b906502 100644 --- a/ccan/oserver/_info +++ b/ccan/oserver/_info @@ -25,7 +25,9 @@ * if (fd < 0) * err(1, "Accepting connection on TCP socket"); * - * oserver_serve(fd); + * if (!oserver_serve(fd)) + * err(1, "Serving client"); + * exit(0); * } */ int main(int argc, char *argv[]) @@ -35,7 +37,6 @@ int main(int argc, char *argv[]) return 1; if (strcmp(argv[1], "depends") == 0) { - printf("ccan/compiler\n"); printf("ccan/read_write_all\n"); printf("ccan/str\n"); printf("ccan/foreach\n"); diff --git a/ccan/oserver/oserver.c b/ccan/oserver/oserver.c index 5a40ff9..5f120cb 100644 --- a/ccan/oserver/oserver.c +++ b/ccan/oserver/oserver.c @@ -10,15 +10,18 @@ #include #include #include +#include -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 +32,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) diff --git a/ccan/oserver/oserver.h b/ccan/oserver/oserver.h index bf2b0ea..d727560 100644 --- a/ccan/oserver/oserver.h +++ b/ccan/oserver/oserver.h @@ -1,6 +1,6 @@ #ifndef CCAN_OSERVER_H #define CCAN_OSERVER_H -#include +#include /** * oserver_setup - get a listening filedescriptor for an oserver @@ -21,7 +21,7 @@ int oserver_setup(void); * oserver_serve - serve an oserver client via a file descriptor * @fd: the file descriptor (usually a connected socket) * - * This does not return, but exits with status 0 if served OK. + * This returns false (with errno set) on failure. * * Example: * #include @@ -33,11 +33,11 @@ int oserver_setup(void); * if (clientfd < 0) * err(1, "Accepting connection from client"); * if (fork() == 0) - * oserver_serve(clientfd); + * exit(oserver_serve(clientfd) ? 0 : 1); * else * close(clientfd); */ -void NORETURN oserver_serve(int fd); +bool oserver_serve(int fd); #define OSERVER_PORT 2727 #endif /* CCAN_OSERVER_H */ diff --git a/ccan/oserver/test/run.c b/ccan/oserver/test/run.c index dc6031b..ee3959e 100644 --- a/ccan/oserver/test/run.c +++ b/ccan/oserver/test/run.c @@ -12,12 +12,11 @@ int main(void) { int fd; - int status; char buf[200]; const char *input; /* This is how many tests you plan to run */ - plan_tests(4 * 6); + plan_tests(3 * 6); foreach_ptr(input, "This is a test\n", @@ -31,13 +30,7 @@ int main(void) write(fd, input, strlen(input)); lseek(fd, 0, SEEK_SET); - if (fork() == 0) - oserver_serve(fd); - - wait(&status); - - ok1(WIFEXITED(status)); - ok1(WEXITSTATUS(status) == 0); + ok1(oserver_serve(fd)); lseek(fd, 0, SEEK_SET); buf[read(fd, buf, sizeof(buf)-1)] = '\0'; -- 2.39.2