xref: /minix3/minix/tests/test86.c (revision 56ac45c10b294dc800c4cce9e53df7b2ae2495d2)
1*56ac45c1SDavid van Moolenbroek #include <stdlib.h>
2*56ac45c1SDavid van Moolenbroek #include <string.h>
3*56ac45c1SDavid van Moolenbroek #include <limits.h>
4*56ac45c1SDavid van Moolenbroek #include <fcntl.h>
5*56ac45c1SDavid van Moolenbroek #include <sys/wait.h>
6*56ac45c1SDavid van Moolenbroek 
7*56ac45c1SDavid van Moolenbroek #include "common.h"
8*56ac45c1SDavid van Moolenbroek 
9*56ac45c1SDavid van Moolenbroek /*
10*56ac45c1SDavid van Moolenbroek  * Test for dynamic executables with no read permissions.  This test relies on
11*56ac45c1SDavid van Moolenbroek  * being linked dynamically.
12*56ac45c1SDavid van Moolenbroek  */
13*56ac45c1SDavid van Moolenbroek int
main(int argc,char ** argv)14*56ac45c1SDavid van Moolenbroek main(int argc, char ** argv)
15*56ac45c1SDavid van Moolenbroek {
16*56ac45c1SDavid van Moolenbroek 	char *executable, cp_cmd[PATH_MAX + 9];
17*56ac45c1SDavid van Moolenbroek 	int status;
18*56ac45c1SDavid van Moolenbroek 
19*56ac45c1SDavid van Moolenbroek 	if (strcmp(argv[0], "DO CHECK") == 0)
20*56ac45c1SDavid van Moolenbroek 		exit(EXIT_SUCCESS);
21*56ac45c1SDavid van Moolenbroek 
22*56ac45c1SDavid van Moolenbroek 	start(86);
23*56ac45c1SDavid van Moolenbroek 
24*56ac45c1SDavid van Moolenbroek 	/* Make a copy of this binary which is executable-only. */
25*56ac45c1SDavid van Moolenbroek 	executable = argv[0];
26*56ac45c1SDavid van Moolenbroek 
27*56ac45c1SDavid van Moolenbroek 	snprintf(cp_cmd, sizeof(cp_cmd), "cp ../%s .", executable);
28*56ac45c1SDavid van Moolenbroek 	status = system(cp_cmd);
29*56ac45c1SDavid van Moolenbroek 	if (status < 0 || !WIFEXITED(status) ||
30*56ac45c1SDavid van Moolenbroek 	    WEXITSTATUS(status) != EXIT_SUCCESS) e(0);
31*56ac45c1SDavid van Moolenbroek 
32*56ac45c1SDavid van Moolenbroek 	if (chmod(executable, S_IXUSR) != 0) e(0);
33*56ac45c1SDavid van Moolenbroek 
34*56ac45c1SDavid van Moolenbroek 	/* Invoke the changed binary in a child process. */
35*56ac45c1SDavid van Moolenbroek 	switch (fork()) {
36*56ac45c1SDavid van Moolenbroek 	case -1:
37*56ac45c1SDavid van Moolenbroek 		e(0);
38*56ac45c1SDavid van Moolenbroek 	case 0:
39*56ac45c1SDavid van Moolenbroek 		execl(executable, "DO CHECK", NULL);
40*56ac45c1SDavid van Moolenbroek 
41*56ac45c1SDavid van Moolenbroek 		exit(EXIT_FAILURE);
42*56ac45c1SDavid van Moolenbroek 	default:
43*56ac45c1SDavid van Moolenbroek 		if (wait(&status) <= 0) e(0);
44*56ac45c1SDavid van Moolenbroek 		if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
45*56ac45c1SDavid van Moolenbroek 			e(0);
46*56ac45c1SDavid van Moolenbroek 	}
47*56ac45c1SDavid van Moolenbroek 
48*56ac45c1SDavid van Moolenbroek 	quit();
49*56ac45c1SDavid van Moolenbroek 	/* NOTREACHED */
50*56ac45c1SDavid van Moolenbroek }
51