Ada <> libcurl

Stéphane Rivière via Ada-france <[email protected]> Tue, 2 Nov 2021 16:52:04 +0100
Newsgroups gmane.comp.lang.ada.france
Organization La Maison
Message-ID <[email protected]>
Hello,

Le binding Curl complet de Almroth mais amalgamé en un seul fichier et
qui marche avec CE21.

En liaison dynamique : 38 dépendances dans le binaire. libCurl n'est
pas/plus compilable statiquement... entre autres tous les paquets
kerberos ne sont plus packagés (distribs linux courantes) avec les libs
statiques (les packageurs ne semblent plus pouvoir y arriver)). J'ai
tenté à mon tour et me suis aussi cassé les dents.

Comme tous nos binaires sont statiques, c'est poubelle pour nous.

Par contre, pour ceux pour qui c'est égal d'avoir un binaire avec
liaisons dynamiques, c'est prêt à l'emploi.

J'avais commencé une doc interne, en PJ le source en l'état, désormais
également sans objet. Les liens vers le site de cURL sont fonctionnels.

Dans le lien d'archive ci-dessous, on retrouve les sources originales et
les progs de tests liés.

-------------------------------------------------------------------------------
--  ▖▖▄▖▄▖
--  ▌▌▄▌▛▌
--  ▚▘▙▖█▌
--
--  @file      v20-Crl.ads
--  @copyright See authors list below and v20.copyrights file
--  @licence   GPL v3
--  @encoding  UTF-8
------------------------------------------------------------------------------
--  @summary
--  V20 library common
--
--  @description
--
--  @authors
--  Andreas Almroth - aa -
https://web.archive.org/web/20070403105909/http://www.almroth.com/adacurl (author)
--  Stéphane Rivière - sr - [email protected] (low level sources amalgation)
--
--  @versions
--  see v20.ads
------------------------------------------------------------------------------
--
-- System packages for dynamic and static link only: sudo apt install
libcurl4 libcurl4-openssl-dev
--
--  An Ada binary, statically compiled, lies 2,9 Mo:
--
--  The same Ada binary, dynamically compiled, lies 1,9 MB and owns
theses dependencies:
--
--  linux-vdso.so.1 (0x00007ffddfeba000)
--  libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb2f30b0000)
--  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb2f2cbf000)
--  /lib64/ld-linux-x86-64.so.2 (0x00007fb2f32b4000)
--
--  The same binary, dynamically compiled, with the standard curl library,
--  thus with rather rich functionalities has, apart from the 4 libs
above and the libcurl,
--  38 dependencies, in relation with the caps specified by the
./configure during the build:
--
--  libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4
(0x00007f772aec2000)
--
------------------------------------------------------------------------------
-- System packages for static link only: sudo apt install libnghttp2-dev
libidn2-0 librtmp-dev libidn2-0-dev libidn2-dev libpsl-dev libkrb5-dev
libkrb5-3 libgssapi-krb5-2 libldap2-dev
-- /!\ libkrb5-dev.a libkrb5.a et libgssapi-krb5.a in system packages
are missing, so static linking is a no go...
--
-- In v20. Gpr, replace Common_Linker_Options := ("-static"); with:
-- Dynamic linking (ok) : Common_Linker_Options := ("-lcurl");
-- Static linking (ko): Common_Linker_Options := ("-static", "-lcurl",
"-lnghttp2", "-lidn2", "-lrtmp", "-lpsl", "-lssl", "-lcrypto", "-lssl",
"-lcrypto", "-lgssapi_krb5", "-lkrb5", "-lk5crypto", "-lcom_err",
"-lldap", "-llber", "-lz");
--
-- In test.adb, before 'begin', add :
--  Curl : Crl.CURL_P;
--  Res  : Crl.Curlcode;
--
-- In test.adb, above 'raise exception test'
--  Curl := Crl.Curl_Easy_Init;
--  if Curl /= null then
--     Res :=
Crl.Curl_Easy_Setopt(Curl,Crl.CURLOPT_URL,New_String("https://www.soweb.io"));
--     Res := Crl.Curl_Easy_Perform(Curl);
--     Crl.Curl_Easy_Cleanup(Curl);
--  end if;
------------------------------------------------------------------------------

with System;
with Interfaces.C;         use Interfaces.C;
with Interfaces.C.Strings; use Interfaces.C.Strings;
with Ada.Calendar; use Ada.Calendar;

