add linux syscall sys_getrandom to lcorernd
[lcore.git] / unixstuff.inc
1 {$ifdef UNIX}\r
2   {$macro on}\r
3   {$ifdef VER1_0}\r
4     {$define tv_sec := sec}\r
5     {$define tv_usec := usec}\r
6     function dup(const original:integer):integer;inline;\r
7     begin\r
8       linux.dup(original,result);\r
9     end;\r
10     {$define gettimeofdaysec := gettimeofday}\r
11     const\r
12       IPPROTO_UDP=17;\r
13       IPPROTO_ICMP=1;\r
14     function ntohs(invalue:word):word;inline;\r
15     var\r
16       invaluebytes : array[0..1] of byte absolute invalue;\r
17       resultbytes : array[0..1] of byte absolute result;\r
18     begin\r
19       {$ifdef endian_little}\r
20         resultbytes[0] := invaluebytes[1];\r
21         resultbytes[1] := invaluebytes[0];\r
22       {$else}\r
23         result := invalue;\r
24       {$endif}\r
25     end; \r
26     {$define need_v6constants}\r
27   {$else}\r
28     \r
29     {$define sigprocmask := fpsigprocmask}\r
30     {$define sigaction   := fpsigaction}\r
31     {$define fdclose     := fpclose}\r
32     {$define fcntl       := fpfcntl}\r
33     {$define fdwrite     := fpwrite}\r
34     {$define fdread      := fpread}\r
35     {$define fdopen      := fpopen}\r
36     {$define select      := fpselect}\r
37     {$define linuxerror  := fpgeterrno}\r
38     {$define fork        := fpfork}\r
39     {$define getpid      := fpgetpid}\r
40     {$define getenv      := fpgetenv}\r
41     {$define chmod       := fpchmod}\r
42     {$define dup2        := fpdup2}\r
43     {$ifndef ver1_9_2}\r
44       {$define flock     := fpflock}\r
45       {$ifndef ver1_9_4}\r
46         //beware: this is needed because FPC_FULLVERSION >= 30200 breaks delphi 6 even inside an ifdef it shouldn't process\r
47         {$ifdef fpc}\r
48           {$ifdef ver3}\r
49             {$ifndef ver3_0}{$ifndef ver3_1}{$define fpc_3_2_or_later}{$endif}{$endif}\r
50           {$endif}\r
51           {$ifdef ver4}{$define fpc_3_2_or_later}{$endif}\r
52         {$endif}\r
53         {$ifdef fpc_3_2_or_later}\r
54           procedure Execl(Todo:rawbytestring);inline;\r
55         {$else}\r
56           procedure Execl(Todo:string);inline;\r
57         {$endif}\r
58         var\r
59           p : ppchar;\r
60         begin\r
61           p := unixutil.StringToPPChar(Todo,0);\r
62           if (p=nil) or (p^=nil) then exit;\r
63           fpexecv(p^,p);\r
64         end;\r
65         function SendTo(Sock: LongInt; const Buf;BufLen: LongInt;Flags: LongInt;var Addr;AddrLen: LongInt):LongInt;\r
66         begin\r
67           result := fpsendto(sock,@buf,buflen,flags,@addr,addrlen);\r
68         end;\r
69         function RecvFrom(Sock: LongInt;var Buf;Buflen: LongInt;Flags: LongInt;var Addr;var addrlen: Longint):LongInt;\r
70         begin\r
71           result := fprecvfrom(sock,@buf,buflen,flags,@addr,@addrlen);\r
72         end;\r
73         {$define socket := fpsocket}\r
74         function Bind(Sock: LongInt;const Addr;AddrLen: LongInt):Boolean;\r
75         begin\r
76           result := fpbind(sock,@addr,addrlen) = 0;\r
77         end;\r
78         function SetSocketOptions(Sock: LongInt;Level: LongInt;OptName: LongInt;const OptVal;optlen: LongInt):LongInt;\r
79         begin\r
80           result := fpsetsockopt(sock,level,optname,@optval,optlen);\r
81         end;\r
82         function Connect(Sock: LongInt;const Addr;Addrlen: LongInt):Boolean;\r
83         begin\r
84           result := fpconnect(sock,@addr,addrlen) >= 0;\r
85         end;\r
86         function listen(Sock: LongInt;MaxConnect: LongInt):Boolean;\r
87         begin\r
88           result := fplisten(sock,maxconnect) = 0;\r
89         end; \r
90         function GetPeerName(Sock: LongInt; var Addr;var Addrlen: LongInt):LongInt;\r
91         begin\r
92           result := fpgetpeername(sock,@addr,@addrlen);\r
93         end;\r
94         function GetSocketName(Sock: LongInt; var Addr;var Addrlen: LongInt):LongInt;\r
95         begin\r
96           result := fpgetsockname(sock,@addr,@addrlen);\r
97         end;\r
98         function Accept(Sock: LongInt; var Addr; var Addrlen: LongInt):LongInt;\r
99         begin\r
100           result := fpaccept(sock,@addr,@addrlen);\r
101         end;\r
102       {$endif}\r
103     {$endif}\r
104     {$ifdef ver2_0}\r
105       const\r
106         IPPROTO_UDP=17;\r
107         IPPROTO_ICMP=1;\r
108       {$define need_v6constants}\r
109     {$endif}\r
110     {$ifdef ver1_9}\r
111       const\r
112         IPPROTO_UDP=17;\r
113         IPPROTO_ICMP=1;\r
114       function ntohs(invalue:word):word;inline;\r
115       var\r
116         invaluebytes : array[0..1] of byte absolute invalue;\r
117         resultbytes : array[0..1] of byte absolute result;\r
118       begin\r
119         {$ifdef endian_little}\r
120           resultbytes[0] := invaluebytes[1];\r
121           resultbytes[1] := invaluebytes[0];\r
122         {$else}\r
123           result := invalue;\r
124         {$endif}\r
125       end;\r
126       {$define need_v6constants}\r
127     {$endif}\r
128     procedure gettimeofday(var tv:ttimeval);inline;\r
129     begin\r
130       fpgettimeofday(@tv,nil);    \r
131     end;\r
132     function gettimeofdaysec : longint;\r
133     var\r
134       tv:ttimeval;\r
135     begin\r
136       gettimeofday(tv);\r
137       result := tv.tv_sec;\r
138     end;\r
139 \r
140     //a function is used here rather than a define to prevent issues with tlasio.dup\r
141     function dup(const original:integer):integer;inline;\r
142     begin\r
143       result := fpdup(original);\r
144     end;\r
145     function octal(invalue:longint):longint;\r
146     var\r
147       a : integer;\r
148       i : integer;\r
149     begin\r
150       i := 0;\r
151       result := 0;\r
152       while invalue <> 0 do begin\r
153         a := invalue mod 10;\r
154         result := result + (a shl (i*3));\r
155 \r
156         invalue := invalue div 10;\r
157         inc(i);\r
158       end;\r
159     end;\r
160     const\r
161       sys_eintr=esyseintr;\r
162 \r
163   {$endif}\r
164   {$ifdef need_v6constants}\r
165     {$ifdef linux} \r
166       //the below values are only known correct on linux, I don't support \r
167       //1.0.x on any other unix platform atm anyway --plugwash\r
168       const \r
169         IPPROTO_IPV6 = 41;\r
170         IPV6_V6ONLY         = 26;\r
171     {$endif}\r
172   {$endif}\r
173   {$ifdef freebsd}\r
174     //freepascal doesn't seem to define IPV6_V6ONLY on freebsd, the definition\r
175     //here is taken from the include files of a freebsd 8 system\r
176     const\r
177       IPV6_V6ONLY = 27;\r
178   {$endif}\r
179 \r
180 {$endif}\r
181 \r
182     \r