blob: 54b1e4dd1c144d5b689acf482450a2a3b51530e0 [file] [log] [blame]
#define _DEFAULT_SOURCE
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <sys/psx_syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
static void *thread_fork_exit(void *data) {
usleep(1234);
pid_t pid = fork();
cap_t start = cap_get_proc();
if (pid == 0) {
cap_set_proc(start);
exit(0);
}
int res;
if (waitpid(pid, &res, 0) != pid || res != 0) {
printf("FAILED: pid=%d wait returned %d and/or error: %d\n",
pid, res, errno);
exit(1);
}
cap_set_proc(start);
return NULL;
}
int main(int argc, char **argv) {
int i;
printf("hello libcap and libpsx ");
fflush(stdout);
cap_t start = cap_get_proc();
pthread_t ignored[10];
for (i = 0; i < 10; i++) {
pthread_create(&ignored[i], NULL, thread_fork_exit, NULL);
}
for (i = 0; i < 10; i++) {
printf("."); /* because of fork, this may print double */
fflush(stdout); /* try to limit the above effect */
cap_set_proc(start);
usleep(1000);
}
printf(" PASSED\n");
exit(0);
}