package v20.Crl is

   subtype Time_T is long;
   type Time_T_Pointer is access all Time_T;

   type CURL is new System.Address; -- void
   type CURL_P is access all CURL;

   subtype file_p is System.Address;

   HTTPPOST_FILENAME    : constant long := 1;
   HTTPPOST_READFILE    : constant long := 2;
   HTTPPOST_PTRNAME     : constant long := 4;
   HTTPPOST_PTRCONTENTS : constant long := 8;
   HTTPPOST_BUFFER      : constant long := 16;
   HTTPPOST_PTRBUFFER   : constant long := 32;

   type Curl_Slist;
   type Curl_Slist_P is access all Curl_Slist;

   type Curl_Slist is record
      Data : chars_ptr;
      Next : Curl_Slist_P;
   end record;
   pragma Convention(C,Curl_Slist);

   type Curl_Httppost;
   type Curl_Httppost_P is access all Curl_Httppost;

   type Curl_Httppost is record
      Next           : Curl_Httppost_P;
      Name           : chars_ptr;
      Namelength     : long;
      Contents       : chars_ptr;
      Contentslength : long;
      Buffer         : chars_ptr;
      Bufferlength   : long;
      Contenttype    : chars_ptr;
      Contentheader  : Curl_Slist_P;
      More           : Curl_Httppost_P;
      Flags          : long;
      Showfilename   : chars_ptr;
   end record;
   pragma Convention(C,Curl_Httppost);

   CURL_MAX_WRITE_SIZE : constant := 16384;

   type Curl_Progress_Callback
   is access function (Clientp : System.Address;
                       Dltotal : double;
                       Dlnow   : double;
                       Ultotal : double;
                       Ulnow   : double)
                      return int;

   -- Same type for both type of callbacks
   type Curl_Readwrite_Callback
   is access function (Buffer   : chars_ptr;
                       Size     : size_t;
                       Nitems   : size_t;
                       Instream : file_p)
                      return size_t;

   CURL_READFUNC_ABORT : constant := 16#10000000#;

   -- Not used since 7.10.8, will be removed
   type Curl_Passwd_Callback
   is access function (Clientp : System.Address;
                       Prompt  : chars_ptr;
                       Buffer  : chars_ptr;
                       Buflen  : int) return int;

   type Curlioerr is (CURLIOE_OK,
                      CURLIOE_UNKNOWNCMD,
                      CURLIOE_FAILRESTART,
                      CURLIOE_LAST);
   pragma Convention(C,Curlioerr);

   type Curliocmd is (CURLIOCMD_NOP,
                      CURLIOCMD_RESTARTREAD,
                      CURLIOCMD_LAST);

   type Curl_Ioctl_Callback
   is access function (Handle  : CURL;
                       Cmd     : int;
                       Clientp : System.Address) return Curlioerr;

   type Curl_Malloc_Callback
   is access function (Size : size_t)
                      return System.Address;

   type Curl_Free_Callback
   is access function (Ptr : System.Address)
                      return System.Address;

   type Curl_Realloc_Callback
   is access function (Ptr  : System.Address;
                       Size : size_t)
                      return System.Address;

   type Curl_Strdup_Callback
   is access function (Str : in chars_ptr)
                      return chars_ptr;

   type Curl_Calloc_Callback
   is access function(Nmemb : size_t;
                      Size  : size_t)
                     return System.Address;

   type Curl_Infotype is (CURLINFO_TEXT,
                          CURLINFO_HEADER_IN,
                          CURLINFO_HEADER_OUT,
                          CURLINFO_DATA_IN,
                          CURLINFO_DATA_OUT,
                          CURLINFO_SSL_DATA_IN,
                          CURLINFO_SSL_DATA_OUT,
                          CURLINFO_END);
   pragma Convention(C,Curl_Infotype);

   type Curl_Debug_Callback
   is access function (Handle : CURL_P;
                       Ctype  : Curl_Infotype;
                       Data   : chars_ptr;
                       Size   : size_t;
                       Userp  : System.Address)
                      return int;

   type Curlcode is (CURLE_OK,
                     CURLE_UNSUPPORTED_PROTOCOL,
                     CURLE_FAILED_INIT,
                     CURLE_URL_MALFORMAT,
                     CURLE_URL_MALFORMAT_USER,
                     CURLE_COULDNT_RESOLVE_PROXY,
                     CURLE_COULDNT_RESOLVE_HOST,
                     CURLE_COULDNT_CONNECT,
                     CURLE_FTP_WEIRD_SERVER_REPLY,
                     CURLE_FTP_ACCESS_DENIED,
                     CURLE_FTP_USER_PASSWORD_INCORRECT,
                     CURLE_FTP_WEIRD_PASS_REPLY,
                     CURLE_FTP_WEIRD_USER_REPLY,
                     CURLE_FTP_WEIRD_PASV_REPLY,
                     CURLE_FTP_WEIRD_227_FORMAT,
                     CURLE_FTP_CANT_GET_HOST,
                     CURLE_FTP_CANT_RECONNECT,
                     CURLE_FTP_COULDNT_SET_BINARY,
                     CURLE_PARTIAL_FILE,
                     CURLE_FTP_COULDNT_RETR_FILE,
                     CURLE_FTP_WRITE_ERROR,
                     CURLE_FTP_QUOTE_ERROR,
                     CURLE_HTTP_RETURNED_ERROR,
                     CURLE_WRITE_ERROR,
                     CURLE_MALFORMAT_USER,
                     CURLE_FTP_COULDNT_STOR_FILE,
                     CURLE_READ_ERROR,
                     CURLE_OUT_OF_MEMORY,
                     CURLE_OPERATION_TIMEDOUT,
                     CURLE_FTP_COULDNT_SET_ASCII,
                     CURLE_FTP_PORT_FAILED,
                     CURLE_FTP_COULDNT_USE_REST,
                     CURLE_FTP_COULDNT_GET_SIZE,
                     CURLE_HTTP_RANGE_ERROR,
                     CURLE_HTTP_POST_ERROR,
                     CURLE_SSL_CONNECT_ERROR,
                     CURLE_BAD_DOWNLOAD_RESUME,
                     CURLE_FILE_COULDNT_READ_FILE,
                     CURLE_LDAP_CANNOT_BIND,
                     CURLE_LDAP_SEARCH_FAILED,
                     CURLE_LIBRARY_NOT_FOUND,
                     CURLE_FUNCTION_NOT_FOUND,
                     CURLE_ABORTED_BY_CALLBACK,
                     CURLE_BAD_FUNCTION_ARGUMENT,
                     CURLE_BAD_CALLING_ORDER,
                     CURLE_HTTP_PORT_FAILED,
                     CURLE_BAD_PASSWORD_ENTERED,
                     CURLE_TOO_MANY_REDIRECTS ,
                     CURLE_UNKNOWN_TELNET_OPTION,
                     CURLE_TELNET_OPTION_SYNTAX ,
                     CURLE_OBSOLETE,
                     CURLE_SSL_PEER_CERTIFICATE,
                     CURLE_GOT_NOTHING,
                     CURLE_SSL_ENGINE_NOTFOUND,
                     CURLE_SSL_ENGINE_SETFAILED,
                     CURLE_SEND_ERROR,
                     CURLE_RECV_ERROR,
                     CURLE_SHARE_IN_USE,
                     CURLE_SSL_CERTPROBLEM,
                     CURLE_SSL_CIPHER,
                     CURLE_SSL_CACERT,
                     CURLE_BAD_CONTENT_ENCODING,
                     CURLE_LDAP_INVALID_URL,
                     CURLE_FILESIZE_EXCEEDED,
                     CURLE_FTP_SSL_FAILED,
                     CURLE_SEND_FAIL_REWIND,
                     CURLE_SSL_ENGINE_INITFAILED,
                     CURLE_LOGIN_DENIED,
                     CURL_LAST);
   pragma Convention(C,Curlcode);

   type Curl_Ssl_Ctx_Callback
   is access function (C       : CURL_P;
                       Ssl_Ctx : System.Address;
                       Userptr : System.Address) return Curlcode;

   type Curl_Proxytype is (CURLPROXY_HTTP,
                           CURLPROXY_SOCKS4,
                           CURLPROXY_SOCKS5);
   for Curl_Proxytype use (CURLPROXY_HTTP => 0,
                           CURLPROXY_SOCKS4 => 4,
                           CURLPROXY_SOCKS5 => 5);
   pragma Convention(C,Curl_Proxytype);


   CURLAUTH_NONE         : constant := 0;
   CURLAUTH_BASIC        : constant := 1;
   CURLAUTH_DIGEST       : constant := 2;
   CURLAUTH_GSSNEGOTIATE : constant := 4;
   CURLAUTH_NTLM         : constant := 8;
   CURLAUTH_ANY          : constant := 16#ffffffff#; -- invert 0, assume
32 bit
   CURLAUTH_ANYSAFE      : constant := 16#fffffffe#; -- assume 32 bit
