Merge from vendor branch DIFFUTILS:
[dragonfly.git] / test / sysmsg / sysmsg1.c
1 /*
2  * sysmsg1.c
3  *
4  * $DragonFly: src/test/sysmsg/sysmsg1.c,v 1.1 2003/08/12 02:29:41 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("synchronous sendsys() test: write 'hello!' and 1.5 second nanosleep\n");
30     bzero(&writemsg, sizeof(writemsg));
31     writemsg.usrmsg.umsg.ms_cmd = SYS_write;
32     writemsg.usrmsg.umsg.ms_flags = 0;
33     writemsg.fd = 1;
34     writemsg.buf = "hello!\n";
35     writemsg.nbyte = 7;
36     error = sendsys(NULL, &writemsg.usrmsg, sizeof(writemsg));
37     printf("error code %d\n", error);
38     if (error != 0)
39         exit(1);
40
41     bzero(&sleepmsg, sizeof(sleepmsg));
42     sleepmsg.usrmsg.umsg.ms_cmd = SYS_nanosleep;
43     sleepmsg.usrmsg.umsg.ms_flags = 0;  /* NOTE: not async */
44     sleepmsg.rqtp = &ts1;
45     sleepmsg.rmtp = &ts2;
46     ts1.tv_sec = 1;
47     ts1.tv_nsec = 500 * 1000000;
48     error = sendsys(NULL, &sleepmsg.usrmsg, sizeof(sleepmsg));
49     printf("error code %d\n", error);
50     if (error == EASYNC) {
51         struct nanosleep_args *rmsg;
52         printf("async return, waiting...");
53         fflush(stdout);
54         for (;;) {
55             rmsg = (void *)sendsys(NULL, NULL, -1);
56             printf("    rmsg %p\n", rmsg);
57             if (rmsg == &sleepmsg)
58                 break;
59             usleep(1000000 / 10);
60         }
61         printf("async return error %d\n", sleepmsg.usrmsg.umsg.ms_error);
62     } else if (error) {
63         printf("error %d\n", error);
64     } 
65     exit(0);
66 }
67