xref: /minix3/minix/tests/test10.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
1*433d6423SLionel Sambuc /* test 10 */
2*433d6423SLionel Sambuc 
3*433d6423SLionel Sambuc #include <sys/types.h>
4*433d6423SLionel Sambuc #include <sys/wait.h>
5*433d6423SLionel Sambuc #include <errno.h>
6*433d6423SLionel Sambuc #include <fcntl.h>
7*433d6423SLionel Sambuc #include <stdlib.h>
8*433d6423SLionel Sambuc #include <unistd.h>
9*433d6423SLionel Sambuc #include <stdio.h>
10*433d6423SLionel Sambuc 
11*433d6423SLionel Sambuc char *name[] = {"t10a", "t10b", "t10c", "t10d", "t10e", "t10f", "t10g",
12*433d6423SLionel Sambuc 						      "t10h", "t10i", "t10j"};
13*433d6423SLionel Sambuc 
14*433d6423SLionel Sambuc #define PROGBUF_LONGS 3000
15*433d6423SLionel Sambuc long prog[PROGBUF_LONGS];
16*433d6423SLionel Sambuc int psize;
17*433d6423SLionel Sambuc 
18*433d6423SLionel Sambuc int max_error = 2;
19*433d6423SLionel Sambuc #include "common.h"
20*433d6423SLionel Sambuc 
21*433d6423SLionel Sambuc 
22*433d6423SLionel Sambuc int main(void);
23*433d6423SLionel Sambuc void spawn(int n);
24*433d6423SLionel Sambuc void mkfiles(void);
25*433d6423SLionel Sambuc void cr_file(char *name, int size);
26*433d6423SLionel Sambuc void rmfiles(void);
27*433d6423SLionel Sambuc void quit(void);
28*433d6423SLionel Sambuc 
main()29*433d6423SLionel Sambuc int main()
30*433d6423SLionel Sambuc {
31*433d6423SLionel Sambuc   int i, n, pid, r;
32*433d6423SLionel Sambuc 
33*433d6423SLionel Sambuc   start(10);
34*433d6423SLionel Sambuc   system("cp ../t10a .");
35*433d6423SLionel Sambuc   pid = getpid();
36*433d6423SLionel Sambuc 
37*433d6423SLionel Sambuc   /* Create files t10b ... t10h */
38*433d6423SLionel Sambuc   mkfiles();
39*433d6423SLionel Sambuc 
40*433d6423SLionel Sambuc   if (getpid() == pid)
41*433d6423SLionel Sambuc 	if (fork() == 0) {
42*433d6423SLionel Sambuc 		execl("t10a", "t10a", (char *) 0);
43*433d6423SLionel Sambuc 		exit(0);
44*433d6423SLionel Sambuc 	}
45*433d6423SLionel Sambuc   if (getpid() == pid)
46*433d6423SLionel Sambuc 	if (fork() == 0) {
47*433d6423SLionel Sambuc 		execl("t10b", "t10b", (char *) 0);
48*433d6423SLionel Sambuc 		exit(0);
49*433d6423SLionel Sambuc 	}
50*433d6423SLionel Sambuc   if (getpid() == pid)
51*433d6423SLionel Sambuc 	if (fork() == 0) {
52*433d6423SLionel Sambuc 		execl("t10c", "t10c", (char *) 0);
53*433d6423SLionel Sambuc 		exit(0);
54*433d6423SLionel Sambuc 	}
55*433d6423SLionel Sambuc   if (getpid() == pid)
56*433d6423SLionel Sambuc 	if (fork() == 0) {
57*433d6423SLionel Sambuc 		execl("t10d", "t10d", (char *) 0);
58*433d6423SLionel Sambuc 		exit(0);
59*433d6423SLionel Sambuc 	}
60*433d6423SLionel Sambuc 
61*433d6423SLionel Sambuc   srand(100);
62*433d6423SLionel Sambuc   for (i = 0; i < 60; i++) {
63*433d6423SLionel Sambuc 	r = rand() & 07;
64*433d6423SLionel Sambuc 	spawn(r);
65*433d6423SLionel Sambuc   }
66*433d6423SLionel Sambuc 
67*433d6423SLionel Sambuc   for (i = 0; i < 4; i++) wait(&n);
68*433d6423SLionel Sambuc   rmfiles();
69*433d6423SLionel Sambuc   quit();
70*433d6423SLionel Sambuc   return(-1);			/* impossible */
71*433d6423SLionel Sambuc }
72*433d6423SLionel Sambuc 
spawn(n)73*433d6423SLionel Sambuc void spawn(n)
74*433d6423SLionel Sambuc int n;
75*433d6423SLionel Sambuc {
76*433d6423SLionel Sambuc   int pid;
77*433d6423SLionel Sambuc 
78*433d6423SLionel Sambuc   if ((pid = fork()) != 0) {
79*433d6423SLionel Sambuc 	wait(&n);		/* wait for some child (any one) */
80*433d6423SLionel Sambuc   } else {
81*433d6423SLionel Sambuc 	/* a successful exec or a successful detection of a broken executable
82*433d6423SLionel Sambuc 	 * is ok
83*433d6423SLionel Sambuc 	 */
84*433d6423SLionel Sambuc 	if(execl(name[n], name[n], (char *) 0) < 0 && errno == ENOEXEC)
85*433d6423SLionel Sambuc 		exit(0);
86*433d6423SLionel Sambuc 	errct++;
87*433d6423SLionel Sambuc 	printf("Child execl didn't take. file=%s errno=%d\n", name[n], errno);
88*433d6423SLionel Sambuc 	rmfiles();
89*433d6423SLionel Sambuc 	exit(1);
90*433d6423SLionel Sambuc 	printf("Worse yet, EXIT didn't exit\n");
91*433d6423SLionel Sambuc   }
92*433d6423SLionel Sambuc }
93*433d6423SLionel Sambuc 
mkfiles()94*433d6423SLionel Sambuc void mkfiles()
95*433d6423SLionel Sambuc {
96*433d6423SLionel Sambuc   int fd;
97*433d6423SLionel Sambuc   fd = open("t10a", 0);
98*433d6423SLionel Sambuc   if (fd < 0) {
99*433d6423SLionel Sambuc 	printf("Can't open t10a\n");
100*433d6423SLionel Sambuc 	exit(1);
101*433d6423SLionel Sambuc   }
102*433d6423SLionel Sambuc   psize = read(fd, (char *) prog, PROGBUF_LONGS * 4);
103*433d6423SLionel Sambuc   cr_file("t10b", 1600);
104*433d6423SLionel Sambuc   cr_file("t10c", 1400);
105*433d6423SLionel Sambuc   cr_file("t10d", 2300);
106*433d6423SLionel Sambuc   cr_file("t10e", 3100);
107*433d6423SLionel Sambuc   cr_file("t10f", 2400);
108*433d6423SLionel Sambuc   cr_file("t10g", 1700);
109*433d6423SLionel Sambuc   cr_file("t10h", 1500);
110*433d6423SLionel Sambuc   cr_file("t10i", 4000);
111*433d6423SLionel Sambuc   cr_file("t10j", 2250);
112*433d6423SLionel Sambuc   close(fd);
113*433d6423SLionel Sambuc }
114*433d6423SLionel Sambuc 
cr_file(name,size)115*433d6423SLionel Sambuc void cr_file(name, size)
116*433d6423SLionel Sambuc char *name;
117*433d6423SLionel Sambuc int size;
118*433d6423SLionel Sambuc 
119*433d6423SLionel Sambuc {
120*433d6423SLionel Sambuc   int fd;
121*433d6423SLionel Sambuc 
122*433d6423SLionel Sambuc   size += 3000;
123*433d6423SLionel Sambuc   fd = creat(name, 0755);
124*433d6423SLionel Sambuc   write(fd, (char *) prog, psize);
125*433d6423SLionel Sambuc   close(fd);
126*433d6423SLionel Sambuc }
127*433d6423SLionel Sambuc 
rmfiles()128*433d6423SLionel Sambuc void rmfiles()
129*433d6423SLionel Sambuc {
130*433d6423SLionel Sambuc   unlink("t10b");
131*433d6423SLionel Sambuc   unlink("t10c");
132*433d6423SLionel Sambuc   unlink("t10d");
133*433d6423SLionel Sambuc   unlink("t10e");
134*433d6423SLionel Sambuc   unlink("t10f");
135*433d6423SLionel Sambuc   unlink("t10g");
136*433d6423SLionel Sambuc   unlink("t10h");
137*433d6423SLionel Sambuc   unlink("t10i");
138*433d6423SLionel Sambuc   unlink("t10j");
139*433d6423SLionel Sambuc }
140*433d6423SLionel Sambuc 
141