2 #include <sys/socket.h>
6 #include <netinet/in.h>
16 #define READ_BLOCK_TIME 5 /* unit: sec */
19 sig_alarm(int sig __unused)
21 #define PANIC_STRING "read blocks\n"
23 write(2, PANIC_STRING, strlen(PANIC_STRING));
28 usage(const char *cmd)
30 fprintf(stderr, "%s -p port\n", cmd);
35 main(int argc, char *argv[])
37 struct sockaddr_in in;
39 int s, n, error, port, opt;
43 while ((opt = getopt(argc, argv, "p:")) != -1) {
48 port = strtol(optarg, &endptr, 0);
50 fprintf(stderr, "invalid -p argument\n");
60 s = socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, 0);
62 err(1, "socket failed");
64 memset(&in, 0, sizeof(in));
65 in.sin_family = AF_INET;
66 in.sin_port = htons(port);
67 if (bind(s, (const struct sockaddr *)&in, sizeof(in)) < 0)
68 err(1, "bind %d failed", port);
70 memset(&it, 0, sizeof(it));
71 it.it_value.tv_sec = READ_BLOCK_TIME;
72 if (signal(SIGALRM, sig_alarm) == SIG_ERR)
73 err(1, "signal failed");
74 if (setitimer(ITIMER_REAL, &it, NULL) < 0)
75 err(1, "setitimer failed");
80 if (error != EAGAIN) {
81 fprintf(stderr, "invalid errno %d\n", error);
85 fprintf(stderr, "read works\n");
89 fprintf(stderr, "passed\n");