(~CURLAUTH_BASIC)

   CURL_ERROR_SIZE : constant := 256;

   type Curl_Ftpssl is (CURLFTPSSL_NONE,
                        CURLFTPSSL_TRY,
                        CURLFTPSSL_CONTROL,
                        CURLFTPSSL_ALL,
                        CURLFTPSSL_LAST);
   pragma Convention(C,Curl_Ftpssl);

   type  Curl_Ftpauth is (CURLFTPAUTH_DEFAULT,
                          CURLFTPAUTH_SSL,
                          CURLFTPAUTH_TLS,
                          CURLFTPAUTH_LAST);
   pragma Convention(C,Curl_Ftpauth);

   CURLOPTTYPE_LONG          : constant := 0;
   CURLOPTTYPE_OBJECTPOINT   : constant := 10000;
   CURLOPTTYPE_FUNCTIONPOINT : constant := 20000;
   CURLOPTTYPE_OFF_T         : constant := 30000;

   type Curloption is (CURLOPT_PORT,
                       CURLOPT_TIMEOUT,
                       CURLOPT_INFILESIZE,
                       CURLOPT_LOW_SPEED_LIMIT,
                       CURLOPT_LOW_SPEED_TIME,
                       CURLOPT_RESUME_FROM,
                       CURLOPT_CRLF,
                       CURLOPT_SSLVERSION,
                       CURLOPT_TIMECONDITION,
                       CURLOPT_TIMEVALUE,
                       CURLOPT_VERBOSE,
                       CURLOPT_HEADER,
                       CURLOPT_NOPROGRESS,
                       CURLOPT_NOBODY,
                       CURLOPT_FAILONERROR,
                       CURLOPT_UPLOAD,
                       CURLOPT_POST,
                       CURLOPT_FTPLISTONLY,
                       CURLOPT_FTPAPPEND,
                       CURLOPT_NETRC,
                       CURLOPT_FOLLOWLOCATION,
                       CURLOPT_TRANSFERTEXT,
                       CURLOPT_PUT,
                       CURLOPT_AUTOREFERER,
                       CURLOPT_PROXYPORT,
                       CURLOPT_POSTFIELDSIZE,
                       CURLOPT_HTTPPROXYTUNNEL,
                       CURLOPT_SSL_VERIFYPEER,
                       CURLOPT_MAXREDIRS,
                       CURLOPT_FILETIME,
                       CURLOPT_MAXCONNECTS,
                       CURLOPT_CLOSEPOLICY,
                       CURLOPT_FRESH_CONNECT,
                       CURLOPT_FORBID_REUSE,
                       CURLOPT_CONNECTTIMEOUT,
                       CURLOPT_HTTPGET,
                       CURLOPT_SSL_VERIFYHOST,
                       CURLOPT_HTTP_VERSION,
                       CURLOPT_FTP_USE_EPSV,
                       CURLOPT_SSLENGINE_DEFAULT,
                       CURLOPT_DNS_USE_GLOBAL_CACHE, -- Obsolete soon
                       CURLOPT_DNS_CACHE_TIMEOUT,
                       CURLOPT_COOKIESESSION,
                       CURLOPT_BUFFERSIZE,
                       CURLOPT_NOSIGNAL,
                       CURLOPT_PROXYTYPE,
                       CURLOPT_UNRESTRICTED_AUTH,
                       CURLOPT_FTP_USE_EPRT,
                       CURLOPT_HTTPAUTH,
                       CURLOPT_FTP_CREATE_MISSING_DIRS,
                       CURLOPT_PROXYAUTH,
                       CURLOPT_FTP_RESPONSE_TIMEOUT,
                       CURLOPT_IPRESOLVE,
                       CURLOPT_MAXFILESIZE,
                       CURLOPT_FTP_SSL,
                       CURLOPT_TCP_NODELAY,
                       CURLOPT_FTPSSLAUTH,
                       CURLOPT_FILE,
                       CURLOPT_URL,
                       CURLOPT_PROXY,
                       CURLOPT_USERPWD,
                       CURLOPT_PROXYUSERPWD,
                       CURLOPT_RANGE,
                       CURLOPT_INFILE,
                       CURLOPT_ERRORBUFFER,
                       CURLOPT_POSTFIELDS,
                       CURLOPT_REFERER,
                       CURLOPT_FTPPORT,
                       CURLOPT_USERAGENT,
                       CURLOPT_COOKIE,
                       CURLOPT_HTTPHEADER,
                       CURLOPT_HTTPPOST,
                       CURLOPT_SSLCERT,
                       CURLOPT_SSLKEYPASSWD,
                       CURLOPT_QUOTE,
                       CURLOPT_WRITEHEADER,
                       CURLOPT_COOKIEFILE,
                       CURLOPT_CUSTOMREQUEST,
                       CURLOPT_STDERR,
                       CURLOPT_POSTQUOTE,
                       CURLOPT_WRITEINFO,
                       CURLOPT_PROGRESSDATA,
                       CURLOPT_INTERFACE,
                       CURLOPT_KRB4LEVEL,
                       CURLOPT_CAINFO,
                       CURLOPT_TELNETOPTIONS,
                       CURLOPT_RANDOM_FILE,
                       CURLOPT_EGDSOCKET,
                       CURLOPT_COOKIEJAR,
                       CURLOPT_SSL_CIPHER_LIST,
                       CURLOPT_SSLCERTTYPE,
                       CURLOPT_SSLKEY,
                       CURLOPT_SSLKEYTYPE,
                       CURLOPT_SSLENGINE,
                       CURLOPT_PREQUOTE,
                       CURLOPT_DEBUGDATA,
                       CURLOPT_CAPATH,
                       CURLOPT_SHARE,
                       CURLOPT_ENCODING,
                       CURLOPT_PRIVATE,
                       CURLOPT_HTTP200ALIASES,
                       CURLOPT_SSL_CTX_DATA,
                       CURLOPT_NETRC_FILE,
                       CURLOPT_SOURCE_USERPWD,
                       CURLOPT_SOURCE_PREQUOTE,
                       CURLOPT_SOURCE_POSTQUOTE,
                       CURLOPT_IOCTLDATA,
                       CURLOPT_SOURCE_URL,
                       CURLOPT_SOURCE_QUOTE,
                       CURLOPT_FTP_ACCOUNT,
                       CURLOPT_WRITEFUNCTION,
                       CURLOPT_READFUNCTION,
                       CURLOPT_PROGRESSFUNCTION,
                       CURLOPT_HEADERFUNCTION,
                       CURLOPT_DEBUGFUNCTION,
                       CURLOPT_SSL_CTX_FUNCTION,
                       CURLOPT_IOCTLFUNCTION,
                       CURLOPT_INFILESIZE_LARGE,
                       CURLOPT_RESUME_FROM_LARGE,
                       CURLOPT_MAXFILESIZE_LARGE,
                       CURLOPT_POSTFIELDSIZE_LARGE,
                       CURLOPT_LASTENTRY); -- what value?

   for Curloption use (CURLOPT_PORT => (CURLOPTTYPE_LONG + 3),
                       CURLOPT_TIMEOUT => (CURLOPTTYPE_LONG + 13),
                       CURLOPT_INFILESIZE => (CURLOPTTYPE_LONG + 14),
                       CURLOPT_LOW_SPEED_LIMIT => (CURLOPTTYPE_LONG  + 19),
                       CURLOPT_LOW_SPEED_TIME => (CURLOPTTYPE_LONG + 20),
                       CURLOPT_RESUME_FROM => (CURLOPTTYPE_LONG + 21),
                       CURLOPT_CRLF => (CURLOPTTYPE_LONG + 27),
                       CURLOPT_SSLVERSION => (CURLOPTTYPE_LONG + 32),
                       CURLOPT_TIMECONDITION => (CURLOPTTYPE_LONG + 33),
                       CURLOPT_TIMEVALUE => (CURLOPTTYPE_LONG + 34),
                       CURLOPT_VERBOSE => (CURLOPTTYPE_LONG + 41),
                       CURLOPT_HEADER => (CURLOPTTYPE_LONG + 42),
                       CURLOPT_NOPROGRESS => (CURLOPTTYPE_LONG + 43),
                       CURLOPT_NOBODY => (CURLOPTTYPE_LONG + 44),
                       CURLOPT_FAILONERROR => (CURLOPTTYPE_LONG + 45),
                       CURLOPT_UPLOAD => (CURLOPTTYPE_LONG + 46),
                       CURLOPT_POST => (CURLOPTTYPE_LONG + 47),
                       CURLOPT_FTPLISTONLY => (CURLOPTTYPE_LONG + 48),
                       CURLOPT_FTPAPPEND => (CURLOPTTYPE_LONG + 50),
                       CURLOPT_NETRC => (CURLOPTTYPE_LONG + 51),
                       CURLOPT_FOLLOWLOCATION => (CURLOPTTYPE_LONG + 52),
                       CURLOPT_TRANSFERTEXT => (CURLOPTTYPE_LONG + 53),
                       CURLOPT_PUT => (CURLOPTTYPE_LONG + 54),
                       CURLOPT_AUTOREFERER => (CURLOPTTYPE_LONG + 58),
                       CURLOPT_PROXYPORT => (CURLOPTTYPE_LONG + 59),
                       CURLOPT_POSTFIELDSIZE => (CURLOPTTYPE_LONG + 60),
                       CURLOPT_HTTPPROXYTUNNEL => (CURLOPTTYPE_LONG + 61),
                       CURLOPT_SSL_VERIFYPEER => (CURLOPTTYPE_LONG + 64),
                       CURLOPT_MAXREDIRS => (CURLOPTTYPE_LONG + 68),
                       CURLOPT_FILETIME => (CURLOPTTYPE_LONG + 69),
                       CURLOPT_MAXCONNECTS => (CURLOPTTYPE_LONG + 71),
                       CURLOPT_CLOSEPOLICY => (CURLOPTTYPE_LONG + 72),
                       CURLOPT_FRESH_CONNECT => (CURLOPTTYPE_LONG + 74),
                       CURLOPT_FORBID_REUSE => (CURLOPTTYPE_LONG + 75),
                       CURLOPT_CONNECTTIMEOUT => (CURLOPTTYPE_LONG + 78),
                       CURLOPT_HTTPGET => (CURLOPTTYPE_LONG + 80),
                       CURLOPT_SSL_VERIFYHOST => (CURLOPTTYPE_LONG + 81),
                       CURLOPT_HTTP_VERSION => (CURLOPTTYPE_LONG + 84),
                       CURLOPT_FTP_USE_EPSV => (CURLOPTTYPE_LONG + 85),
                       CURLOPT_SSLENGINE_DEFAULT => (CURLOPTTYPE_LONG + 90),
                       CURLOPT_DNS_USE_GLOBAL_CACHE =>(CURLOPTTYPE_LONG
+ 91),
                       CURLOPT_DNS_CACHE_TIMEOUT => (CURLOPTTYPE_LONG + 92),
                       CURLOPT_COOKIESESSION => (CURLOPTTYPE_LONG + 96),
                       CURLOPT_BUFFERSIZE => (CURLOPTTYPE_LONG + 98),
                       CURLOPT_NOSIGNAL => (CURLOPTTYPE_LONG + 99),
                       CURLOPT_PROXYTYPE => (CURLOPTTYPE_LONG + 101),
                       CURLOPT_UNRESTRICTED_AUTH => (CURLOPTTYPE_LONG +
105),
                       CURLOPT_FTP_USE_EPRT => (CURLOPTTYPE_LONG + 106),
                       CURLOPT_HTTPAUTH => (CURLOPTTYPE_LONG + 107),
                       CURLOPT_FTP_CREATE_MISSING_DIRS =>
(CURLOPTTYPE_LONG + 110),
                       CURLOPT_PROXYAUTH => (CURLOPTTYPE_LONG + 111),
                       CURLOPT_FTP_RESPONSE_TIMEOUT => (CURLOPTTYPE_LONG
+ 112),
                       CURLOPT_IPRESOLVE => (CURLOPTTYPE_LONG + 113),
                       CURLOPT_MAXFILESIZE => (CURLOPTTYPE_LONG + 114),
                       CURLOPT_FTP_SSL => (CURLOPTTYPE_LONG + 119),
                       CURLOPT_TCP_NODELAY => (CURLOPTTYPE_LONG + 121),
                       CURLOPT_FTPSSLAUTH => (CURLOPTTYPE_LONG + 129),
                       CURLOPT_FILE => (CURLOPTTYPE_OBJECTPOINT + 1),
                       CURLOPT_URL => (CURLOPTTYPE_OBJECTPOINT + 2),
                       CURLOPT_PROXY => (CURLOPTTYPE_OBJECTPOINT + 4),
                       CURLOPT_USERPWD => (CURLOPTTYPE_OBJECTPOINT + 5),
                       CURLOPT_PROXYUSERPWD => (CURLOPTTYPE_OBJECTPOINT
+ 6),
                       CURLOPT_RANGE => (CURLOPTTYPE_OBJECTPOINT + 7),
                       CURLOPT_INFILE => (CURLOPTTYPE_OBJECTPOINT + 9),
                       CURLOPT_ERRORBUFFER => (CURLOPTTYPE_OBJECTPOINT +
10),
                       CURLOPT_POSTFIELDS => (CURLOPTTYPE_OBJECTPOINT + 15),
                       CURLOPT_REFERER => (CURLOPTTYPE_OBJECTPOINT + 16),
                       CURLOPT_FTPPORT => (CURLOPTTYPE_OBJECTPOINT + 17),
                       CURLOPT_USERAGENT => (CURLOPTTYPE_OBJECTPOINT + 18),
                       CURLOPT_COOKIE => (CURLOPTTYPE_OBJECTPOINT + 22),
                       CURLOPT_HTTPHEADER => (CURLOPTTYPE_OBJECTPOINT + 23),
                       CURLOPT_HTTPPOST => (CURLOPTTYPE_OBJECTPOINT + 24),
                       CURLOPT_SSLCERT => (CURLOPTTYPE_OBJECTPOINT + 25),
                       CURLOPT_SSLKEYPASSWD => (CURLOPTTYPE_OBJECTPOINT
+ 26),
                       CURLOPT_QUOTE => (CURLOPTTYPE_OBJECTPOINT + 28),
                       CURLOPT_WRITEHEADER => (CURLOPTTYPE_OBJECTPOINT +
29),
                       CURLOPT_COOKIEFILE => (CURLOPTTYPE_OBJECTPOINT + 31),
                       CURLOPT_CUSTOMREQUEST =>(CURLOPTTYPE_OBJECTPOINT
+ 36),
                       CURLOPT_STDERR => (CURLOPTTYPE_OBJECTPOINT + 37),
                       CURLOPT_POSTQUOTE => (CURLOPTTYPE_OBJECTPOINT + 39),
                       CURLOPT_WRITEINFO => (CURLOPTTYPE_OBJECTPOINT + 40),
                       CURLOPT_PROGRESSDATA => (CURLOPTTYPE_OBJECTPOINT
+ 57),
                       CURLOPT_INTERFACE => (CURLOPTTYPE_OBJECTPOINT + 62),
                       CURLOPT_KRB4LEVEL => (CURLOPTTYPE_OBJECTPOINT + 63),
                       CURLOPT_CAINFO => (CURLOPTTYPE_OBJECTPOINT + 65),
                       CURLOPT_TELNETOPTIONS =>(CURLOPTTYPE_OBJECTPOINT
+ 70),
                       CURLOPT_RANDOM_FILE => (CURLOPTTYPE_OBJECTPOINT +
76),
                       CURLOPT_EGDSOCKET => (CURLOPTTYPE_OBJECTPOINT + 77),
                       CURLOPT_COOKIEJAR => (CURLOPTTYPE_OBJECTPOINT + 82),
                       CURLOPT_SSL_CIPHER_LIST=>(CURLOPTTYPE_OBJECTPOINT
+83),
                       CURLOPT_SSLCERTTYPE => (CURLOPTTYPE_OBJECTPOINT +
86),
                       CURLOPT_SSLKEY => (CURLOPTTYPE_OBJECTPOINT + 87),
                       CURLOPT_SSLKEYTYPE => (CURLOPTTYPE_OBJECTPOINT + 88),
                       CURLOPT_SSLENGINE => (CURLOPTTYPE_OBJECTPOINT + 89),
                       CURLOPT_PREQUOTE => (CURLOPTTYPE_OBJECTPOINT + 93),
                       CURLOPT_DEBUGDATA => (CURLOPTTYPE_OBJECTPOINT + 95),
                       CURLOPT_CAPATH => (CURLOPTTYPE_OBJECTPOINT + 97),
                       CURLOPT_SHARE => (CURLOPTTYPE_OBJECTPOINT + 100),
                       CURLOPT_ENCODING => (CURLOPTTYPE_OBJECTPOINT + 102),
                       CURLOPT_PRIVATE => (CURLOPTTYPE_OBJECTPOINT + 103),
                       CURLOPT_HTTP200ALIASES=>(CURLOPTTYPE_OBJECTPOINT
+104),
                       CURLOPT_SSL_CTX_DATA=>(CURLOPTTYPE_OBJECTPOINT +109),
                       CURLOPT_NETRC_FILE=>(CURLOPTTYPE_OBJECTPOINT + 118),
                       CURLOPT_SOURCE_USERPWD =>
(CURLOPTTYPE_OBJECTPOINT + 123),
                       CURLOPT_SOURCE_PREQUOTE =>
(CURLOPTTYPE_OBJECTPOINT + 127),

CURLOPT_SOURCE_POSTQUOTE=>(CURLOPTTYPE_OBJECTPOINT+128),
                       CURLOPT_IOCTLDATA => (CURLOPTTYPE_OBJECTPOINT + 131),
                       CURLOPT_SOURCE_URL => (CURLOPTTYPE_OBJECTPOINT +
132),
                       CURLOPT_SOURCE_QUOTE => (CURLOPTTYPE_OBJECTPOINT
+ 133),
                       CURLOPT_FTP_ACCOUNT => (CURLOPTTYPE_OBJECTPOINT +
134),
                       CURLOPT_WRITEFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT
+11),
                       CURLOPT_READFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT
