1#undef FD_SETSIZE
2/* redefine smaller size then default 64 */
3#define FD_SETSIZE 32
4#include <ruby.h>
5
6static VALUE
7test_select(VALUE self)
8{
9    int sd = socket(AF_INET, SOCK_DGRAM, 0);
10    struct timeval zero;
11    fd_set read;
12    fd_set write;
13    fd_set error;
14
15    zero.tv_sec = 0;
16    zero.tv_usec = 0;
17
18    FD_ZERO(&read);
19    FD_ZERO(&write);
20    FD_ZERO(&error);
21
22    FD_SET(sd, &read);
23    FD_SET(sd, &write);
24    FD_SET(sd, &error);
25
26    select(sd+1, &read, &write, &error, &zero);
27
28    return Qtrue;
29}
30
31static VALUE
32test_fdset(VALUE self)
33{
34    int i;
35    fd_set set;
36
37    FD_ZERO(&set);
38
39    for (i = 0; i < FD_SETSIZE * 2; i++) {
40	int sd = socket(AF_INET, SOCK_DGRAM, 0);
41	FD_SET(sd, &set);
42	if (set.fd_count > FD_SETSIZE) {
43	    return Qfalse;
44	}
45    }
46    return Qtrue;
47}
48
49void
50Init_fd_setsize(void)
51{
52    VALUE m = rb_define_module_under(rb_define_module("Bug"), "Win32");
53    rb_define_module_function(m, "test_select", test_select, 0);
54    rb_define_module_function(m, "test_fdset", test_fdset, 0);
55}
56