int oo_os_sock_sendmsg_raw(ci_netif* ni, oo_sp sock_p, const struct msghdr* msg, int flags) { unsigned long socketcall_args[8]; oo_os_sock_sendmsg_raw_t op; int rc; op.sock_id = OO_SP_TO_INT(sock_p); op.sizeof_ptr = sizeof(void*); op.flags = flags; CI_USER_PTR_SET(op.msg, msg); CI_USER_PTR_SET(op.socketcall_args, socketcall_args); oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(ci_netif_get_driver_handle(ni), OO_IOC_OS_SOCK_SENDMSG_RAW, &op); oo_rwlock_unlock_read (&citp_dup2_lock); return rc; }
static int fdtable_fd_move(ci_fd_t sock_fd, int op) { ci_uint32 io_fd = sock_fd; int rc; oo_rwlock_lock_read(&citp_dup2_lock); rc = oo_resource_op(sock_fd, op, &io_fd); if( rc != 0 || io_fd == sock_fd ) { oo_rwlock_unlock_read(&citp_dup2_lock); return rc; } /* Kernel failed to hand over, but there is no epoll here - let's dup */ rc = ci_sys_dup2(io_fd, sock_fd); ci_tcp_helper_close_no_trampoline(io_fd); oo_rwlock_unlock_read(&citp_dup2_lock); if( rc == sock_fd ) return 0; else if( rc >= 0 ) return -EINVAL; return rc; }