// 7.63.0 module lib+ { module curl+ { module so { struct struct { curl_easy_cleanup void; curl_easy_getinfo void; curl_easy_init void; curl_easy_perform void; curl_easy_setopt void; curl_easy_strerror void; curl_global_cleanup void; curl_global_init void; curl_slist_append void; curl_slist_free_all void; } var fn struct; func init() bool { import rt::c; return dlsyms(dlopen("libcurl.so.4", RTLD_LAZY), &fn, "curl_easy_cleanup", "curl_easy_getinfo", "curl_easy_init", "curl_easy_perform", "curl_easy_setopt", "curl_easy_strerror", "curl_global_cleanup", "curl_global_init", "curl_slist_append", "curl_slist_free_all" ); } } } module curl+ { enum CURLcode; enum { CURLE_OK = 0, CURLE_UNSUPPORTED_PROTOCOL, /* 1 */ CURLE_FAILED_INIT, /* 2 */ CURLE_URL_MALFORMAT, /* 3 */ CURLE_NOT_BUILT_IN, /* 4 - [was obsoleted in August 2007 for 7.17.0, reused in April 2011 for 7.21.5] */ CURLE_COULDNT_RESOLVE_PROXY, /* 5 */ CURLE_COULDNT_RESOLVE_HOST, /* 6 */ CURLE_COULDNT_CONNECT, /* 7 */ CURLE_WEIRD_SERVER_REPLY, /* 8 */ CURLE_REMOTE_ACCESS_DENIED, /* 9 a service was denied by the server due to lack of access - when login fails this is not returned. */ CURLE_FTP_ACCEPT_FAILED, /* 10 - [was obsoleted in April 2006 for 7.15.4, reused in Dec 2011 for 7.24.0]*/ CURLE_FTP_WEIRD_PASS_REPLY, /* 11 */ CURLE_FTP_ACCEPT_TIMEOUT, /* 12 - timeout occurred accepting server [was obsoleted in August 2007 for 7.17.0, reused in Dec 2011 for 7.24.0]*/ CURLE_FTP_WEIRD_PASV_REPLY, /* 13 */ CURLE_FTP_WEIRD_227_FORMAT, /* 14 */ CURLE_FTP_CANT_GET_HOST, /* 15 */ CURLE_HTTP2, /* 16 - A problem in the http2 framing layer. [was obsoleted in August 2007 for 7.17.0, reused in July 2014 for 7.38.0] */ CURLE_FTP_COULDNT_SET_TYPE, /* 17 */ CURLE_PARTIAL_FILE, /* 18 */ CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ CURLE_OBSOLETE20, /* 20 - NOT USED */ CURLE_QUOTE_ERROR, /* 21 - quote command failure */ CURLE_HTTP_RETURNED_ERROR, /* 22 */ CURLE_WRITE_ERROR, /* 23 */ CURLE_OBSOLETE24, /* 24 - NOT USED */ CURLE_UPLOAD_FAILED, /* 25 - failed upload "command" */ CURLE_READ_ERROR, /* 26 - couldn't open/read from file */ CURLE_OUT_OF_MEMORY, /* 27 */ /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error instead of a memory allocation error if CURL_DOES_CONVERSIONS is defined */ CURLE_OPERATION_TIMEDOUT, /* 28 - the timeout time was reached */ CURLE_OBSOLETE29, /* 29 - NOT USED */ CURLE_FTP_PORT_FAILED, /* 30 - FTP PORT operation failed */ CURLE_FTP_COULDNT_USE_REST, /* 31 - the REST command failed */ CURLE_OBSOLETE32, /* 32 - NOT USED */ CURLE_RANGE_ERROR, /* 33 - RANGE "command" didn't work */ CURLE_HTTP_POST_ERROR, /* 34 */ CURLE_SSL_CONNECT_ERROR, /* 35 - wrong when connecting with SSL */ CURLE_BAD_DOWNLOAD_RESUME, /* 36 - couldn't resume download */ CURLE_FILE_COULDNT_READ_FILE, /* 37 */ CURLE_LDAP_CANNOT_BIND, /* 38 */ CURLE_LDAP_SEARCH_FAILED, /* 39 */ CURLE_OBSOLETE40, /* 40 - NOT USED */ CURLE_FUNCTION_NOT_FOUND, /* 41 - NOT USED starting with 7.53.0 */ CURLE_ABORTED_BY_CALLBACK, /* 42 */ CURLE_BAD_FUNCTION_ARGUMENT, /* 43 */ CURLE_OBSOLETE44, /* 44 - NOT USED */ CURLE_INTERFACE_FAILED, /* 45 - CURLOPT_INTERFACE failed */ CURLE_OBSOLETE46, /* 46 - NOT USED */ CURLE_TOO_MANY_REDIRECTS, /* 47 - catch endless re-direct loops */ CURLE_UNKNOWN_OPTION, /* 48 - User specified an unknown option */ CURLE_TELNET_OPTION_SYNTAX, /* 49 - Malformed telnet option */ CURLE_OBSOLETE50, /* 50 - NOT USED */ CURLE_OBSOLETE51, /* 51 - NOT USED */ CURLE_GOT_NOTHING, /* 52 - when this is a specific error */ CURLE_SSL_ENGINE_NOTFOUND, /* 53 - SSL crypto engine not found */ CURLE_SSL_ENGINE_SETFAILED, /* 54 - can not set SSL crypto engine as default */ CURLE_SEND_ERROR, /* 55 - failed sending network data */ CURLE_RECV_ERROR, /* 56 - failure in receiving network data */ CURLE_OBSOLETE57, /* 57 - NOT IN USE */ CURLE_SSL_CERTPROBLEM, /* 58 - problem with the local certificate */ CURLE_SSL_CIPHER, /* 59 - couldn't use specified cipher */ CURLE_PEER_FAILED_VERIFICATION, /* 60 - peer's certificate or fingerprint wasn't verified fine */ CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized/bad encoding */ CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ CURLE_USE_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind that failed */ CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */ CURLE_LOGIN_DENIED, /* 67 - user, password or similar was not accepted and we failed to login */ CURLE_TFTP_NOTFOUND, /* 68 - file not found on server */ CURLE_TFTP_PERM, /* 69 - permission problem on server */ CURLE_REMOTE_DISK_FULL, /* 70 - out of disk space on server */ CURLE_TFTP_ILLEGAL, /* 71 - Illegal TFTP operation */ CURLE_TFTP_UNKNOWNID, /* 72 - Unknown transfer ID */ CURLE_REMOTE_FILE_EXISTS, /* 73 - File already exists */ CURLE_TFTP_NOSUCHUSER, /* 74 - No such user */ CURLE_CONV_FAILED, /* 75 - conversion failed */ CURLE_CONV_REQD, /* 76 - caller must register conversion callbacks using curl_easy_setopt options CURLOPT_CONV_FROM_NETWORK_FUNCTION, CURLOPT_CONV_TO_NETWORK_FUNCTION, and CURLOPT_CONV_FROM_UTF8_FUNCTION */ CURLE_SSL_CACERT_BADFILE, /* 77 - could not load CACERT file, missing or wrong format */ CURLE_REMOTE_FILE_NOT_FOUND, /* 78 - remote file not found */ CURLE_SSH, /* 79 - error from the SSH layer, somewhat generic so the error message will be of interest when this has happened */ CURLE_SSL_SHUTDOWN_FAILED, /* 80 - Failed to shut down the SSL connection */ CURLE_AGAIN, /* 81 - socket is not ready for send/recv, wait till it's ready and try again (Added in 7.18.2) */ CURLE_SSL_CRL_BADFILE, /* 82 - could not load CRL file, missing or wrong format (Added in 7.19.0) */ CURLE_SSL_ISSUER_ERROR, /* 83 - Issuer check failed. (Added in 7.19.0) */ CURLE_FTP_PRET_FAILED, /* 84 - a PRET command failed */ CURLE_RTSP_CSEQ_ERROR, /* 85 - mismatch of RTSP CSeq numbers */ CURLE_RTSP_SESSION_ERROR, /* 86 - mismatch of RTSP Session Ids */ CURLE_FTP_BAD_FILE_LIST, /* 87 - unable to parse FTP file list */ CURLE_CHUNK_FAILED, /* 88 - chunk callback reported error */ CURLE_NO_CONNECTION_AVAILABLE, /* 89 - No connection available, the session will be queued */ CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not match */ CURLE_SSL_INVALIDCERTSTATUS, /* 91 - invalid certificate status */ CURLE_HTTP2_STREAM, /* 92 - stream error in HTTP/2 framing layer */ CURLE_RECURSIVE_API_CALL, /* 93 - an api function was called from inside a callback */ CURL_LAST /* never use! */ } define { CURL_GLOBAL_SSL = 1 << 0; /* no purpose since since 7.57.0 */ CURL_GLOBAL_WIN32 = 1 << 1; CURL_GLOBAL_ALL = CURL_GLOBAL_SSL | CURL_GLOBAL_WIN32; CURL_GLOBAL_NOTHING = 0; CURL_GLOBAL_DEFAULT = CURL_GLOBAL_ALL; CURL_GLOBAL_ACK_EINTR = 1 << 2; } enum { CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd like the library to choose the best possible for us! */ CURL_HTTP_VERSION_1_0, /* please use HTTP 1.0 in the request */ CURL_HTTP_VERSION_1_1, /* please use HTTP 1.1 in the request */ CURL_HTTP_VERSION_2_0, /* please use HTTP 2 in the request */ CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */ CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, /* please use HTTP 2 without HTTP/1.1 Upgrade */ CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */ } enum curl_proxytype; /* this enum was added in 7.10 */ enum { CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use CONNECT HTTP/1.1 */ CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT HTTP/1.0 */ CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already in 7.10 */ CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the host name rather than the IP address. added in 7.18.0 */ } define { CURLOPTTYPE_LONG = 0; CURLOPTTYPE_OBJECTPOINT = 10000; CURLOPTTYPE_STRINGPOINT = 10000; CURLOPTTYPE_FUNCTIONPOINT = 20000; CURLOPTTYPE_OFF_T = 30000; } enum CURLoption; // xxx define { CURLOPT_WRITEDATA = CURLOPTTYPE_OBJECTPOINT + 1; CURLOPT_URL = CURLOPTTYPE_STRINGPOINT + 2; CURLOPT_PROXY = CURLOPTTYPE_STRINGPOINT + 4; CURLOPT_USERPWD = CURLOPTTYPE_STRINGPOINT + 5; CURLOPT_PROXYUSERPWD = CURLOPTTYPE_STRINGPOINT + 6; CURLOPT_READDATA = CURLOPTTYPE_OBJECTPOINT + 9; CURLOPT_WRITEFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 11; CURLOPT_READFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 12; CURLOPT_TIMEOUT = CURLOPTTYPE_LONG + 13; CURLOPT_INFILESIZE = CURLOPTTYPE_LONG + 14; CURLOPT_POSTFIELDS = CURLOPTTYPE_OBJECTPOINT + 15; CURLOPT_HTTPHEADER = CURLOPTTYPE_OBJECTPOINT + 23; CURLOPT_HEADERDATA = CURLOPTTYPE_OBJECTPOINT + 29; CURLOPT_COOKIEFILE = CURLOPTTYPE_STRINGPOINT + 31; CURLOPT_CUSTOMREQUEST = CURLOPTTYPE_STRINGPOINT + 36; CURLOPT_VERBOSE = CURLOPTTYPE_LONG + 41; CURLOPT_FAILONERROR = CURLOPTTYPE_LONG + 45; CURLOPT_UPLOAD = CURLOPTTYPE_LONG + 46; CURLOPT_POST = CURLOPTTYPE_LONG + 47; CURLOPT_FOLLOWLOCATION = CURLOPTTYPE_LONG + 52; CURLOPT_PUT = CURLOPTTYPE_LONG + 54; CURLOPT_POSTFIELDSIZE = CURLOPTTYPE_LONG + 60; CURLOPT_HTTPPROXYTUNNEL = CURLOPTTYPE_LONG + 61; CURLOPT_SSL_VERIFYPEER = CURLOPTTYPE_LONG + 64; CURLOPT_CONNECTTIMEOUT = CURLOPTTYPE_LONG + 78; CURLOPT_HEADERFUNCTION = CURLOPTTYPE_FUNCTIONPOINT + 79; CURLOPT_SSL_VERIFYHOST = CURLOPTTYPE_LONG + 81; CURLOPT_COOKIEJAR = CURLOPTTYPE_STRINGPOINT + 82; CURLOPT_HTTP_VERSION = CURLOPTTYPE_LONG + 84; CURLOPT_NOSIGNAL = CURLOPTTYPE_LONG + 99; CURLOPT_PROXYTYPE = CURLOPTTYPE_LONG + 101; CURLOPT_COPYPOSTFIELDS = CURLOPTTYPE_OBJECTPOINT + 165; CURLOPT_USERNAME = CURLOPTTYPE_STRINGPOINT + 173; CURLOPT_PASSWORD = CURLOPTTYPE_STRINGPOINT + 174; CURLOPT_PROXYUSERNAME = CURLOPTTYPE_STRINGPOINT + 175; CURLOPT_PROXYPASSWORD = CURLOPTTYPE_STRINGPOINT + 176; CURLOPT_MAIL_FROM = CURLOPTTYPE_STRINGPOINT + 186; CURLOPT_MAIL_RCPT = CURLOPTTYPE_OBJECTPOINT + 187; } define { CURLINFO_STRING = 0x100000; CURLINFO_LONG = 0x200000; CURLINFO_DOUBLE = 0x300000; CURLINFO_SLIST = 0x400000; CURLINFO_PTR = 0x400000; /* same as SLIST */ CURLINFO_SOCKET = 0x500000; CURLINFO_OFF_T = 0x600000; CURLINFO_MASK = 0x0fffff; CURLINFO_TYPEMASK = 0xf00000; } enum CURLINFO; enum { CURLINFO_NONE, /* first, never use this */ CURLINFO_EFFECTIVE_URL = CURLINFO_STRING + 1, CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, 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_UPLOAD_T = CURLINFO_OFF_T + 7, CURLINFO_SIZE_DOWNLOAD = CURLINFO_DOUBLE + 8, CURLINFO_SIZE_DOWNLOAD_T = CURLINFO_OFF_T + 8, CURLINFO_SPEED_DOWNLOAD = CURLINFO_DOUBLE + 9, CURLINFO_SPEED_DOWNLOAD_T = CURLINFO_OFF_T + 9, CURLINFO_SPEED_UPLOAD = CURLINFO_DOUBLE + 10, CURLINFO_SPEED_UPLOAD_T = CURLINFO_OFF_T + 10, CURLINFO_HEADER_SIZE = CURLINFO_LONG + 11, CURLINFO_REQUEST_SIZE = CURLINFO_LONG + 12, CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG + 13, CURLINFO_FILETIME = CURLINFO_LONG + 14, CURLINFO_FILETIME_T = CURLINFO_OFF_T + 14, CURLINFO_CONTENT_LENGTH_DOWNLOAD = CURLINFO_DOUBLE + 15, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T = CURLINFO_OFF_T + 15, CURLINFO_CONTENT_LENGTH_UPLOAD = CURLINFO_DOUBLE + 16, CURLINFO_CONTENT_LENGTH_UPLOAD_T = CURLINFO_OFF_T + 16, CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17, CURLINFO_CONTENT_TYPE = CURLINFO_STRING + 18, CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, CURLINFO_PRIVATE = CURLINFO_STRING + 21, 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_SSL_ENGINES = CURLINFO_SLIST + 27, CURLINFO_COOKIELIST = CURLINFO_SLIST + 28, CURLINFO_LASTSOCKET = CURLINFO_LONG + 29, CURLINFO_FTP_ENTRY_PATH = CURLINFO_STRING + 30, CURLINFO_REDIRECT_URL = CURLINFO_STRING + 31, CURLINFO_PRIMARY_IP = CURLINFO_STRING + 32, CURLINFO_APPCONNECT_TIME = CURLINFO_DOUBLE + 33, CURLINFO_CERTINFO = CURLINFO_PTR + 34, CURLINFO_CONDITION_UNMET = CURLINFO_LONG + 35, CURLINFO_RTSP_SESSION_ID = CURLINFO_STRING + 36, CURLINFO_RTSP_CLIENT_CSEQ = CURLINFO_LONG + 37, CURLINFO_RTSP_SERVER_CSEQ = CURLINFO_LONG + 38, CURLINFO_RTSP_CSEQ_RECV = CURLINFO_LONG + 39, CURLINFO_PRIMARY_PORT = CURLINFO_LONG + 40, CURLINFO_LOCAL_IP = CURLINFO_STRING + 41, CURLINFO_LOCAL_PORT = CURLINFO_LONG + 42, CURLINFO_TLS_SESSION = CURLINFO_PTR + 43, CURLINFO_ACTIVESOCKET = CURLINFO_SOCKET + 44, CURLINFO_TLS_SSL_PTR = CURLINFO_PTR + 45, CURLINFO_HTTP_VERSION = CURLINFO_LONG + 46, CURLINFO_PROXY_SSL_VERIFYRESULT = CURLINFO_LONG + 47, CURLINFO_PROTOCOL = CURLINFO_LONG + 48, CURLINFO_SCHEME = CURLINFO_STRING + 49, /* Fill in new entries below here! */ /* Preferably these would be defined conditionally based on the sizeof curl_off_t being 64-bits */ CURLINFO_TOTAL_TIME_T = CURLINFO_OFF_T + 50, CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51, CURLINFO_CONNECT_TIME_T = CURLINFO_OFF_T + 52, CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53, CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54, CURLINFO_REDIRECT_TIME_T = CURLINFO_OFF_T + 55, CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56, CURLINFO_LASTONE = 56 } } module curl+ { inline curl_easy_cleanup(curl+ CURL) { call1(so::fn.curl_easy_cleanup, curl); } inline curl_easy_getinfo(curl+ CURL, info CURLINFO, value word) CURLcode { return call3(so::fn.curl_easy_getinfo, curl, info, value); } inline curl_easy_init() +CURL { return call(so::fn.curl_easy_init); } inline curl_easy_perform(curl+ CURL) CURLcode { return call1(so::fn.curl_easy_perform, curl); } inline curl_easy_setopt(curl+ CURL, option CURLoption, value word) CURLcode { return call3(so::fn.curl_easy_setopt, curl, option, value); } inline curl_easy_strerror(code CURLcode) .char { return call1(so::fn.curl_easy_strerror, code); } inline curl_global_cleanup() { call(so::fn.curl_global_cleanup); } inline curl_global_init(flags long = CURL_GLOBAL_DEFAULT) CURLcode { return call1(so::fn.curl_global_init, flags); } inline curl_slist_append(slist+ curl_slist, str. char) +curl_slist { return call2(so::fn.curl_slist_append, slist, str); } inline curl_slist_free_all(slist+ curl_slist) { call1(so::fn.curl_slist_free_all, slist); } } }