1 /*
2 #notarget: cris*-*-elf
3 #output: got: a\nthen: bc\nexit: 0\n
4 */
5 
6 /* This is a very limited subset of what ex1.c does; we just check that
7    thread creation (clone syscall) and pipe writes and reads work. */
8 
9 #include <stddef.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13 #include <sched.h>
14 #include <signal.h>
15 #include <sys/types.h>
16 #include <sys/wait.h>
17 
18 int pip[2];
19 
20 int
process(void * arg)21 process (void *arg)
22 {
23   char *s = arg;
24   if (write (pip[1], s+2, 1) != 1) abort ();
25   if (write (pip[1], s+1, 1) != 1) abort ();
26   if (write (pip[1], s, 1) != 1) abort ();
27   return 0;
28 }
29 
30 int
main(void)31 main (void)
32 {
33   int retcode;
34   int pid;
35   int st;
36   long stack[16384];
37   char buf[10] = {0};
38 
39   retcode = pipe (pip);
40 
41   if (retcode != 0)
42     {
43       fprintf (stderr, "Bad pipe %d\n", retcode);
44       abort ();
45     }
46 
47   pid = clone (process, (char *) stack + sizeof (stack) - 64,
48 	       (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)
49 	       | SIGCHLD, "cba");
50   if (pid <= 0)
51     {
52       fprintf (stderr, "Bad clone %d\n", pid);
53       abort ();
54     }
55 
56   if ((retcode = read (pip[0], buf, 1)) != 1)
57     {
58       fprintf (stderr, "Bad read 1: %d\n", retcode);
59       abort ();
60     }
61   printf ("got: %c\n", buf[0]);
62   retcode = read (pip[0], buf, 2);
63   if (retcode == 1)
64     {
65       retcode = read (pip[0], buf+1, 1);
66       if (retcode != 1)
67 	{
68 	  fprintf (stderr, "Bad read 1.5: %d\n", retcode);
69 	  abort ();
70 	}
71       retcode = 2;
72     }
73   if (retcode != 2)
74     {
75       fprintf (stderr, "Bad read 2: %d\n", retcode);
76       abort ();
77     }
78 
79   printf ("then: %s\n", buf);
80   retcode = wait4 (-1, &st, WNOHANG | __WCLONE, NULL);
81 
82   if (retcode != pid || !WIFEXITED (st))
83     {
84       fprintf (stderr, "Bad wait %d %x\n", retcode, st);
85       abort ();
86     }
87 
88   printf ("exit: %d\n", WEXITSTATUS (st));
89   return 0;
90 }
91