Merge from vendor branch OPENSSL:
[dragonfly.git] / test / sysmsg / sysmsg2.c
1 /*
2  * sysmsg2.c
3  *
4  * $DragonFly: src/test/sysmsg/sysmsg2.c,v 1.2 2004/06/03 21:03:32 dillon Exp $
5  */
6
7 #include <sys/types.h>
8 #include <sys/param.h>
9 #include <sys/msgport.h>
10 #include <sys/time.h>
11 #include <sys/syscall.h>
12 #include <sys/sysproto.h>
13 #include <errno.h>
14 #include <stdio.h>
15 #include <string.h>
16 #include <unistd.h>
17 #include <time.h>
18 #include "sendsys.h"
19
20 int
21 main(int ac, char **av)
22 {
23     struct write_args writemsg;
24     struct nanosleep_args sleepmsg;
25     struct timespec ts1;
26     struct timespec ts2;
27     int error;
28
29     printf("test synchronous syscall msg write 'hello!'\n");
30     printf("test ASynchronous syscall msg nanosleep for 1.5 seconds\n");
31     printf("WARNING! super-user only, do not ^C the test program!\n");
32
33     bzero(&writemsg, sizeof(writemsg));
34     writemsg.usrmsg.umsg.ms_cmd.cm_op = SYS_write;
35     writemsg.usrmsg.umsg.ms_flags = 0;
36     writemsg.fd = 1;
37     writemsg.buf = "hello!\n";
38     writemsg.nbyte = 7;
39     error = sendsys(NULL, &writemsg.usrmsg, sizeof(writemsg));
40     printf("error code %d\n", error);
41     if (error != 0)
42         exit(1);
43
44     bzero(&sleepmsg, sizeof(sleepmsg));
45     sleepmsg.usrmsg.umsg.ms_cmd.cm_op = SYS_nanosleep;
46     sleepmsg.usrmsg.umsg.ms_flags = MSGF_ASYNC;
47     sleepmsg.rqtp = &ts1;
48     sleepmsg.rmtp = &ts2;
49     ts1.tv_sec = 1;
50     ts1.tv_nsec = 500 * 1000000;
51     error = sendsys(NULL, &sleepmsg.usrmsg, sizeof(sleepmsg));
52     printf("error code %d\n", error);
53     if (error == EASYNC) {
54         struct nanosleep_args *rmsg;
55
56         printf("error %d is async return, waiting...", EASYNC);
57         fflush(stdout);
58         for (;;) {
59             rmsg = (void *)sendsys(NULL, NULL, -1);
60             printf("    rmsg %p\n", rmsg);
61             if (rmsg == &sleepmsg)
62                 break;
63             usleep(1000000 / 10);
64         }
65         printf("async return error %d\n", sleepmsg.usrmsg.umsg.ms_error);
66     } else if (error) {
67         printf("error %d\n", error);
68     } 
69     exit(0);
70 }
71