Allow a parent to set up a child's fd's via a new system call
[akaros.git] / tests / childfdmap.c
1 #define _LARGEFILE64_SOURCE /* needed to use lseek64 */
2
3 #include <stdio.h> 
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <arch/arch.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <dirent.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <ros/syscall.h>
14 #include <parlib.h>
15
16 /* Test the childfdmap system call.
17  * Create a pipe, start the spawn, dup the pipes over fd 0 and 1, write
18  * to it, see that you get the same back.
19  */
20 char filename[512];
21 int main(int argc, char *argv[]) 
22
23         struct childfdmap childfdmap[3];
24         int ret;
25         int flag = 0;
26         int kid;
27         int in[2], out[2];
28         char hi[3];
29         if (pipe(in) < 0) {
30                 perror("pipe");
31                 exit(1);
32         }
33         if (pipe(out) < 0) {
34                 perror("2nd pipe");
35                 exit(1);
36         }
37         printf("pipe(in) [%d, %d]; pipe(out)[%d, %d]\n", in[0], in[1], out[0], out[1]);
38         childfdmap[0].parentfd = in[0];
39         childfdmap[0].childfd = in[1];
40         childfdmap[1].parentfd = out[0];
41         childfdmap[1].childfd = out[1];
42
43         sprintf(filename, "/bin/%s", argv[0]);
44         kid = sys_proc_create(filename, strlen(filename), NULL, NULL, 0);
45         if (kid < 0) {
46                 perror("create failed");
47                 exit(1);
48         }
49
50         ret = syscall(65536, kid, childfdmap, 2);
51         if (ret < 0) {
52                 perror("childfdmap faled");
53                 exit(2);
54         }
55
56
57         sys_proc_run(kid);
58         if (write(childfdmap[0].parentfd, "HI", 2) < 2) {
59                 perror("write HI");
60                 exit(3);
61         }
62
63         if (read(childfdmap[1].parentfd, hi, 2) < 2) {
64                 perror("read HI");
65                 exit(4);
66         }
67
68         return 0;
69 }