tagged release 0.6.4
[parrot.git] / config / auto / aio / aio.in
blob957e4bb8ae9e6a4be58125c115bdd63bc1c8369c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7 #include <aio.h>
8 #include <signal.h>
10 static void
11 die(const char *s)
13     fprintf(stderr, "%s\n", s);
14     exit(1);
17 static int my_sig, retval;
19 static volatile sig_atomic_t flag;
21 static void
22 sighandler(const int s, siginfo_t *i, void *x)
24     if (s == my_sig) {
25         flag = s;
26         retval =  *(int*)i->si_ptr;
27     }
30 int
31 main(int argc, char *argv[])
33     struct aiocb a;
34     struct sigaction sa;
35     int fd;
36     int i = 42;
38     my_sig = atoi(argv[1]);
39     printf("SIGRTMIN=%d SIGRTMAX=%d\n", SIGRTMIN, SIGRTMAX);
41     fd = open("MANIFEST", O_RDONLY);
42     if (fd < 0)
43         die("can't open MANIFEST");
45     a.aio_fildes = fd;
46     a.aio_offset = 0;
47     a.aio_reqprio = 0;
48     a.aio_buf = malloc(100);
49     a.aio_nbytes = 100;
50     a.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
51     a.aio_sigevent.sigev_signo = my_sig;
52     a.aio_sigevent.sigev_value.sival_ptr = &i;
53     sa.sa_sigaction = sighandler;
54     sigemptyset(&sa.sa_mask);
55     sa.sa_flags = SA_RESTART|SA_SIGINFO;
56     if (sigaction(my_sig, &sa, NULL) < 0)
57         die("sigaction err");
58     if (aio_read(&a) < 0)
59         die("aio_read err");
60     while (!flag) {
61         sleep(1);
62     }
63     if (flag != my_sig)
64         die("wrong signal");
65     close(fd);
66     printf("INFO=%d\n", retval);
67     puts("ok");
68     return 0;