X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fread_write_all%2Ftest%2Frun-write_all.c;h=6dbd9c29f92f1ad6358db75a4e12976c63c560aa;hp=fbfa1f99aebcbca18b37fe580fa05b3a388ff432;hb=57d7208e55ede91db60bbedc52a4d73f05fff543;hpb=75e8c217ba64a66ac94719c597e6cf81a5625cc8;ds=sidebyside diff --git a/ccan/read_write_all/test/run-write_all.c b/ccan/read_write_all/test/run-write_all.c index fbfa1f99..6dbd9c29 100644 --- a/ccan/read_write_all/test/run-write_all.c +++ b/ccan/read_write_all/test/run-write_all.c @@ -1,8 +1,5 @@ -/* FIXME: Do something tricky to ensure we really do loop in write_all. */ - -#include "read_write_all/read_write_all.h" -#include "read_write_all/read_write_all.c" -#include "tap/tap.h" +#include +#include #include #include #include @@ -13,54 +10,58 @@ #include #include -static volatile int sigcount; -static void got_signal(int sig) +static ssize_t test_write(int fd, const void *buf, size_t count); +#define write test_write +#include +#undef write + +static ssize_t write_return; + +static ssize_t test_write(int fd, const void *buf, size_t count) { - sigcount++; + if (write_return == 0) { + errno = ENOSPC; + return 0; + } + + if (write_return < 0) { + errno = -write_return; + /* Don't return EINTR more than once! */ + if (errno == EINTR) + write_return = count; + return -1; + } + + if (write_return < count) + return write_return; + return count; } -/* < PIPE_BUF *will* be atomic. But > PIPE_BUF only *might* be non-atomic. */ -#define BUFSZ (1024*1024) +#define BUFSZ 1024 int main(int argc, char *argv[]) { - char buffer[BUFSZ*2] = { 0 }; - int p2c[2]; - int status; - pid_t child; + char *buffer; - plan_tests(4); + buffer = malloc(BUFSZ); + plan_tests(8); - /* We fork and torture parent. */ - if (pipe(p2c) != 0) - err(1, "pipe"); - child = fork(); + write_return = -ENOSPC; + ok1(!write_all(100, buffer, BUFSZ)); + ok1(errno == ENOSPC); - if (!child) { - /* Make sure they started writing. */ - if (read(p2c[0], buffer, 1) != 1) - exit(1); - if (kill(getppid(), SIGUSR1) != 0) - exit(2); - if (!read_all(p2c[0], buffer+1, sizeof(buffer)-1)) - exit(3); - if (memchr(buffer, 0, sizeof(buffer))) { - fprintf(stderr, "buffer has 0 at offset %i\n", - memchr(buffer, 0, sizeof(buffer)) - (void *)buffer); - exit(4); - } - exit(0); - } - if (child == -1) - err(1, "forking"); + write_return = -EINTR; + ok1(write_all(100, buffer, BUFSZ)); + ok1(errno == EINTR); + + write_return = 1; + errno = 0; + ok1(write_all(100, buffer, BUFSZ)); + ok1(errno == 0); + + write_return = BUFSZ; + ok1(write_all(100, buffer, BUFSZ)); + ok1(errno == 0); - memset(buffer, 0xff, sizeof(buffer)); - signal(SIGUSR1, got_signal); - ok1(write_all(p2c[1], buffer, sizeof(buffer))); - ok1(sigcount == 1); - ok1(wait(&status) == child); - ok(WIFEXITED(status) && WEXITSTATUS(status) == 0, - "WIFEXITED(status) = %u, WEXITSTATUS(status) = %u", - WIFEXITED(status), WEXITSTATUS(status)); return exit_status(); }