forked from yaosj2k/dnsforwarder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsocketpuller.c
executable file
·112 lines (93 loc) · 2.31 KB
/
socketpuller.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "socketpuller.h"
PUBFUNC int SocketPuller_Add(SocketPuller *p,
SOCKET s,
const void *Data,
int DataLength
)
{
if( s == INVALID_SOCKET )
{
return -11;
}
if( p->p.Add(&(p->p), s, Data, DataLength) != 0 )
{
return -16;
}
if( s > p->Max )
{
p->Max = s;
}
FD_SET(s, &(p->s));
return 0;
}
PUBFUNC int SocketPuller_Del(SocketPuller *p, SOCKET Sock)
{
if( p->p.Del(&(p->p), Sock) != 0 )
{
return -33;
}
FD_CLR(Sock, &(p->s));
return 0;
}
PUBFUNC SOCKET SocketPuller_Select(SocketPuller *p,
struct timeval *tv,
void **Data,
BOOL Reading,
BOOL Writing
)
{
fd_set ReadySet;
ReadySet = p->s;
while( TRUE )
{
switch( select(p->Max + 1,
Reading ? &ReadySet : NULL,
Writing ? &ReadySet : NULL,
NULL,
tv)
)
{
case SOCKET_ERROR:
if( FatalErrorDecideding(GET_LAST_ERROR()) == 0 )
{
continue;
}
/* No break; */
case 0:
return INVALID_SOCKET;
break;
default:
return p->p.FetchOnSet(&(p->p), &ReadySet, Data);
break;
}
}
}
PUBFUNC BOOL SocketPuller_IsEmpty(SocketPuller *p)
{
return !(p->Max >= 0);
}
PUBFUNC void SocketPuller_CloseAll(SocketPuller *p, SOCKET ExceptFor)
{
p->p.CloseAll(&(p->p), ExceptFor);
}
PUBFUNC void SocketPuller_Free(SocketPuller *p)
{
p->p.Free(&(p->p), TRUE);
}
PUBFUNC void SocketPuller_FreeWithoutClose(SocketPuller *p)
{
p->p.Free(&(p->p), FALSE);
}
int SocketPuller_Init(SocketPuller *p)
{
p->Max = -1;
p->Add = SocketPuller_Add;
p->Del = SocketPuller_Del;
p->Select = SocketPuller_Select;
p->IsEmpty = SocketPuller_IsEmpty;
p->CloseAll = SocketPuller_CloseAll;
p->Free = SocketPuller_Free;
p->FreeWithoutClose = SocketPuller_FreeWithoutClose;
FD_ZERO(&(p->s));
return SocketPool_Init(&(p->p));
}