+ 12),

CURLOPT_PROGRESSFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT+56),

CURLOPT_HEADERFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT + 79),
                       CURLOPT_DEBUGFUNCTION=>(CURLOPTTYPE_FUNCTIONPOINT
+ 94),
                       CURLOPT_SSL_CTX_FUNCTION =>
(CURLOPTTYPE_FUNCTIONPOINT + 108),
                       CURLOPT_IOCTLFUNCTION =>
(CURLOPTTYPE_FUNCTIONPOINT + 130),
                       CURLOPT_INFILESIZE_LARGE => (CURLOPTTYPE_OFF_T +
115),
                       CURLOPT_RESUME_FROM_LARGE => (CURLOPTTYPE_OFF_T +
116),
                       CURLOPT_MAXFILESIZE_LARGE => (CURLOPTTYPE_OFF_T +
117),
                       CURLOPT_POSTFIELDSIZE_LARGE => (CURLOPTTYPE_OFF_T
+ 120),
                       CURLOPT_LASTENTRY => (CURLOPTTYPE_OFF_T + 121)
                       );
   pragma Convention(C,Curloption);

   CURL_IPRESOLVE_WHATEVER : constant := 0;
   CURL_IPRESOLVE_V4       : constant := 1;
   CURL_IPRESOLVE_V6       : constant := 2;

   CURLOPT_WRITEDATA  : constant Curloption := CURLOPT_FILE;
   CURLOPT_READDATA   : constant Curloption := CURLOPT_INFILE;
   CURLOPT_HEADERDATA : constant Curloption := CURLOPT_WRITEHEADER;

   type Curl_Http_Version is (CURL_HTTP_VERSION_NONE,
                              CURL_HTTP_VERSION_1_0,
                              CURL_HTTP_VERSION_1_1,
                              CURL_HTTP_VERSION_LAST);
   pragma Convention(C,Curl_Http_Version);

   type Curl_Netrc_Option is (CURL_NETRC_IGNORED,
                              CURL_NETRC_OPTIONAL,
                              CURL_NETRC_REQUIRED,
                              CURL_NETRC_LAST);
   pragma Convention(C,Curl_Netrc_Option);

   type Curl_Ssl_Version is (CURL_SSLVERSION_DEFAULT,
                             CURL_SSLVERSION_TLSv1,
                             CURL_SSLVERSION_SSLv2,
                             CURL_SSLVERSION_SSLv3,
                             CURL_SSLVERSION_LAST);
   pragma Convention(C,Curl_Ssl_Version);

   type Curl_Timecond is (CURL_TIMECOND_NONE,
                          CURL_TIMECOND_IFMODSINCE,
                          CURL_TIMECOND_IFUNMODSINCE,
                          CURL_TIMECOND_LASTMOD,
                          CURL_TIMECOND_LAST);
   pragma Convention(C,Curl_Timecond);

   type Curlformoption is (CURLFORM_NOTHING,
                           CURLFORM_COPYNAME,
                           CURLFORM_PTRNAME,
                           CURLFORM_NAMELENGTH,
                           CURLFORM_COPYCONTENTS,
                           CURLFORM_PTRCONTENTS,
                           CURLFORM_CONTENTSLENGTH,
                           CURLFORM_FILECONTENT,
                           CURLFORM_ARRAY,
                           CURLFORM_OBSOLETE,
                           CURLFORM_FILE,
                           CURLFORM_BUFFER,
                           CURLFORM_BUFFERPTR,
                           CURLFORM_BUFFERLENGTH,
                           CURLFORM_CONTENTTYPE,
                           CURLFORM_CONTENTHEADER,
                           CURLFORM_FILENAME,
                           CURLFORM_END,
                           CURLFORM_OBSOLETE2,
                           CURLFORM_LASTENTRY);
   pragma Convention(C,Curlformoption);

   type Curl_Forms is record
      Option : Curlformoption;
      Value  : chars_ptr;
   end record;

   type Curlformcode is (CURL_FORMADD_OK,
                         CURL_FORMADD_MEMORY,
                         CURL_FORMADD_OPTION_TWICE,
                         CURL_FORMADD_NULL,
                         CURL_FORMADD_UNKNOWN_OPTION,
                         CURL_FORMADD_INCOMPLETE,
                         CURL_FORMADD_ILLEGAL_ARRAY,
                         CURL_FORMADD_DISABLED,
                         CURL_FORMADD_LAST);
   pragma Convention(C,Curlformcode);


   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : chars_ptr)
                         return Curlformcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : long;
                          E1 : Curlformoption)
                         return Curlformcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : chars_ptr;
                          C2 : Curlformoption;
                          D2 : chars_ptr;
                          E1 : Curlformoption)
                         return Curlformcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : chars_ptr;
                          C2 : Curlformoption;
                          D2 : long;
                          E1 : Curlformoption)
                         return Curlformcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : long;
                          C2 : Curlformoption;
                          D2 : long;
                          E1 : Curlformoption)
                         return Curlformcode;
   function Curl_Formadd (Httppost  : access Curl_Httppost_P;
                          Last_Post : access Curl_Httppost_P;
                          C1 : Curlformoption;
                          D1 : long;
                          C2 : Curlformoption;
                          D2 : chars_ptr;
                          E1 : Curlformoption)
                         return Curlformcode;

   procedure Curl_Formfree(Form : Curl_Httppost_P);

   function Curl_Getenv(Variable : chars_ptr) return chars_ptr;

   function Curl_Version return chars_ptr;

   function Curl_Escape(String : chars_ptr;
                        Length : int) return chars_ptr;

   function Curl_Unescape(String : chars_ptr;
                          Length : int) return chars_ptr;

   procedure Curl_Free(P : System.Address);

   function Curl_Global_Init(Flags : long) return Curlcode;

   -- Added 20211029 to avoid warnings like below...
   -- 706 subprogram pointer "Curl_Global_Init_Mem.M" should have
