示例#1
0
文件: netlink.c 项目: beekhof/dlm
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));
}
示例#2
0
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);
        }
}
示例#3
0
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);
    }
}