1#![allow(non_snake_case)]
2
3#[cfg(target_os = "windows")]
4extern crate winapi;
5#[cfg(not(target_os = "windows"))]
6extern crate libc;
7
8#[cfg(target_os = "windows")]
9pub type FdSet = winapi::um::winsock2::fd_set;
10#[cfg(target_os = "windows")]
11pub type TimeVal = winapi::um::winsock2::timeval;
12#[cfg(not(target_os = "windows"))]
13pub type FdSet = libc::fd_set;
14#[cfg(not(target_os = "windows"))]
15pub type TimeVal = libc::timeval;
16
17#[cfg(not(target_os = "windows"))]
18pub fn FD_ISSET(fd: libc::c_int, set: *const libc::fd_set) -> bool {
19 return unsafe { libc::FD_ISSET(fd, set) };
20}
21
22#[cfg(not(target_os = "windows"))]
23pub fn FD_SET(fd: libc::c_int, set: *mut libc::fd_set) -> () {
24 return unsafe { libc::FD_SET(fd, set) };
25}
26
27#[cfg(not(target_os = "windows"))]
28pub fn FD_ZERO(set: *mut libc::fd_set) -> () {
29 return unsafe { libc::FD_ZERO(set) };
30}
31
32#[cfg(target_os = "windows")]
33pub fn FD_ISSET(a : u64 , set : &mut FdSet) -> bool{
34 let mut i = 0 ;
35 while i < set.fd_count {
36
37 if set.fd_array[i as usize] == a as usize {
38 return true;
39 }
40
41 i += 1;
42 }
43 return false
44}
45
46#[cfg(target_os = "windows")]
47pub fn FD_SET(a : u64 , set : &mut FdSet){
48 use winapi::um::winsock2::FD_SETSIZE;
49
50 let mut i = 0 ;
51 while i < set.fd_count {
52
53 if set.fd_array[i as usize] == a as usize {
54 return
55 }
56 i += 1;
57 }
58 if (i as usize) < FD_SETSIZE {
59 set.fd_array[i as usize] = a as usize;
60 set.fd_count += 1;
61 }
62}
63
64#[cfg(target_os = "windows")]
65pub fn FD_ZERO(set : &mut FdSet){
66 let mut i = 0 ;
67 while i < set.fd_count {
68 set.fd_array[i as usize] =0;
69 i += 1;
70 }
71 set.fd_count = 0;
72}
73
74pub fn select( maxfd : i32, readfds: *mut FdSet, writefds: *mut FdSet,exceptfds: *mut FdSet , timeout: *mut TimeVal) -> i32 {
75
76 #[cfg(target_os = "windows")]
77 return unsafe { winapi::um::winsock2::select(
78 maxfd ,
79 readfds ,
80 writefds,
81 exceptfds ,
82 timeout) as i32 };
83
84 #[cfg(not(target_os = "windows"))]
85 return unsafe { libc::select(
86 maxfd ,
87 readfds ,
88 writefds,
89 exceptfds ,
90 timeout) as i32 };
91}
92
93#[test]
94#[cfg(not(target_os = "windows"))]
95fn test_select(){
96 let mut fds : FdSet = unsafe {std::mem::zeroed()};
97 FD_ZERO(&mut fds);
98 FD_SET(0 , &mut fds);
99 assert!(select(1, std::ptr::null_mut() , &mut fds ,std::ptr::null_mut() , std::ptr::null_mut()) > 0);
100 assert!(FD_ISSET(0, &mut fds));
101}