• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 
5 #include <errno.h>
6 #include <unistd.h>
7 
r(char * buf,size_t buf_size)8 static size_t r(char* buf, size_t buf_size) {
9   ssize_t read_count;
10   do
11     read_count = read(0, buf, buf_size);
12   while (read_count < 0 && errno == EINTR);
13   if (read_count <= 0)
14     abort();
15   return (size_t)read_count;
16 }
17 
w(const char * buf,size_t count)18 static void w(const char* buf, size_t count) {
19   const char* end = buf + count;
20 
21   while (buf < end) {
22     ssize_t write_count;
23     do
24       write_count = write(1, buf, count);
25     while (write_count < 0 && errno == EINTR);
26     if (write_count <= 0)
27       abort();
28     buf += write_count;
29   }
30 
31   fprintf(stderr, "%zu", count);
32   fflush(stderr);
33 }
34 
main(void)35 int main(void) {
36   w("0", 1);
37 
38   while (1) {
39     char buf[256];
40     size_t read_count = r(buf, sizeof(buf));
41     // The JS part (test-child-process-stdio-overlapped.js) only writes the
42     // "exit" string when the buffer is empty, so the read is guaranteed to be
43     // atomic due to it being less than PIPE_BUF.
44     if (!strncmp(buf, "exit", read_count)) {
45       break;
46     }
47     w(buf, read_count);
48   }
49 
50   return 0;
51 }
52