foreign convention [-gnatwx]
   -- 706 add Convention pragma to declaration of
"Adacurl.Curl_Malloc_Callback" at line 146 [-gnatwx]
   pragma Convention(C,Curl_Malloc_Callback);
   pragma Convention(C,Curl_Free_Callback);
   pragma Convention(C,Curl_Realloc_Callback);
   pragma Convention(C,Curl_Strdup_Callback);
   pragma Convention(C,Curl_Calloc_Callback);

   function Curl_Global_Init_Mem(Flags : long;
                                 M     : Curl_Malloc_Callback;
                                 F     : Curl_Free_Callback;
                                 R     : Curl_Realloc_Callback;
                                 S     : Curl_Strdup_Callback;
                                 C     : Curl_Calloc_Callback)
                                return Curlcode;

   procedure Curl_Global_Cleanup;

   function Curl_Slist_Append (A1 : Curl_Slist_P;
                               A2 : chars_ptr)
                              return Curl_Slist_P;

   procedure Curl_Slist_Free_All(A1 : Curl_Slist_P);

   function Curl_Getdate(P   : chars_ptr;
                         Now : Time_T_Pointer)
                        return Time_T;

   CURLINFO_STRING   : constant := 16#100000#;
   CURLINFO_LONG     : constant := 16#200000#;
   CURLINFO_DOUBLE   : constant := 16#300000#;
   CURLINFO_SLIST    : constant := 16#400000#;
   CURLINFO_MASK     : constant := 16#0fffff#;
   CURLINFO_TYPEMASK : constant := 16#f00000#;

   type Curlinfo is (CURLINFO_NONE             ,
                     CURLINFO_EFFECTIVE_URL    ,
                     CURLINFO_CONTENT_TYPE ,
                     CURLINFO_PRIVATE ,
                     CURLINFO_RESPONSE_CODE        ,
                     CURLINFO_HEADER_SIZE      ,
                     CURLINFO_REQUEST_SIZE     ,
                     CURLINFO_SSL_VERIFYRESULT ,
                     CURLINFO_FILETIME         ,
                     CURLINFO_REDIRECT_COUNT  ,
                     CURLINFO_HTTP_CONNECTCODE,
                     CURLINFO_HTTPAUTH_AVAIL,
                     CURLINFO_PROXYAUTH_AVAIL,
                     CURLINFO_OS_ERRNO,
                     CURLINFO_NUM_CONNECTS,
                     CURLINFO_TOTAL_TIME       ,
                     CURLINFO_NAMELOOKUP_TIME  ,
                     CURLINFO_CONNECT_TIME     ,
                     CURLINFO_PRETRANSFER_TIME ,
                     CURLINFO_SIZE_UPLOAD      ,
                     CURLINFO_SIZE_DOWNLOAD    ,
                     CURLINFO_SPEED_DOWNLOAD   ,
                     CURLINFO_SPEED_UPLOAD     ,
                     CURLINFO_CONTENT_LENGTH_DOWNLOAD   ,
                     CURLINFO_CONTENT_LENGTH_UPLOAD     ,
                     CURLINFO_STARTTRANSFER_TIME ,
                     CURLINFO_REDIRECT_TIME   ,
                     CURLINFO_SSL_ENGINES,
                     CURLINFO_LASTONE);
   for Curlinfo use (CURLINFO_NONE             => 0,
                     CURLINFO_EFFECTIVE_URL    => CURLINFO_STRING + 1,
                     CURLINFO_CONTENT_TYPE     => CURLINFO_STRING + 18,
                     CURLINFO_PRIVATE          => CURLINFO_STRING + 21,
                     CURLINFO_RESPONSE_CODE    => CURLINFO_LONG   + 2,
                     CURLINFO_HEADER_SIZE      => CURLINFO_LONG   + 11,
                     CURLINFO_REQUEST_SIZE     => CURLINFO_LONG   + 12,
                     CURLINFO_SSL_VERIFYRESULT => CURLINFO_LONG   + 13,
                     CURLINFO_FILETIME         => CURLINFO_LONG   + 14,
                     CURLINFO_REDIRECT_COUNT   => CURLINFO_LONG   + 20,
                     CURLINFO_HTTP_CONNECTCODE => CURLINFO_LONG   + 22,
                     CURLINFO_HTTPAUTH_AVAIL   => CURLINFO_LONG   + 23,
                     CURLINFO_PROXYAUTH_AVAIL  => CURLINFO_LONG   + 24,
                     CURLINFO_OS_ERRNO         => CURLINFO_LONG   + 25,
                     CURLINFO_NUM_CONNECTS     => CURLINFO_LONG   + 26,
                     CURLINFO_TOTAL_TIME       => CURLINFO_DOUBLE + 3,
                     CURLINFO_NAMELOOKUP_TIME  => CURLINFO_DOUBLE + 4,
                     CURLINFO_CONNECT_TIME     => CURLINFO_DOUBLE + 5,
                     CURLINFO_PRETRANSFER_TIME => CURLINFO_DOUBLE + 6,
                     CURLINFO_SIZE_UPLOAD      => CURLINFO_DOUBLE + 7,
                     CURLINFO_SIZE_DOWNLOAD    => CURLINFO_DOUBLE + 8,
                     CURLINFO_SPEED_DOWNLOAD   => CURLINFO_DOUBLE + 9,
                     CURLINFO_SPEED_UPLOAD     => CURLINFO_DOUBLE + 10,
                     CURLINFO_CONTENT_LENGTH_DOWNLOAD => CURLINFO_DOUBLE
+ 15,
                     CURLINFO_CONTENT_LENGTH_UPLOAD   => CURLINFO_DOUBLE
+ 16,
                     CURLINFO_STARTTRANSFER_TIME      => CURLINFO_DOUBLE
+ 17,
                     CURLINFO_REDIRECT_TIME           => CURLINFO_DOUBLE
+ 19,

                     CURLINFO_SSL_ENGINES      => CURLINFO_SLIST + 27,

                     CURLINFO_LASTONE                => CURLINFO_SLIST +
28);
   pragma Convention(C,Curlinfo);

   type Curl_Closepolicy is (CURLCLOSEPOLICY_NONE,
                             CURLCLOSEPOLICY_OLDEST,
                             CURLCLOSEPOLICY_LEAST_RECENTLY_USED,
                             CURLCLOSEPOLICY_LEAST_TRAFFIC,
                             CURLCLOSEPOLICY_SLOWEST,
                             CURLCLOSEPOLICY_CALLBACK,
                             CURLCLOSEPOLICY_LAST);
   pragma Convention(C,Curl_Closepolicy);

   CURL_GLOBAL_SSL     : constant := 1;
   CURL_GLOBAL_WIN32   : constant := 2;
   CURL_GLOBAL_ALL     : constant := CURL_GLOBAL_SSL + CURL_GLOBAL_WIN32;
   CURL_GLOBAL_NOTHING : constant := 0;
   CURL_GLOBAL_DEFAULT : constant := CURL_GLOBAL_ALL;

   type Curl_Lock_Data is (CURL_LOCK_DATA_NONE,
                           CURL_LOCK_DATA_SHARE,
                           CURL_LOCK_DATA_COOKIE,
                           CURL_LOCK_DATA_DNS,
                           CURL_LOCK_DATA_SSL_SESSION,
                           CURL_LOCK_DATA_CONNECT,
                           CURL_LOCK_DATA_LAST);
   pragma Convention(C,Curl_Lock_Data);

   type Curl_Lock_Access is (CURL_LOCK_ACCESS_NONE,
                             CURL_LOCK_ACCESS_SHARED,
                             CURL_LOCK_ACCESS_SINGLE,
                             CURL_LOCK_ACCESS_LAST);
   pragma Convention(C,Curl_Lock_Access);

   type Curl_Lock_Function is access procedure (Handle : CURL_P;
                                                Data : Curl_Lock_Data;
                                                Locktype : Curl_Lock_Access;
                                                Userptr : System.Address);

   type Curl_Unlock_Function is access procedure (Handle : CURL_P;
                                                  Data : Curl_Lock_Data;
                                                  Userptr : System.Address);

   type CURLSH is new System.Address;
   type CURLSH_P is access all CURLSH;

   type CURLSHcode is (CURLSHE_OK,
                       CURLSHE_BAD_OPTION,
                       CURLSHE_IN_USE,
                       CURLSHE_INVALID,
                       CURLSHE_LAST);

   type CURLSHoption is (CURLSHOPT_NONE,
                         CURLSHOPT_SHARE,
                         CURLSHOPT_UNSHARE,
                         CURLSHOPT_LOCKFUNC,
                         CURLSHOPT_UNLOCKFUNC,
                         CURLSHOPT_USERDATA,
                         CURLSHOPT_LAST);

   function Curl_Share_Init return CURLSH_P;
   function Curl_Share_Setopt(H : CURLSH_P;
                              Option : CURLSHoption;
                              D : System.Address) return CURLSHcode;

   -- Added sr@20211029 to avoid warnings
   pragma Convention(C,Curl_Lock_Function);
   pragma Convention(C,Curl_Unlock_Function);

   function Curl_Share_Setopt(H : CURLSH_P;
                              Option : CURLSHoption;
                              D : Curl_Lock_Function) return CURLSHcode;
   function Curl_Share_Setopt(H : CURLSH_P;
                              Option : CURLSHoption;
                              D : Curl_Unlock_Function) return CURLSHcode;

   function Curl_Share_Cleanup(H : CURLSH_P) return CURLSHcode;

   type Curlversion is (CURLVERSION_FIRST,
                        CURLVERSION_SECOND,
                        CURLVERSION_THIRD,
                        CURLVERSION_LAST);
   pragma Convention(C,Curlversion);

   CURLVERSION_NOW : constant Curlversion := CURLVERSION_THIRD;

   type Curl_Version_Info_Data is record
      Age : Curlversion;
      Version : chars_ptr;
      Version_Num : unsigned;
      Host : chars_ptr;
      Features : int;
      Ssl_Version : chars_ptr;
      Ssl_Version_Num : long;
      Libz_Version : chars_ptr;
      Protocols : chars_ptr;
      ares : chars_ptr;
      Ares_Num : int;
      Libidn : chars_ptr;
   end record;
   pragma Convention(C,Curl_Version_Info_Data);

   type Curl_Version_Info_Data_P is access all Curl_Version_Info_Data;

   CURL_VERSION_IPV6         : constant := 1;
   CURL_VERSION_KERBEROS4    : constant := 2;
   CURL_VERSION_SSL          : constant := 4;
   CURL_VERSION_LIBZ         : constant := 8;
   CURL_VERSION_NTLM         : constant := 16;
   CURL_VERSION_GSSNEGOTIATE : constant := 32;
   CURL_VERSION_DEBUG        : constant := 64;
   CURL_VERSION_ASYNCHDNS    : constant := 128;
   CURL_VERSION_SPNEGO       : constant := 256;
   CURL_VERSION_LARGEFILE    : constant := 512;
   CURL_VERSION_IDN          : constant := 1024;
   CURL_VERSION_SSPI         : constant := 2048;

   function Curl_Version_Info(A1 : Curlversion) return
