1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4
5 static int
do_test(void)6 do_test (void)
7 {
8 int fd = dup (fileno (stdout));
9 if (fd <= 1)
10 {
11 puts ("dup failed");
12 return 1;
13 }
14
15 FILE *f1 = fdopen (fd, "w");
16 if (f1 == NULL)
17 {
18 printf ("fdopen failed: %m\n");
19 return 1;
20 }
21
22 fclose (stdout);
23
24 FILE *f2 = popen ("echo test1", "r");
25 if (f2 == NULL)
26 {
27 fprintf (f1, "1st popen failed: %m\n");
28 return 1;
29 }
30 FILE *f3 = popen ("echo test2", "r");
31 if (f2 == NULL || f3 == NULL)
32 {
33 fprintf (f1, "2nd popen failed: %m\n");
34 return 1;
35 }
36
37 char *line = NULL;
38 size_t len = 0;
39 int result = 0;
40 if (getline (&line, &len, f2) != 6)
41 {
42 fputs ("could not read line from 1st popen\n", f1);
43 result = 1;
44 }
45 else if (strcmp (line, "test1\n") != 0)
46 {
47 fprintf (f1, "read \"%s\"\n", line);
48 result = 1;
49 }
50
51 if (getline (&line, &len, f2) != -1)
52 {
53 fputs ("second getline did not return -1\n", f1);
54 result = 1;
55 }
56
57 if (getline (&line, &len, f3) != 6)
58 {
59 fputs ("could not read line from 2nd popen\n", f1);
60 result = 1;
61 }
62 else if (strcmp (line, "test2\n") != 0)
63 {
64 fprintf (f1, "read \"%s\"\n", line);
65 result = 1;
66 }
67
68 if (getline (&line, &len, f3) != -1)
69 {
70 fputs ("second getline did not return -1\n", f1);
71 result = 1;
72 }
73
74 int ret = pclose (f2);
75 if (ret != 0)
76 {
77 fprintf (f1, "1st pclose returned %d\n", ret);
78 result = 1;
79 }
80
81 ret = pclose (f3);
82 if (ret != 0)
83 {
84 fprintf (f1, "2nd pclose returned %d\n", ret);
85 result = 1;
86 }
87
88 return result;
89 }
90
91 #define TEST_FUNCTION do_test ()
92 #include "../test-skeleton.c"
93