static ni_socket_t * __ni_process_get_output(ni_process_t *pi, int fd) { ni_socket_t *sock; sock = ni_socket_wrap(fd, SOCK_STREAM); sock->receive = __ni_process_output_recv; sock->handle_hangup = __ni_process_output_hangup; sock->release_user_data = __ni_process_release_user_data; sock->user_data = pi; return sock; }
static ni_socket_t * __ni_rtevent_sock_open(void) { unsigned int recv_buff_len = __ni_rtevent_config_recv_buff_len(); unsigned int mesg_buff_len = __ni_rtevent_config_mesg_buff_len(); ni_rtevent_handle_t *handle; ni_socket_t *sock; int fd, ret; if (!(handle = __ni_rtevent_handle_new())) { ni_error("Unable to allocate rtnetlink event handle: %m"); return NULL; } if (!(handle->nlsock = nl_socket_alloc())) { ni_error("Cannot allocate rtnetlink event socket: %m"); __ni_rtevent_handle_free(handle); return NULL; } /* * Modify the callback for processing valid messages... * We may pass some kind of data (event filter?) too... */ nl_socket_modify_cb(handle->nlsock, NL_CB_VALID, NL_CB_CUSTOM, __ni_rtevent_process_cb, NULL); /* Required to receive async event notifications */ nl_socket_disable_seq_check(handle->nlsock); if ((ret = nl_connect(handle->nlsock, NETLINK_ROUTE)) < 0) { ni_error("Cannot open rtnetlink: %s", nl_geterror(ret)); __ni_rtevent_handle_free(handle); return NULL; } /* Enable non-blocking processing */ nl_socket_set_nonblocking(handle->nlsock); fd = nl_socket_get_fd(handle->nlsock); if (!(sock = ni_socket_wrap(fd, SOCK_DGRAM))) { ni_error("Cannot wrap rtnetlink event socket: %m"); __ni_rtevent_handle_free(handle); return NULL; } if (recv_buff_len) { if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, (char *)&recv_buff_len, sizeof(recv_buff_len)) && setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&recv_buff_len, sizeof(recv_buff_len))) { ni_warn("Unable to set netlink event receive buffer to %u bytes: %m", recv_buff_len); } else { ni_info("Using netlink event receive buffer of %u bytes", recv_buff_len); } } if (mesg_buff_len) { if (nl_socket_set_msg_buf_size(handle->nlsock, mesg_buff_len)) { ni_warn("Unable to set netlink event message buffer to %u bytes", mesg_buff_len); } else { ni_info("Using netlink event message buffer of %u bytes", mesg_buff_len); } } sock->user_data = handle; sock->receive = __ni_rtevent_receive; sock->close = __ni_rtevent_close; sock->handle_error = __ni_rtevent_sock_error_handler; sock->release_user_data = __ni_rtevent_sock_release_data; return sock; }