Curl_Version_Info_Data_P;

   function Curl_Easy_Strerror(C : Curlcode) return chars_ptr;
   function Curl_Share_Strerror(C : CURLSHcode) return chars_ptr;


---------------------------------------------------------------------------
   -- cURL easy low level functions

---------------------------------------------------------------------------

   function Curl_Easy_Init return CURL_P;

   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : chars_ptr) return Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : long) return Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : double) return Curlcode;

   -- Added sr@20211029 to avoid warnings
   pragma Convention(C,Curl_Readwrite_Callback);
   pragma Convention(C,Curl_Passwd_Callback);
   pragma Convention(C,Curl_Progress_Callback);
   pragma Convention(C,Curl_Ssl_Ctx_Callback);

   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : Curl_Readwrite_Callback)
                            return Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : Curl_Passwd_Callback) return Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : Curl_Progress_Callback) return
Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : Curl_Ssl_Ctx_Callback) return
Curlcode;
   function Curl_Easy_Setopt(C : CURL_P;
                             Option : Curloption;
                             Datap  : file_p) return Curlcode;

   function Curl_Easy_Perform(C : CURL_P) return Curlcode;
   procedure Curl_Easy_Cleanup(C : CURL_P);
   procedure Curl_Easy_Reset(C : CURL_P);

   function Curl_Easy_Getinfo(C : CURL_P;
                              Option : Curlinfo;
                              Datap  : access chars_ptr) return Curlcode;
   function Curl_Easy_Getinfo(C : CURL_P;
                              Option : Curlinfo;
                              Datap  : access long) return Curlcode;
   function Curl_Easy_Getinfo(C : CURL_P;
                              Option : Curlinfo;
                              Datap  : access double) return Curlcode;

   function Curl_Easy_Duphandle(C : CURL_P) return CURL_P;


