diff --git a/include/curl/curl.h b/include/curl/curl.h index e4b63430a..65deb5247 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -909,6 +909,27 @@ CURLcode curl_share_set_unlock_function (curl_share *, curl_unlock_function); CURLcode curl_share_set_lock_data (curl_share *, void *); CURLcode curl_share_destroy (curl_share *); +/**************************************************************************** + * Structures for querying information about the curl library at runtime. + */ + +/* declared as a struct to allow future expansion while remaining backwards + * and binary compatible; any new fields in these two structs must be added + * after the existing fields */ +typedef struct { + const char *protoname; +} curl_runtime_protocol_info; + +typedef struct { + const char *version; /* LIBCURL_VERSION */ + unsigned int version_num; /* LIBCURL_VERSION_NUM */ + /* protocols is terminated by an entry with a NULL protoname */ + curl_runtime_protocol_info *protocols; +} curl_version_info_data; + +/* returns a pointer to a static copy of the version info struct */ +const curl_version_info_data *curl_version_info(void); + #ifdef __cplusplus } #endif diff --git a/lib/url.c b/lib/url.c index 394d3d0c9..abca0b986 100644 --- a/lib/url.c +++ b/lib/url.c @@ -1832,6 +1832,9 @@ static CURLcode CreateConnection(struct SessionHandle *data, * is based on the first letters of the server name. */ + /* Note: if you add a new protocol, please update the list in + * lib/version.c too! */ + if(strnequal(conn->gname, "FTP", 3)) { strcpy(conn->protostr, "ftp"); } diff --git a/lib/version.c b/lib/version.c index 78e956c93..9c347685b 100644 --- a/lib/version.c +++ b/lib/version.c @@ -105,6 +105,53 @@ char *curl_version(void) return version; } +/* data for curl_version_info */ + +static const curl_runtime_protocol_info protocols[] = { +#ifndef CURL_DISABLE_FTP + { "ftp" }, +#endif +#ifndef CURL_DISABLE_GOPHER + { "gopher" }, +#endif +#ifndef CURL_DISABLE_TELNET + { "telnet" }, +#endif +#ifndef CURL_DISABLE_DICT + { "dict" }, +#endif +#ifndef CURL_DISABLE_LDAP + { "ldap" }, +#endif +#ifndef CURL_DISABLE_HTTP + { "http" }, +#endif +#ifndef CURL_DISABLE_FILE + { "file" }, +#endif + +#ifdef USE_SSLEAY +#ifndef CURL_DISABLE_HTTP + { "https" }, +#endif +#ifndef CURL_DISABLE_FTP + { "ftps" }, +#endif +#endif + { NULL } +}; + +static const curl_version_info_data version_info = { + LIBCURL_VERSION, + LIBCURL_VERSION_NUM, + &protocols +}; + +const curl_version_info_data *curl_version_info(void) +{ + return &version_info; +} + /* * local variables: * eval: (load-file "../curl-mode.el")