1 /* Check that TRT happens for pipe corner cases.
2 #notarget: cris*-*-elf
3 */
4 #include <stddef.h>
5 #include <signal.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <limits.h>
11 
err(const char * s)12 void err (const char *s)
13 {
14   perror (s);
15   abort ();
16 }
17 
main(void)18 int main (void)
19 {
20   int pip[2];
21   char c;
22   int pipemax;
23 
24   if (pipe (pip) != 0)
25     err ("pipe");
26 
27 #ifdef PIPE_MAX
28   pipemax = PIPE_MAX;
29 #else
30   pipemax = fpathconf (pip[1], _PC_PIPE_BUF);
31 #endif
32 
33   if (pipemax <= 0)
34     {
35       fprintf (stderr, "Bad pipemax %d\n", pipemax);
36       abort ();
37     }
38 
39   /* Writing to wrong end of pipe.  */
40   if (write (pip[0], "argh", 1) != -1
41       || errno != EBADF)
42     err ("write pipe");
43 
44   errno = 0;
45 
46   /* Reading from wrong end of pipe.  */
47   if (read (pip[1], &c, 1) != -1
48       || errno != EBADF)
49     err ("write pipe");
50 
51   errno = 0;
52 
53   if (close (pip[0]) != 0)
54     err ("close");
55 
56   if (signal (SIGPIPE, SIG_IGN) != SIG_DFL)
57     err ("signal");
58 
59   /* Writing to pipe with closed read end.  */
60   if (write (pip[1], "argh", 1) != -1
61       || errno != EPIPE)
62     err ("write closed");
63 
64   printf ("pass\n");
65   exit (0);
66 }
67