Skip to content

Commit a800eb6

Browse files
committed
vrt: Bind select.
1 parent 8598106 commit a800eb6

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
module core.c.posix.sys.select;
2+
3+
version (Posix):
4+
extern (C):
5+
6+
import core.c.config : c_long;
7+
import core.c.posix.sys.time : timeval;
8+
9+
private enum FD_SETSIZE = 1024;
10+
private enum NFDBITS = 8 * cast(i32)typeid(fd_mask).size;
11+
12+
version (OSX) {
13+
alias fd_mask = i32;
14+
} else {
15+
alias fd_mask = c_long;
16+
}
17+
18+
struct fd_set
19+
{
20+
fds_bits: fd_mask[FD_SETSIZE / NFDBITS];
21+
}
22+
23+
private fn FD_ELT(d: i32) i32
24+
{
25+
return d / NFDBITS;
26+
}
27+
28+
private fn FD_MASK(d: i32) fd_mask
29+
{
30+
return cast(fd_mask)(1 << (d % NFDBITS));
31+
}
32+
33+
fn FD_ZERO(set: fd_set*)
34+
{
35+
for (i: u32 = 0; i < typeid(fd_set).size / typeid(fd_mask).size; ++i) {
36+
set.fds_bits[i] = 0;
37+
}
38+
}
39+
40+
fn FD_SET(fd: i32, set: fd_set*)
41+
{
42+
set.fds_bits[FD_ELT(fd)] |= FD_MASK(fd);
43+
}
44+
45+
fn FD_CLR(fd: i32, set: fd_set*)
46+
{
47+
set.fds_bits[FD_ELT(fd)] &= ~FD_MASK(fd);
48+
}
49+
50+
fn FD_ISSET(fd: i32, set: fd_set*) i32
51+
{
52+
return (set.fds_bits[FD_ELT(fd)] & FD_MASK(fd)) != 0;
53+
}
54+
55+
fn select(i32, fd_set*, fd_set*, fd_set*, timeval*) i32;
56+

0 commit comments

Comments
 (0)