int main(int argc, char **argv) { fd_set read_fdset, write_fdset; int i, opt; int max; sigset_t chld_set; while ((opt=getopt(argc, argv, "q")) != -1) { switch (opt) { case 'q': opt_quiet = 1; break; default: /* '?' */ fprintf(stderr, "usage: %s [-q] domainid domain-name [default user]\n", argv[0]); exit(1); } } if (argc - optind < 2 || argc - optind > 3) { fprintf(stderr, "usage: %s [-q] domainid domain-name [default user]\n", argv[0]); exit(1); } remote_domain_id = atoi(argv[optind]); remote_domain_name = argv[optind+1]; if (argc - optind >= 3) default_user = argv[optind+2]; init(remote_domain_id); sigemptyset(&chld_set); sigaddset(&chld_set, SIGCHLD); signal(SIGCHLD, sigchld_handler); /* * The main event loop. Waits for one of the following events: * - message from client * - message from agent * - new client * - child exited */ for (;;) { max = fill_fdsets_for_select(&read_fdset, &write_fdset); if (libvchan_buffer_space(vchan) <= (int)sizeof(struct msg_header)) FD_ZERO(&read_fdset); // vchan full - don't read from clients sigprocmask(SIG_BLOCK, &chld_set, NULL); if (child_exited) reap_children(); wait_for_vchan_or_argfd(vchan, max, &read_fdset, &write_fdset); sigprocmask(SIG_UNBLOCK, &chld_set, NULL); if (FD_ISSET(qrexec_daemon_unix_socket_fd, &read_fdset)) handle_new_client(); while (libvchan_data_ready(vchan)) handle_message_from_agent(); for (i = 0; i <= max_client_fd; i++) if (clients[i].state != CLIENT_INVALID && FD_ISSET(i, &read_fdset)) handle_message_from_client(i); } }
int main(int argc, char **argv) { fd_set read_fdset, write_fdset; int i; int max; sigset_t chld_set; if (argc != 2) { fprintf(stderr, "usage: %s domainid\n", argv[0]); exit(1); } init(atoi(argv[1])); sigemptyset(&chld_set); sigaddset(&chld_set, SIGCHLD); /* The main event loop. Waits for one of the following events: - message from client - message from agent - new client - child exited */ for (;;) { max = fill_fdsets_for_select(&read_fdset, &write_fdset); if (buffer_space_vchan_ext() <= sizeof(struct server_header)) FD_ZERO(&read_fdset); // vchan full - don't read from clients sigprocmask(SIG_BLOCK, &chld_set, NULL); if (child_exited) reap_children(); wait_for_vchan_or_argfd(max, &read_fdset, &write_fdset); sigprocmask(SIG_UNBLOCK, &chld_set, NULL); if (FD_ISSET(qrexec_daemon_unix_socket_fd, &read_fdset)) handle_new_client(); while (read_ready_vchan_ext()) handle_message_from_agent(); for (i = 0; i <= max_client_fd; i++) if (clients[i].state != CLIENT_INVALID && FD_ISSET(i, &read_fdset)) handle_message_from_client(i); for (i = 0; i <= max_client_fd; i++) if (clients[i].state != CLIENT_INVALID && FD_ISSET(i, &write_fdset)) write_buffered_data_to_client(i); } }