---------------------------------------------------------------------------
   -- cURL multi low level functions

---------------------------------------------------------------------------

   subtype CURLM is System.Address;
   type CURLM_P is access all CURLM;

   type CURLMcode is (CURLM_CALL_MULTI_PERFORM,
                      CURLM_OK,
                      CURLM_BAD_HANDLE,
                      CURLM_BAD_EASY_HANDLE,
                      CURLM_OUT_OF_MEMORY,
                      CURLM_INTERNAL_ERROR,
                      CURLM_LAST);

   for CURLMcode use (CURLM_CALL_MULTI_PERFORM => -1,
                      CURLM_OK => 0,
                      CURLM_BAD_HANDLE => 1,
                      CURLM_BAD_EASY_HANDLE => 2,
                      CURLM_OUT_OF_MEMORY => 3,
                      CURLM_INTERNAL_ERROR => 4,
                      CURLM_LAST => 5);
   pragma Convention(C,CURLMcode);

   type CURL_MSG is (CURLMSG_NONE,
                     CURLMSG_DONE,
                     CURLMSG_LAST);
   pragma Convention(C,CURL_MSG);

   type Data_Union_Range is new Positive range 1..2;
   type Data_Union (Which : Data_Union_Range := 1) is record
      case Which is
         when 1 =>
            Whatever : System.Address;
         when 2 =>
            Result : Curlcode;
      end case;
   end record;
   pragma Unchecked_Union(Data_Union);

   type Curlmsg is record
      Msg         : CURL_MSG;
      Easy_Handle : CURL_P;
      Data        : Data_Union;
   end record;
   pragma Convention(C,Curlmsg);
   type Curlmsg_P is access all Curlmsg;
   pragma Convention(C,Curlmsg_P);

   function Curl_Multi_Init return CURLM_P;


   function Curl_Multi_Add_Handle(Multi_Handle : CURLM_P;
                                  Curl_Handle  : CURLM_P) return CURLMcode;

   function Curl_Multi_Remove_Handle(Multi_Handle : CURLM_P;
                                     Curl_Handle  : CURLM_P)
                                    return CURLMcode;
   -- Use POSIX style fd_set
   ALIGNMENT : constant := Natural'Min (Standard'Maximum_Alignment,8);
   type Fd_Set is array (1 .. 32) of int;
   for Fd_Set'Alignment use ALIGNMENT;
   for Fd_Set'Size use 1024;
   pragma Convention (C,Fd_Set);

   type Fd_Set_P is access all Fd_Set;
   pragma Convention (C, Fd_Set_P);

   function Curl_Multi_Fdset(Multi_Handle : CURLM_P;
                             Read_Fd_Set  : Fd_Set;
                             Write_Fd_Set : Fd_Set;
                             Exc_Fd_Se    : Fd_Set;
                             Max_Fd       : access int) return CURLMcode;

   function Curl_Multi_Perform(Multi_Handle : CURLM_P;
                               Running_Handles : access int)
                              return CURLMcode;

   function Curl_Multi_Cleanup(Multi_Handle : CURLM_P) return CURLMcode;

   function Curl_Multi_Info_Read(Multi_Handle  : CURLM_P;
                                 Msgs_In_Queue : access int)
                                return Curlmsg_P;

   function Curl_Multi_Strerror(C : CURLMcode) return chars_ptr;


