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