doublecmd.diff 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. Index: ssfpc.inc
  2. ===================================================================
  3. --- ssfpc.inc (revision 209)
  4. +++ ssfpc.inc (working copy)
  5. @@ -67,6 +67,9 @@
  6. {$ifdef darwin}
  7. {$DEFINE SOCK_HAS_SINLEN} // BSD definition of scoketaddr
  8. {$endif}
  9. +{$ifdef haiku}
  10. +{$DEFINE SOCK_HAS_SINLEN} // BSD definition of scoketaddr
  11. +{$endif}
  12. interface
  13. @@ -103,7 +106,9 @@
  14. const
  15. FIONREAD = termio.FIONREAD;
  16. FIONBIO = termio.FIONBIO;
  17. +{$IFNDEF HAIKU}
  18. FIOASYNC = termio.FIOASYNC;
  19. +{$ENDIF}
  20. const
  21. IPPROTO_IP = 0; { Dummy }
  22. @@ -212,12 +217,21 @@
  23. SOMAXCONN = 1024;
  24. +{$IFDEF HAIKU}
  25. + IPV6_UNICAST_HOPS = 27;
  26. +{$ELSE}
  27. IPV6_UNICAST_HOPS = sockets.IPV6_UNICAST_HOPS;
  28. +{$ENDIF}
  29. IPV6_MULTICAST_IF = sockets.IPV6_MULTICAST_IF;
  30. IPV6_MULTICAST_HOPS = sockets.IPV6_MULTICAST_HOPS;
  31. IPV6_MULTICAST_LOOP = sockets.IPV6_MULTICAST_LOOP;
  32. +{$IFDEF HAIKU}
  33. + IPV6_JOIN_GROUP = 28;
  34. + IPV6_LEAVE_GROUP = 29;
  35. +{$ELSE}
  36. IPV6_JOIN_GROUP = sockets.IPV6_JOIN_GROUP;
  37. IPV6_LEAVE_GROUP = sockets.IPV6_LEAVE_GROUP;
  38. +{$ENDIF}
  39. const
  40. SOCK_STREAM = 1; { stream socket }
  41. @@ -231,9 +245,9 @@
  42. { Address families. }
  43. - AF_UNSPEC = 0; { unspecified }
  44. - AF_INET = 2; { internetwork: UDP, TCP, etc. }
  45. - AF_INET6 = 10; { Internetwork Version 6 }
  46. + AF_UNSPEC = 0; { unspecified }
  47. + AF_INET = sockets.AF_INET; { internetwork: UDP, TCP, etc. }
  48. + AF_INET6 = sockets.AF_INET6; { Internetwork Version 6 }
  49. AF_MAX = 24;
  50. { Protocol families, same as address families for now. }
  51. @@ -254,15 +268,31 @@
  52. MSG_OOB = sockets.MSG_OOB; // Process out-of-band data.
  53. MSG_PEEK = sockets.MSG_PEEK; // Peek at incoming messages.
  54. - {$ifdef DARWIN}
  55. + {$if defined(DARWIN)}
  56. MSG_NOSIGNAL = $20000; // Do not generate SIGPIPE.
  57. // Works under MAC OS X, but is undocumented,
  58. // So FPC doesn't include it
  59. + {$elseif defined(HAIKU)}
  60. + MSG_NOSIGNAL = $0800;
  61. {$else}
  62. - MSG_NOSIGNAL = sockets.MSG_NOSIGNAL; // Do not generate SIGPIPE.
  63. + MSG_NOSIGNAL = sockets.MSG_NOSIGNAL; // Do not generate SIGPIPE.
  64. {$endif}
  65. +{$IF DEFINED(HAIKU)}
  66. const
  67. + ESysESTALE = (B_POSIX_ERROR_BASE + 40);
  68. + ESysENOTSOCK = (B_POSIX_ERROR_BASE + 44);
  69. + ESysEHOSTDOWN = (B_POSIX_ERROR_BASE + 45);
  70. + ESysEDESTADDRREQ = (B_POSIX_ERROR_BASE + 48);
  71. + ESysEDQUOT = (B_POSIX_ERROR_BASE + 49);
  72. + // Fake error codes
  73. + ESysEUSERS = (B_POSIX_ERROR_BASE + 128);
  74. + ESysEREMOTE = (B_POSIX_ERROR_BASE + 129);
  75. + ESysETOOMANYREFS = (B_POSIX_ERROR_BASE + 130);
  76. + ESysESOCKTNOSUPPORT = (B_POSIX_ERROR_BASE + 131);
  77. +{$ENDIF}
  78. +
  79. +const
  80. WSAEINTR = ESysEINTR;
  81. WSAEBADF = ESysEBADF;
  82. WSAEACCES = ESysEACCES;
  83. @@ -755,7 +785,7 @@
  84. begin
  85. Result := 0;
  86. FillChar(Sin, Sizeof(Sin), 0);
  87. - Sin.sin_port := Resolveport(port, family, SockProtocol, SockType);
  88. + Sin.sin_port := htons(Resolveport(port, family, SockProtocol, SockType));
  89. TwoPass := False;
  90. if Family = AF_UNSPEC then
  91. begin
  92. @@ -858,7 +888,7 @@
  93. ProtoEnt: TProtocolEntry;
  94. ServEnt: TServiceEntry;
  95. begin
  96. - Result := synsock.htons(StrToIntDef(Port, 0));
  97. + Result := StrToIntDef(Port, 0);
  98. if Result = 0 then
  99. begin
  100. ProtoEnt.Name := '';
  101. @@ -865,7 +895,7 @@
  102. GetProtocolByNumber(SockProtocol, ProtoEnt);
  103. ServEnt.port := 0;
  104. GetServiceByName(Port, ProtoEnt.Name, ServEnt);
  105. - Result := ServEnt.port;
  106. + Result := ntohs(ServEnt.port);
  107. end;
  108. end;
  109. Index: blcksock.pas
  110. ===================================================================
  111. --- blcksock.pas (revision 278)
  112. +++ blcksock.pas (working copy)
  113. @@ -1234,6 +1234,8 @@
  114. TCustomSSL = class(TObject)
  115. private
  116. protected
  117. + FSessionOld: Pointer;
  118. + FSessionNew: Pointer;
  119. FOnVerifyCert: THookVerifyCert;
  120. FSocket: TTCPBlockSocket;
  121. FSSLEnabled: Boolean;
  122. @@ -1368,6 +1370,9 @@
  123. {:Return error description of last SSL operation.}
  124. property LastErrorDesc: string read FLastErrorDesc;
  125. +
  126. + {:Used for session resumption }
  127. + property Session: Pointer read FSessionNew write FSessionOld;
  128. published
  129. {:Here you can specify requested SSL/TLS mode. Default is autodetection, but
  130. on some servers autodetection not working properly. In this case you must
  131. @@ -2518,6 +2523,8 @@
  132. begin
  133. repeat
  134. s := RecvPacket(Timeout);
  135. + if (Length(s) = 0) then
  136. + Break;
  137. if FLastError = 0 then
  138. WriteStrToStream(Stream, s);
  139. until FLastError <> 0;
  140. Index: ftpsend.pas
  141. ===================================================================
  142. --- ftpsend.pas (revision 209)
  143. +++ ftpsend.pas (working copy)
  144. @@ -870,6 +870,11 @@
  145. end;
  146. FDSock.CloseSocket;
  147. FDSock.Bind(FIPInterface, cAnyPort);
  148. +
  149. + if FIsDataTLS then begin
  150. + FDSock.SSL.Session := FSock.SSL.Session;
  151. + end;
  152. +
  153. FDSock.Connect(FDataIP, FDataPort);
  154. Result := FDSock.LastError = 0;
  155. end
  156. Index: ssl_openssl.pas
  157. ===================================================================
  158. --- ssl_openssl.pas (revision 278)
  159. +++ ssl_openssl.pas (working copy)
  160. @@ -77,8 +77,9 @@
  161. accepting of new connections!
  162. }
  163. -{$INCLUDE 'jedi.inc'}
  164. -
  165. +{$IFDEF FPC}
  166. + {$MODE DELPHI}
  167. +{$ENDIF}
  168. {$H+}
  169. {$IFDEF UNICODE}
  170. @@ -86,7 +87,7 @@
  171. {$WARN IMPLICIT_STRING_CAST_LOSS OFF}
  172. {$ENDIF}
  173. -unit ssl_openssl{$IFDEF SUPPORTS_DEPRECATED} deprecated{$IFDEF SUPPORTS_DEPRECATED_DETAILS} 'Use ssl_openssl3 with OpenSSL 3.0 instead'{$ENDIF}{$ENDIF};
  174. +unit ssl_openssl;
  175. interface
  176. @@ -495,6 +496,11 @@
  177. function TSSLOpenSSL.DeInit: Boolean;
  178. begin
  179. Result := True;
  180. + if Assigned(FSessionNew) then
  181. + begin
  182. + SslSessionFree(FSessionNew);
  183. + FSessionNew := nil;
  184. + end;
  185. if assigned (Fssl) then
  186. sslfree(Fssl);
  187. Fssl := nil;
  188. @@ -538,6 +544,10 @@
  189. SSLCheck;
  190. Exit;
  191. end;
  192. + // Reuse session
  193. + if Assigned(FSessionOld) then begin
  194. + SslSetSession(Fssl, FSessionOld);
  195. + end;
  196. if SNIHost<>'' then
  197. begin
  198. SSLCtrl(Fssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, PAnsiChar(AnsiString(SNIHost)));
  199. @@ -579,6 +589,9 @@
  200. FSSLEnabled := True;
  201. Result := True;
  202. end;
  203. + if Result and (FSessionOld = nil) then begin
  204. + FSessionNew := SslGet1Session(Fssl);
  205. + end;
  206. end;
  207. function TSSLOpenSSL.Accept: boolean;
  208. Index: ssl_openssl_lib.pas
  209. ===================================================================
  210. --- ssl_openssl_lib.pas (revision 278)
  211. +++ ssl_openssl_lib.pas (working copy)
  212. @@ -813,6 +813,9 @@
  213. function SSLGetVerifyResult(ssl: PSSL):Integer;
  214. function SSLCtrl(ssl: PSSL; cmd: integer; larg: integer; parg: SslPtr):Integer;
  215. function SslSet1Host(ssl: PSSL; hostname: PAnsiChar):Integer;
  216. + procedure SslSessionFree(session: PSslPtr);
  217. + function SslGet1Session(ssl: PSSL):PSslPtr;
  218. + function SslSetSession(ssl: PSSL; session: PSslPtr): Integer;
  219. // libeay.dll
  220. function X509New: PX509;
  221. @@ -940,6 +943,9 @@
  222. TSSLGetVerifyResult = function(ssl: PSSL):Integer; cdecl;
  223. TSSLCtrl = function(ssl: PSSL; cmd: integer; larg: integer; parg: SslPtr):Integer; cdecl;
  224. TSslSet1Host = function(ssl: PSSL; hostname: PAnsiChar):Integer; cdecl;
  225. + TSslSessionFree = procedure(session: PSslPtr); cdecl;
  226. + TSslGet1Session = function(ssl: PSSL):PSslPtr; cdecl;
  227. + TSslSetSession = function(ssl: PSSL; session: PSslPtr): Integer; cdecl;
  228. TSSLSetTlsextHostName = function(ssl: PSSL; buf: PAnsiChar):Integer; cdecl;
  229. @@ -1049,6 +1055,9 @@
  230. _SSLGetVerifyResult: TSSLGetVerifyResult = nil;
  231. _SSLCtrl: TSSLCtrl = nil;
  232. _SslSet1Host: TSslSet1Host = nil;
  233. + _SslSessionFree: TSslSessionFree = nil;
  234. + _SslGet1Session: TSslGet1Session = nil;
  235. + _SslSetSession: TSslSetSession = nil;
  236. // libeay.dll
  237. _X509New: TX509New = nil;
  238. @@ -1474,6 +1483,28 @@
  239. Result := 0;
  240. end;
  241. +procedure SslSessionFree(session: PSslPtr);
  242. +begin
  243. + if InitSSLInterface and Assigned(_SslSessionFree) then
  244. + _SslSessionFree(session);
  245. +end;
  246. +
  247. +function SslGet1Session(ssl: PSSL): PSslPtr;
  248. +begin
  249. + if InitSSLInterface and Assigned(_SslGet1Session) then
  250. + Result := _SslGet1Session(ssl)
  251. + else
  252. + Result := nil;
  253. +end;
  254. +
  255. +function SslSetSession(ssl: PSSL; session: PSslPtr): Integer;
  256. +begin
  257. + if InitSSLInterface and Assigned(_SslSetSession) then
  258. + Result := _SslSetSession(ssl, session)
  259. + else
  260. + Result := 0;
  261. +end;
  262. +
  263. // libeay.dll
  264. function X509New: PX509;
  265. begin
  266. @@ -1924,7 +1955,7 @@
  267. {$ENDIF}
  268. end;
  269. -function GetLibFileName(Handle: THandle): string;
  270. +function GetLibFileName(Handle: TLibHandle): string;
  271. var
  272. n: integer;
  273. begin
  274. @@ -2022,6 +2053,9 @@
  275. _SslGetVerifyResult := GetProcAddr(SSLLibHandle, 'SSL_get_verify_result');
  276. _SslCtrl := GetProcAddr(SSLLibHandle, 'SSL_ctrl');
  277. _SslSet1Host := GetProcAddr(SSLLibHandle, 'SSL_set1_host');
  278. + _SslSessionFree := GetProcAddr(SSLLibHandle, 'SSL_SESSION_free');
  279. + _SslGet1Session := GetProcAddr(SSLLibHandle, 'SSL_get1_session');
  280. + _SslSetSession := GetProcAddr(SSLLibHandle, 'SSL_set_session');
  281. _X509New := GetProcAddr(SSLUtilHandle, 'X509_new');
  282. _X509Free := GetProcAddr(SSLUtilHandle, 'X509_free');
  283. @@ -2213,6 +2247,9 @@
  284. _SslGetVerifyResult := nil;
  285. _SslCtrl := nil;
  286. _SslSet1Host := nil;
  287. + _SslSessionFree := nil;
  288. + _SslGet1Session := nil;
  289. + _SslSetSession := nil;
  290. _X509New := nil;
  291. _X509Free := nil;