diff --git a/.gitignore b/.gitignore index ebfb1b74b..33988db56 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ gen_* daemon/lightning-cli check-bolt coverage +ccan/config.h diff --git a/ccan/ccan/io/test/run-21-io_close_taken_fd.c b/ccan/ccan/io/test/run-21-io_close_taken_fd.c new file mode 100644 index 000000000..5529db098 --- /dev/null +++ b/ccan/ccan/io/test/run-21-io_close_taken_fd.c @@ -0,0 +1,93 @@ +#include +/* Include the C files directly. */ +#include +#include +#include +#include +#include + +#define PORT "65021" + +static struct io_listener *l; + +static struct io_plan *steal_fd(struct io_conn *conn, int *fd) +{ + io_close_listener(l); + *fd = io_conn_fd(conn); + return io_close_taken_fd(conn); +} + +static int make_listen_fd(const char *port, struct addrinfo **info) +{ + int fd, on = 1; + struct addrinfo *addrinfo, hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + hints.ai_protocol = 0; + + if (getaddrinfo(NULL, port, &hints, &addrinfo) != 0) + return -1; + + fd = socket(addrinfo->ai_family, addrinfo->ai_socktype, + addrinfo->ai_protocol); + if (fd < 0) + return -1; + + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + if (bind(fd, addrinfo->ai_addr, addrinfo->ai_addrlen) != 0) { + close(fd); + return -1; + } + if (listen(fd, 1) != 0) { + close(fd); + return -1; + } + *info = addrinfo; + return fd; +} + +int main(void) +{ + struct addrinfo *addrinfo = NULL; + int i, fd, in_fd, status; + char buf[strlen("hellothere")]; + + /* This is how many tests you plan to run */ + plan_tests(15); + fd = make_listen_fd(PORT, &addrinfo); + l = io_new_listener(NULL, fd, steal_fd, &in_fd); + fflush(stdout); + if (!fork()) { + io_close_listener(l); + fd = socket(addrinfo->ai_family, addrinfo->ai_socktype, + addrinfo->ai_protocol); + if (fd < 0) + exit(1); + if (connect(fd, addrinfo->ai_addr, addrinfo->ai_addrlen) != 0) + exit(2); + signal(SIGPIPE, SIG_IGN); + for (i = 0; i < strlen("hellothere"); i++) { + if (write(fd, "hellothere" + i, 1) != 1) + break; + } + close(fd); + freeaddrinfo(addrinfo); + exit(0); + } + freeaddrinfo(addrinfo); + ok1(io_loop(NULL, NULL) == NULL); + + for (i = 0; i < strlen("hellothere"); i++) + ok1(read(in_fd, buf + i, 1) == 1); + + ok1(memcmp(buf, "hellothere", sizeof(buf)) == 0); + ok1(wait(&status)); + ok1(WIFEXITED(status)); + ok1(WEXITSTATUS(status) == 0); + + /* This exits depending on whether all tests passed */ + return exit_status(); +} diff --git a/ccan/ccan/io/test/run-22-POLLHUP-on-listening-socket.c b/ccan/ccan/io/test/run-22-POLLHUP-on-listening-socket.c new file mode 100644 index 000000000..e3b6c4134 --- /dev/null +++ b/ccan/ccan/io/test/run-22-POLLHUP-on-listening-socket.c @@ -0,0 +1,61 @@ +#include +/* Include the C files directly. */ +#include +#include +#include +#include +#include + +#define PORT "65022" + +static int make_listen_fd(const char *port, struct addrinfo **info) +{ + int fd, on = 1; + struct addrinfo *addrinfo, hints; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + hints.ai_protocol = 0; + + if (getaddrinfo(NULL, port, &hints, &addrinfo) != 0) + return -1; + + fd = socket(addrinfo->ai_family, addrinfo->ai_socktype, + addrinfo->ai_protocol); + if (fd < 0) + return -1; + + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + if (bind(fd, addrinfo->ai_addr, addrinfo->ai_addrlen) != 0) { + close(fd); + return -1; + } + if (listen(fd, 1) != 0) { + close(fd); + return -1; + } + *info = addrinfo; + return fd; +} + +int main(void) +{ + struct addrinfo *addrinfo = NULL; + int fd; + + /* This is how many tests you plan to run */ + plan_tests(1); + fd = make_listen_fd(PORT, &addrinfo); + freeaddrinfo(addrinfo); + io_new_listener(NULL, fd, io_never, NULL); + + /* Anyone could do this; a child doing it will cause poll to return + * POLLHUP only! */ + shutdown(fd, SHUT_RDWR); + ok1(io_loop(NULL, NULL) == NULL); + + /* This exits depending on whether all tests passed */ + return exit_status(); +} diff --git a/ccan/ccan/str/test/compile_ok-STR_MAX_CHARS-static.c b/ccan/ccan/str/test/compile_ok-STR_MAX_CHARS-static.c new file mode 100644 index 000000000..bc6aff7a3 --- /dev/null +++ b/ccan/ccan/str/test/compile_ok-STR_MAX_CHARS-static.c @@ -0,0 +1,8 @@ +#include + +int main(void) +{ + static char str[STR_MAX_CHARS(int)]; + + return str[0] ? 0 : 1; +}