---------------------------------------------------------------------------
   -- cURL v20 high level function

---------------------------------------------------------------------------

   procedure test1;

-------------------------------------------------------------------------------
private

   pragma Import(C,Curl_Formadd,"curl_formadd");
   pragma Import(C,Curl_Formfree,"curl_formfree");
   pragma Import(C,Curl_Getenv,"curl_getenv");
   pragma Import(C,Curl_Version,"curl_version");
   pragma Import(C,Curl_Escape,"curl_escape");
   pragma Import(C,Curl_Unescape,"curl_unescape");
   pragma Import(C,Curl_Free,"curl_free");
   pragma Import(C,Curl_Global_Init,"curl_global_init");
   pragma Import(C,Curl_Global_Init_Mem,"curl_global_init_mem");
   pragma Import(C,Curl_Global_Cleanup,"curl_global_cleanup");
   pragma Import(C,Curl_Slist_Append,"curl_slist_append");
   pragma Import(C,Curl_Slist_Free_All,"curl_slist_free_all");
   pragma Import(C,Curl_Getdate,"curl_getdate");
   pragma Import(C,Curl_Version_Info,"curl_version_info");
   pragma Import(C,Curl_Share_Init,"curl_share_init");
   pragma Import(C,Curl_Share_Setopt,"curl_share_setopt");
   pragma Import(C,Curl_Share_Cleanup,"curl_share_cleanup");
   pragma Import(C,Curl_Easy_Strerror,"Curl_Easy_Strerror");
   pragma Import(C,Curl_Share_Strerror,"curl_share_strerror");

   pragma Import(C,Curl_Easy_Init,"curl_easy_init");
   pragma Import(C,Curl_Easy_Setopt,"curl_easy_setopt");
   pragma Import(C,Curl_Easy_Perform,"curl_easy_perform");
   pragma Import(C,Curl_Easy_Cleanup,"curl_easy_cleanup");
   pragma Import(C,Curl_Easy_Reset,"curl_easy_reset");
   pragma Import(C,Curl_Easy_Getinfo,"curl_easy_getinfo");
   pragma Import(C,Curl_Easy_Duphandle,"curl_easy_duphandle");

   pragma Import(C,Curl_Multi_Init,"curl_multi_Init");
   pragma Import(C,Curl_Multi_Add_Handle,"curl_multi_add_handle");
   pragma Import(C,Curl_Multi_Cleanup,"curl_multi_cleanup");
   pragma Import(C,Curl_Multi_Fdset,"curl_multi_fdset");
   pragma Import(C,Curl_Multi_Info_Read,"curl_multi_info_read");
   pragma Import(C,Curl_Multi_Perform,"curl_multi_perform");
   pragma Import(C,Curl_Multi_Remove_Handle,"curl_multi_remove_handle");
   pragma Import(C,Curl_Multi_Strerror,"curl_multi_strerror");

-------------------------------------------------------------------------------
end v20.Crl;
-------------------------------------------------------------------------------


-- 
Stéphane Rivière
Ile d'Oléron - France

_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france
sow - Ada cURL digest manual.odt (application/vnd.oasis.opendocument.text, 124.2 KB) - not displayed