From c0460660d5a0c8f2be98adf79d2f27b5fa8f707a Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Wed, 25 Sep 2002 07:08:41 +0000
Subject: [PATCH] Wez Furlong's curl_version_info() function added, still needs
 some adjustments and possibly some improvments to feature all those things we
 could possibly want from this.

---
 include/curl/curl.h | 21 ++++++++++++++++++++
 lib/url.c           |  3 +++
 lib/version.c       | 47 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 71 insertions(+)

diff --git a/include/curl/curl.h b/include/curl/curl.h
index e4b63430af..65deb5247f 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 394d3d0c93..abca0b986d 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 78e956c93f..9c347685b2 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")
-- 
GitLab