xref: /aosp_15_r20/external/libcap/tests/libcap_psx_test.c (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
1*2810ac1bSKiyoung Kim #ifndef _DEFAULT_SOURCE
2*2810ac1bSKiyoung Kim #define _DEFAULT_SOURCE
3*2810ac1bSKiyoung Kim #endif
4*2810ac1bSKiyoung Kim 
5*2810ac1bSKiyoung Kim #include <errno.h>
6*2810ac1bSKiyoung Kim #include <pthread.h>
7*2810ac1bSKiyoung Kim #include <stdio.h>
8*2810ac1bSKiyoung Kim #include <stdlib.h>
9*2810ac1bSKiyoung Kim #include <sys/capability.h>
10*2810ac1bSKiyoung Kim #include <sys/psx_syscall.h>
11*2810ac1bSKiyoung Kim #include <sys/types.h>
12*2810ac1bSKiyoung Kim #include <sys/wait.h>
13*2810ac1bSKiyoung Kim #include <unistd.h>
14*2810ac1bSKiyoung Kim 
thread_fork_exit(void * data)15*2810ac1bSKiyoung Kim static void *thread_fork_exit(void *data) {
16*2810ac1bSKiyoung Kim     usleep(1234);
17*2810ac1bSKiyoung Kim     pid_t pid = fork();
18*2810ac1bSKiyoung Kim     cap_t start = cap_get_proc();
19*2810ac1bSKiyoung Kim     if (start == NULL) {
20*2810ac1bSKiyoung Kim 	perror("FAILED: unable to start");
21*2810ac1bSKiyoung Kim 	exit(1);
22*2810ac1bSKiyoung Kim     }
23*2810ac1bSKiyoung Kim     if (pid == 0) {
24*2810ac1bSKiyoung Kim 	if (cap_set_proc(start)) {
25*2810ac1bSKiyoung Kim 	    perror("setting empty caps failed");
26*2810ac1bSKiyoung Kim 	    exit(1);
27*2810ac1bSKiyoung Kim 	}
28*2810ac1bSKiyoung Kim 	exit(0);
29*2810ac1bSKiyoung Kim     }
30*2810ac1bSKiyoung Kim     int res;
31*2810ac1bSKiyoung Kim     if (waitpid(pid, &res, 0) != pid || res != 0) {
32*2810ac1bSKiyoung Kim 	printf("FAILED: pid=%d wait returned %d and/or error: %d\n",
33*2810ac1bSKiyoung Kim 	       pid, res, errno);
34*2810ac1bSKiyoung Kim 	exit(1);
35*2810ac1bSKiyoung Kim     }
36*2810ac1bSKiyoung Kim     cap_set_proc(start);
37*2810ac1bSKiyoung Kim     cap_free(start);
38*2810ac1bSKiyoung Kim     return NULL;
39*2810ac1bSKiyoung Kim }
40*2810ac1bSKiyoung Kim 
main(int argc,char ** argv)41*2810ac1bSKiyoung Kim int main(int argc, char **argv) {
42*2810ac1bSKiyoung Kim     int i;
43*2810ac1bSKiyoung Kim     printf("hello libcap and libpsx ");
44*2810ac1bSKiyoung Kim     fflush(stdout);
45*2810ac1bSKiyoung Kim     cap_t start = cap_get_proc();
46*2810ac1bSKiyoung Kim     if (start == NULL) {
47*2810ac1bSKiyoung Kim 	perror("FAILED: to actually start");
48*2810ac1bSKiyoung Kim 	exit(1);
49*2810ac1bSKiyoung Kim     }
50*2810ac1bSKiyoung Kim     pthread_t ignored[10];
51*2810ac1bSKiyoung Kim     for (i = 0; i < 10; i++) {
52*2810ac1bSKiyoung Kim 	pthread_create(&ignored[i], NULL, thread_fork_exit, NULL);
53*2810ac1bSKiyoung Kim     }
54*2810ac1bSKiyoung Kim     for (i = 0; i < 10; i++) {
55*2810ac1bSKiyoung Kim 	printf(".");     /* because of fork, this may print double */
56*2810ac1bSKiyoung Kim 	fflush(stdout);  /* try to limit the above effect */
57*2810ac1bSKiyoung Kim 	if (cap_set_proc(start)) {
58*2810ac1bSKiyoung Kim 	    perror("failed to set proc");
59*2810ac1bSKiyoung Kim 	    exit(1);
60*2810ac1bSKiyoung Kim 	}
61*2810ac1bSKiyoung Kim 	usleep(1000);
62*2810ac1bSKiyoung Kim     }
63*2810ac1bSKiyoung Kim     printf(" PASSED\n");
64*2810ac1bSKiyoung Kim     exit(0);
65*2810ac1bSKiyoung Kim }
66