{-------------------------------------------------------------------------
 Module:    OpenSSL 3.x Compatibility for FPC

 Comment:   FPC 3.2.2's openssl.pas only searches for OpenSSL 1.1.x and
            older library names. On modern Linux distros (Debian 12+,
            Ubuntu 22.04+), only OpenSSL 3.x is available (libssl.so.3).

            This unit patches the DLLVersions array in FPC's openssl unit
            to include OpenSSL 3.x version suffixes. It must be listed
            in the uses clause BEFORE opensslsockets so its initialization
            section runs first, before InitSSLInterface is called.

            The openssl unit declares DLLVersions as a writeable typed
            constant, so we can overwrite entries at runtime. We insert
            '.3' near the front for priority on modern systems.

            On Windows and OS/2, DLLVersions does not exist (Windows uses
            explicit DLL names), so this unit is a no-op there.
-------------------------------------------------------------------------}
{$IFDEF FPC}{$MODE DELPHI}{$ENDIF}
unit uCICOpenSSL3;

interface

implementation

{$IFDEF FPC}
{$IFNDEF WINDOWS}
{$IFNDEF OS2}
uses
  openssl;

procedure PatchDLLVersions;
begin
  // DLLVersions is array[1..19] of string.
  // Original order: '', '.1.1', '.11', '.10', '.1.0.6', ... '.0.9.1'
  // Insert '.3' after '' (unversioned), shifting the rest down.
  // Drops '.0.9.1' (the oldest, no modern system has it).
  DLLVersions[1]  := '';
  DLLVersions[2]  := '.3';
  DLLVersions[3]  := '.1.1';
  DLLVersions[4]  := '.11';
  DLLVersions[5]  := '.10';
  DLLVersions[6]  := '.1.0.6';
  DLLVersions[7]  := '.1.0.5';
  DLLVersions[8]  := '.1.0.4';
  DLLVersions[9]  := '.1.0.3';
  DLLVersions[10] := '.1.0.2';
  DLLVersions[11] := '.1.0.1';
  DLLVersions[12] := '.1.0.0';
  DLLVersions[13] := '.0.9.8';
  DLLVersions[14] := '.0.9.7';
  DLLVersions[15] := '.0.9.6';
  DLLVersions[16] := '.0.9.5';
  DLLVersions[17] := '.0.9.4';
  DLLVersions[18] := '.0.9.3';
  DLLVersions[19] := '.0.9.2';
end;
{$ENDIF OS2}
{$ENDIF WINDOWS}
{$ENDIF FPC}

initialization
{$IFDEF FPC}
{$IFNDEF WINDOWS}
{$IFNDEF OS2}
  PatchDLLVersions;
{$ENDIF OS2}
{$ENDIF WINDOWS}
{$ENDIF FPC}

end.
