ssize_t sim_sock_sendmsg (struct SimSocket *socket, const struct msghdr *msg, int flags) { struct socket *kernel_socket = (struct socket *)socket; struct iovec *kernel_iov = copy_iovec (msg->msg_iov, msg->msg_iovlen); struct msghdr kernel_msg = *msg; kernel_msg.msg_flags = flags; kernel_msg.msg_iov = kernel_iov; int retval = sock_sendmsg (kernel_socket, &kernel_msg, iov_size (msg)); sim_free (kernel_iov); return retval; }
wpdu::wpdu(const iovec& iov): valid_flag_(0),comm_len(MAX_COMM_STR_LEN) { community_name[0] = 0; reset_iov(iovec_); version_ = version1; // TODO: figure where this should come from ACE_NEW(iovec_.iov_base, char[iov.iov_len]); if (!iovec_.iov_base) { valid_flag_ = SNMP_CLASS_RESOURCE_UNAVAIL; return; } copy_iovec(iovec_, iov); valid_flag_ = SNMP_CLASS_SUCCESS; }
ssize_t sim_sock_recvmsg (struct SimSocket *socket, struct msghdr *msg, int flags) { struct socket *kernel_socket = (struct socket *)socket; struct iovec *kernel_iov = copy_iovec (msg->msg_iov, msg->msg_iovlen); struct iovec *user_iov = msg->msg_iov; struct cmsghdr *user_cmsgh = msg->msg_control; size_t user_cmsghlen = msg->msg_controllen; msg->msg_iov = kernel_iov; int retval = sock_recvmsg (kernel_socket, msg, iov_size (msg), flags); msg->msg_iov = user_iov; msg->msg_control = user_cmsgh; msg->msg_controllen = user_cmsghlen - msg->msg_controllen; sim_free (kernel_iov); return retval; }