]> git.ozlabs.org Git - ccan/blob - ccan/read_write_all/test/run-read_all.c
Mark unused arguments in many modules.
[ccan] / ccan / read_write_all / test / run-read_all.c
1 /* FIXME: Do something tricky to ensure we really do loop in read_all. */
2
3 #include <ccan/read_write_all/read_write_all.h>
4 #include <ccan/read_write_all/read_write_all.c>
5 #include <ccan/tap/tap.h>
6 #include <unistd.h>
7 #include <sys/types.h>
8 #include <signal.h>
9 #include <sys/wait.h>
10 #include <limits.h>
11 #include <err.h>
12 #include <stdlib.h>
13 #include <string.h>
14
15 static volatile int sigcount;
16 static int p2c[2], c2p[2];
17 static void got_signal(int sig)
18 {
19         char c = 0;
20         (void)sig;
21         if (write(p2c[1], &c, 1) == 1)
22                 sigcount++;
23 }
24
25 /* < PIPE_BUF *will* be atomic.  But > PIPE_BUF only *might* be non-atomic. */
26 #define BUFSZ (1024*1024)
27
28 int main(void)
29 {
30         char *buffer;
31         char c = 0;
32         int status;
33         pid_t child;
34
35         buffer = calloc(BUFSZ, 2);
36         plan_tests(6);
37
38         /* We fork and torture parent. */
39         if (pipe(p2c) != 0 || pipe(c2p) != 0)
40                 err(1, "pipe");
41         child = fork();
42
43         if (!child) {
44                 close(p2c[1]);
45                 close(c2p[0]);
46                 /* Child.  Make sure parent ready, then write in two parts. */
47                 if (read(p2c[0], &c, 1) != 1)
48                         exit(1);
49                 memset(buffer, 0xff, BUFSZ*2);
50                 if (!write_all(c2p[1], buffer, BUFSZ))
51                         exit(2);
52                 if (kill(getppid(), SIGUSR1) != 0)
53                         exit(3);
54                 /* Make sure they get signal. */
55                 if (read(p2c[0], &c, 1) != 1)
56                         exit(4);
57                 if (write(c2p[1], buffer, BUFSZ) != BUFSZ)
58                         exit(5);
59                 exit(0);
60         }
61         if (child == -1)
62                 err(1, "forking");
63
64         close(p2c[0]);
65         close(c2p[1]);
66         signal(SIGUSR1, got_signal);
67         ok1(write(p2c[1], &c, 1) == 1);
68         ok1(read_all(c2p[0], buffer, BUFSZ*2));
69         ok1(memchr(buffer, 0, BUFSZ*2) == NULL);
70         ok1(sigcount == 1);
71         ok1(wait(&status) == child);
72         ok(WIFEXITED(status) && WEXITSTATUS(status) == 0,
73            "WIFEXITED(status) = %u, WEXITSTATUS(status) = %u",
74            WIFEXITED(status), WEXITSTATUS(status));
75         free(buffer);
76         return exit_status();
77 }