1 #include <sys/types.h> 2 #include <sys/socket.h> 3 #include <sys/time.h> 4 #include <sys/un.h> 5 6 #include <err.h> 7 #include <errno.h> 8 #include <signal.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <unistd.h> 13 14 #define READ_BLOCK_TIME 5 /* unit: sec */ 15 16 static void 17 sig_alarm(int sig __unused) 18 { 19 #define PANIC_STRING "read blocks\n" 20 21 write(2, PANIC_STRING, strlen(PANIC_STRING)); 22 abort(); 23 } 24 25 int 26 main(void) 27 { 28 struct itimerval it; 29 int s[2], n, error; 30 char buf; 31 32 if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_NONBLOCK, 0, s) < 0) 33 err(1, "socketpair failed"); 34 35 memset(&it, 0, sizeof(it)); 36 it.it_value.tv_sec = READ_BLOCK_TIME; 37 if (signal(SIGALRM, sig_alarm) == SIG_ERR) 38 err(1, "signal failed"); 39 if (setitimer(ITIMER_REAL, &it, NULL) < 0) 40 err(1, "setitimer failed"); 41 42 n = read(s[0], &buf, 1); 43 if (n < 0) { 44 error = errno; 45 if (error != EAGAIN) { 46 warnx("invalid errno %d", error); 47 abort(); 48 } 49 } else { 50 warnx("read0 works"); 51 abort(); 52 } 53 54 n = read(s[1], &buf, 1); 55 if (n < 0) { 56 error = errno; 57 if (error != EAGAIN) { 58 warnx("invalid errno %d", error); 59 abort(); 60 } 61 } else { 62 warnx("read1 works"); 63 abort(); 64 } 65 66 fprintf(stderr, "passed\n"); 67 exit(0); 68 } 69