/
FakeWinSock.pas
114 lines (92 loc) · 2.6 KB
/
FakeWinSock.pas
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
113
unit FakeWinSock;
// WinSock simulator unit for Linux
{$mode delphi}{$H+}
interface
uses
Sockets, BaseUnix, Unix, UnixType, termio, Classes;
type
TSocket = Cardinal;
TSockAddrIn = TInetSockAddr;
TThreadProc = function (Param: Pointer): Integer; cdecl;
TIntFunc = Function: Integer;
u_int = Cardinal;
TTimeVal = UnixType.timeval;
PTimeVal = ^TTimeVal;
TWinFDSet = record
count: u_int;
Socket: TSocket;
end;
PWinFDSet = ^TWinFDSet;
const
SOCKET_ERROR = -1;
INFINITE = $7FFFFFFF;
IPPROTO_TCP = 6;
INVALID_SOCKET = 0;
FIONREAD = termio.FIONREAD;
var
WSAGetLastError: TIntFunc = @fpgeterrno;
function ioctlsocket(Socket: TSocket; Message: Integer; var Parameter): Integer;
function CreateThread(Bla: Pointer; Bla2: Integer; Proc: TThreadProc; Param: Pointer; Bla3: Integer; var ThreadID: Cardinal): Integer;
function inet_ntoa(Addr: in_addr): string;
function inet_addr(Addr: string): cardinal;
function select (N:cint;readfds,writefds,exceptfds:PWinFDSet;TimeOut:PTimeVal):cint; // HACK
function bind (s:cint; var addrx : tsockaddrin; addrlen : tsocklen):cint;
function listen (s:cint; backlog : cint):cint;
function accept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
implementation
function inet_ntoa(Addr: in_addr): string;
begin
Result:=NetAddrToStr(Addr);
end;
function inet_addr(Addr: string): cardinal;
begin
Result:=StrToNetAddr(Addr).s_addr;
end;
function ioctlsocket(Socket: TSocket; Message: Integer; var Parameter): Integer;
begin
Result:=BaseUnix.FpIOCtl(Socket, Message, @Parameter);
end;
function select (N:cint;readfds,writefds,exceptfds:PWinFDSet;TimeOut:PTimeVal):cint; // HACK
var
r: TFDSet;
begin
fpFD_ZERO(r);
fpFD_SET(readfds.Socket, r);
FPSelect(N, @r,nil,nil, (TimeOut.tv_sec*1000)+(TimeOut.tv_usec div 1000));
end;
function bind (s:cint; var addrx : tsockaddrin; addrlen : tsocklen):cint;
begin
Result:=fpbind(s, @addrx, addrlen);
end;
function listen (s:cint; backlog : cint):cint;
begin
Result:=fplisten(s, backlog);
end;
function accept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
Result:=fpaccept(s, addrx, addrlen);
end;
type
TCustomThread=class(TThread)
public
FProc: TThreadProc;
FParam: Pointer;
procedure Execute; override;
end;
procedure TCustomThread.Execute;
begin
FreeOnTerminate:=True;
FProc(FParam);
end;
function CreateThread(Bla: Pointer; Bla2: Integer; Proc: TThreadProc; Param: Pointer; Bla3: Integer; var ThreadID: Cardinal): Integer;
begin
Result:=1;
ThreadID:=1;
with TCustomThread.Create(True) do
begin
FProc:=Proc;
FParam:=Param;
Resume;
end;
end;
end.