/* * sysmsg1.c * * $DragonFly: src/test/sysmsg/sysmsg1.c,v 1.2 2004/06/03 21:03:32 dillon Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include "sendsys.h" int main(int ac, char **av) { struct write_args writemsg; struct nanosleep_args sleepmsg; struct timespec ts1; struct timespec ts2; int error; printf("synchronous sendsys() test: write 'hello!' and 1.5 second nanosleep\n"); bzero(&writemsg, sizeof(writemsg)); writemsg.usrmsg.umsg.ms_cmd.cm_op = SYS_write; writemsg.usrmsg.umsg.ms_flags = 0; writemsg.fd = 1; writemsg.buf = "hello!\n"; writemsg.nbyte = 7; error = sendsys(NULL, &writemsg.usrmsg, sizeof(writemsg)); printf("error code %d\n", error); if (error != 0) exit(1); bzero(&sleepmsg, sizeof(sleepmsg)); sleepmsg.usrmsg.umsg.ms_cmd.cm_op = SYS_nanosleep; sleepmsg.usrmsg.umsg.ms_flags = 0; /* NOTE: not async */ sleepmsg.rqtp = &ts1; sleepmsg.rmtp = &ts2; ts1.tv_sec = 1; ts1.tv_nsec = 500 * 1000000; error = sendsys(NULL, &sleepmsg.usrmsg, sizeof(sleepmsg)); printf("error code %d\n", error); if (error == EASYNC) { struct nanosleep_args *rmsg; printf("async return, waiting..."); fflush(stdout); for (;;) { rmsg = (void *)sendsys(NULL, NULL, -1); printf(" rmsg %p\n", rmsg); if (rmsg == &sleepmsg) break; usleep(1000000 / 10); } printf("async return error %d\n", sleepmsg.usrmsg.umsg.ms_error); } else if (error) { printf("error %d\n", error); } exit(0); }