void process_netlink(int ci) { struct msgtemplate msg; struct nlattr *na; int len; int fd; fd = client_fd(ci); len = recv(fd, &msg, sizeof(msg), 0); if (len < 0) { log_error("nonfatal netlink error: errno %d", errno); return; } if (msg.n.nlmsg_type == NLMSG_ERROR || !NLMSG_OK((&msg.n), len)) { struct nlmsgerr *err = NLMSG_DATA(&msg); log_error("fatal netlink error: errno %d", err->error); return; } na = (struct nlattr *) GENLMSG_DATA(&msg); process_timewarn((struct dlm_lock_data *) NLA_DATA(na)); }
void ProxySession::Run(std::error_code& ec) { FileDesc client_fd(Connect(ec)); if(ec) { LOG(WARNING) << "Error connecting: " << ec.message(); return; } // now we have open fd's for both client and server we // enter an event loop waiting for data to read from either source FileDesc epoll_fd(epoll_create(2)); if(!epoll_fd.IsValid()) { ec = std::error_code(errno, std::system_category()); return; } if(!RegisterForDataAvailable(epoll_fd, m_server_fd, ec) || !RegisterForDataAvailable(epoll_fd, client_fd, ec)) { ec = std::error_code(errno, std::system_category()); return; } while(!ec) { RunOne(epoll_fd, client_fd, ec); } }
void exec_server_process(int (*socket_pairs)[2]) { pid_t pid = fork(); if (pid == 0) { const int client_num = get_client_count(); close_all_client_fd_except(socket_pairs, client_num, -1); for (int i = 0; i < client_num; i++) { move_fd(client_fd(i), socket_pairs[i][kFdConnectToServer]); } execv(get_server_name(), NULL); exit(0); } }