int main()

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;
}