select_rs/
lib.rs

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}