extern crate libc;
use libc::{c_int, c_char, c_void, c_uchar};
use libc::sockaddr;
pub type UDTSOCKET = c_int;
pub type SYSSOCKET = c_int;
pub const SUCCESS : c_int = 0; pub const ECONNSETUP : c_int = 1000; pub const ENOSERVER : c_int = 1001; pub const ECONNREJ : c_int = 1002; pub const ESOCKFAIL : c_int = 1003; pub const ESECFAIL : c_int = 1004; pub const ECONNFAIL : c_int = 2000; pub const ECONNLOST : c_int = 2001; pub const ENOCONN : c_int = 2002; pub const ERESOURCE : c_int = 3000; pub const ETHREAD : c_int = 3001; pub const ENOBUF : c_int = 3002; pub const EFILE : c_int = 4000; pub const EINVRDOFF : c_int = 4001; pub const ERDPERM : c_int = 4002; pub const EINVWROFF : c_int = 4003; pub const EWRPERM : c_int = 4004; pub const EINVOP : c_int = 5000; pub const EBOUNDSOCK : c_int = 5001; pub const ECONNSOCK : c_int = 5002; pub const EINVPARAM : c_int = 5003; pub const EINVSOCK : c_int = 5004; pub const EUNBOUNDSOCK : c_int = 5005; pub const ENOLISTEN : c_int = 5006; pub const ERDVNOSERV : c_int = 5007; pub const ERDVUNBOUND : c_int = 5008; pub const ESTREAMILL : c_int = 5009; pub const EDGRAMILL : c_int = 5010; pub const EDUPLISTEN : c_int = 5011; pub const ELARGEMSG : c_int = 5012; pub const EASYNCFAIL : c_int = 6000; pub const EASYNCSND : c_int = 6001; pub const EASYNCRCV : c_int = 6002; pub const ETIMEOUT : c_int = 6003; pub const EPEERERR : c_int = 7000;
pub const INVALID_SOCK: c_int = -1;
pub const UDT_ERROR: c_int = -1;
#[repr(C)]
pub enum EPOLLOpt {
UDT_EPOLL_IN = 0x1,
UDT_EPOLL_OUT = 0x4,
UDT_EPOLL_ERR = 0x8
}
#[repr(C)]
pub enum UDTOpt {
#[allow(non_camel_case_types)]
UDT_MSS, UDT_SNDSYN, UDT_RCVSYN, UDT_CC, UDT_FC, UDT_SNDBUF, UDT_RCVBUF, UDT_LINGER, UDP_SNDBUF, UDP_RCVBUF, UDT_MAXMSG, UDT_MSGTTL, UDT_RENDEZVOUS, UDT_SNDTIMEO, UDT_RCVTIMEO, UDT_REUSEADDR, UDT_MAXBW, UDT_STATE, UDT_EVENT, UDT_SNDDATA, UDT_RCVDATA }
#[derive(Debug, Clone, Copy, PartialEq)]
#[repr(C)]
pub enum UdtStatus {
INIT = 1,
OPENED,
LISTENING,
CONNECTING,
CONNECTED,
BROKEN,
CLOSING,
CLOSED,
NONEXIST
}
pub type SOCKOPT = UDTOpt;
extern {
pub fn udt_startup();
pub fn udt_cleanup();
pub fn udt_socket(af: c_int, ty: c_int, protocol: c_int) -> UDTSOCKET;
pub fn udt_bind(u: UDTSOCKET, name: *const sockaddr, namelen: c_int) -> c_int;
pub fn udt_bind2(u: UDTSOCKET, other: std::os::unix::io::RawFd) -> c_int;
pub fn udt_listen(u: UDTSOCKET, backlog: c_int) -> c_int;
pub fn udt_accept(u: UDTSOCKET, addr: *mut sockaddr, addrlen: *mut c_int) -> UDTSOCKET;
pub fn udt_connect(u: UDTSOCKET, name: *const sockaddr, namelen: c_int) -> c_int;
pub fn udt_close(u: UDTSOCKET) -> c_int;
pub fn udt_getpeername(u: UDTSOCKET, name: *mut sockaddr, namelen: *mut c_int) -> c_int;
pub fn udt_getsockname(u: UDTSOCKET, name: *mut sockaddr, namelen: *mut c_int) -> c_int;
pub fn udt_getsockopt(u: UDTSOCKET, level: c_int, optname: SOCKOPT, optval: *mut c_void, optlen: *mut c_int) -> c_int;
pub fn udt_setsockopt(u: UDTSOCKET, level: c_int, optname: SOCKOPT, optval: *const c_void, openlen: c_int) -> c_int;
pub fn udt_send(u: UDTSOCKET, buf: *const c_uchar, len: c_int, flags: c_int) -> c_int;
pub fn udt_sendmsg(U: UDTSOCKET, buf: *const c_uchar, len: c_int, ttl: c_int, inorder: c_int) -> c_int;
pub fn udt_recv(u: UDTSOCKET, buf: *mut c_uchar, len: c_int, flags: c_int) -> c_int;
pub fn udt_recvmsg(u: UDTSOCKET, but: *mut c_uchar, len: c_int) -> c_int;
pub fn udt_epoll_create() -> c_int;
pub fn udt_epoll_add_usock(eid: c_int, usock: UDTSOCKET, events: *const c_int) -> c_int;
pub fn udt_epoll_add_ssock(eid: c_int, ssock: SYSSOCKET, events: *const c_int) -> c_int;
pub fn udt_epoll_remove_usock(eid: c_int, usock: UDTSOCKET) -> c_int;
pub fn udt_epoll_remove_ssock(eid: c_int, ssock: SYSSOCKET) -> c_int;
pub fn udt_epoll_wait2(eid: c_int, readfs: *mut UDTSOCKET, rnum: *mut c_int, writefs: *mut UDTSOCKET, wnum: *mut c_int, msTimeOut: i64,
lrfds: *mut SYSSOCKET, lrnum: *mut c_int, lwfds: *mut SYSSOCKET, lwnum: *mut c_int) -> c_int;
pub fn udt_epoll_release(eid: c_int) -> c_int;
pub fn udt_getsockstate(u: UDTSOCKET) -> UdtStatus;
pub fn udt_getlasterror_code() -> c_int;
pub fn udt_getlasterror_desc() -> *const c_char;
}
#[test]
fn smoke() {
unsafe {
udt_startup();
udt_cleanup();
}
}