in ncrx/nctx.c [409:496]
int main(int argc, char **argv)
{
union sockaddr_in46 laddr = { };
struct pollfd pfds[2] = { };
struct kmsg_ring kmsg_ring;
const char *devkmsg_path = "/dev/kmsg";
int nr_slots = NCRX_DFL_NR_SLOTS;
int sleep_dur = -1;
int opt, port, sock, devkmsg;
socklen_t addrlen;
while ((opt = getopt(argc, argv, "n:k:h?")) != -1) {
switch (opt) {
case 'n':
nr_slots = atoi(optarg);
if (nr_slots <= 0)
usage_err("nr_slots must be a positive number");
break;
case 'k':
devkmsg_path = optarg;
break;
default:
usage_err(NULL);
}
}
if (optind + 2 != argc)
usage_err(NULL);
if (inet_pton(AF_INET6, argv[optind], &laddr.in6.sin6_addr)) {
laddr.addr.sa_family = AF_INET6;
addrlen = sizeof(laddr.in6);
} else if (inet_pton(AF_INET, argv[optind], &laddr.in4.sin_addr)) {
laddr.addr.sa_family = AF_INET;
addrlen = sizeof(laddr.in4);
} else {
usage_err("invalid IP address");
}
port = atoi(argv[optind + 1]);
if (port <= 0 || port > 65535)
usage_err("invalid port number");
laddr.in4.sin_port = htons(port);
sock = socket(laddr.addr.sa_family, SOCK_DGRAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}
if (bind(sock, &laddr.addr, addrlen)) {
perror("bind");
return 1;
}
devkmsg = open(devkmsg_path, O_RDONLY | O_NONBLOCK);
if (devkmsg < 0) {
perror("open");
return 1;
}
if (kmsg_ring_init(&kmsg_ring, nr_slots)) {
perror("kmsg_ring_init");
return 1;
}
pfds[0].events = POLLIN;
pfds[1].events = POLLIN;
pfds[0].fd = devkmsg;
pfds[1].fd = sock;
while (poll(pfds, 2, sleep_dur) >= 0) {
if (kmsg_ring_fill(&kmsg_ring, devkmsg)) {
perror("kmsg_ring_fill");
return 1;
}
if (kmsg_ring_process_resps(&kmsg_ring, sock)) {
perror("kmsg_ring_process_resps");
return 1;
}
sleep_dur = kmsg_ring_emg_tx(&kmsg_ring, sock);
}
perror("poll");
return 1;
}