|
@@ -235,28 +235,50 @@ slist_convert(int dccsid, struct curl_slist *from, int sccsid)
|
|
|
}
|
|
|
|
|
|
|
|
|
-char *curl_version_ccsid(unsigned int ccsid)
|
|
|
+static char *
|
|
|
+keyed_string(localkey_t key, const char *ascii, unsigned int ccsid)
|
|
|
{
|
|
|
int i;
|
|
|
- char *aversion;
|
|
|
- char *eversion;
|
|
|
+ char *ebcdic;
|
|
|
|
|
|
- aversion = curl_version();
|
|
|
+ if(!ascii)
|
|
|
+ return (char *) NULL;
|
|
|
|
|
|
- if(!aversion)
|
|
|
- return aversion;
|
|
|
+ i = MAX_CONV_EXPANSION * (strlen(ascii) + 1);
|
|
|
|
|
|
- i = strlen(aversion) + 1;
|
|
|
- i *= MAX_CONV_EXPANSION;
|
|
|
+ ebcdic = Curl_thread_buffer(key, i);
|
|
|
+ if(!ebcdic)
|
|
|
+ return ebcdic;
|
|
|
|
|
|
- eversion = Curl_thread_buffer(LK_CURL_VERSION, i);
|
|
|
- if(!eversion)
|
|
|
+ if(convert(ebcdic, i, ccsid, ascii, -1, ASCII_CCSID) < 0)
|
|
|
return (char *) NULL;
|
|
|
|
|
|
- if(convert(eversion, i, ccsid, aversion, -1, ASCII_CCSID) < 0)
|
|
|
- return (char *) NULL;
|
|
|
+ return ebcdic;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const char *
|
|
|
+curl_to_ccsid(const char *s, unsigned int ccsid)
|
|
|
+{
|
|
|
+ if(s)
|
|
|
+ s = dynconvert(ccsid, s, -1, ASCII_CCSID);
|
|
|
+ return s;
|
|
|
+}
|
|
|
|
|
|
- return eversion;
|
|
|
+
|
|
|
+const char *
|
|
|
+curl_from_ccsid(const char *s, unsigned int ccsid)
|
|
|
+{
|
|
|
+ if(s)
|
|
|
+ s = dynconvert(ASCII_CCSID, s, -1, ccsid);
|
|
|
+ return s;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+char *
|
|
|
+curl_version_ccsid(unsigned int ccsid)
|
|
|
+{
|
|
|
+ return keyed_string(LK_CURL_VERSION, curl_version(), ccsid);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -414,18 +436,19 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
|
|
|
offsetof(curl_version_info_data, capath),
|
|
|
offsetof(curl_version_info_data, zstd_version),
|
|
|
offsetof(curl_version_info_data, hyper_version),
|
|
|
- offsetof(curl_version_info_data, gsasl_version)
|
|
|
+ offsetof(curl_version_info_data, gsasl_version),
|
|
|
+ offsetof(curl_version_info_data, feature_names)
|
|
|
};
|
|
|
|
|
|
/* The assertion below is possible, because although the second operand
|
|
|
is an enum member, the first is a #define. In that case, the OS/400 C
|
|
|
compiler seems to compare string values after substitution. */
|
|
|
|
|
|
-#if CURLVERSION_NOW != CURLVERSION_TENTH
|
|
|
+#if CURLVERSION_NOW != CURLVERSION_ELEVENTH
|
|
|
#error curl_version_info_data structure has changed: upgrade this procedure.
|
|
|
#endif
|
|
|
|
|
|
- /* If caller has been compiled with a new version, error. */
|
|
|
+ /* If caller has been compiled with a newer version, error. */
|
|
|
|
|
|
if(stamp > CURLVERSION_NOW)
|
|
|
return (curl_version_info_data *) NULL;
|
|
@@ -498,75 +521,28 @@ curl_version_info_ccsid(CURLversion stamp, unsigned int ccsid)
|
|
|
const char *
|
|
|
curl_easy_strerror_ccsid(CURLcode error, unsigned int ccsid)
|
|
|
{
|
|
|
- int i;
|
|
|
- const char *s;
|
|
|
- char *buf;
|
|
|
-
|
|
|
- s = curl_easy_strerror(error);
|
|
|
-
|
|
|
- if(!s)
|
|
|
- return s;
|
|
|
-
|
|
|
- i = MAX_CONV_EXPANSION * (strlen(s) + 1);
|
|
|
-
|
|
|
- buf = Curl_thread_buffer(LK_EASY_STRERROR, i);
|
|
|
- if(!buf)
|
|
|
- return (const char *) NULL;
|
|
|
-
|
|
|
- if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
|
|
|
- return (const char *) NULL;
|
|
|
-
|
|
|
- return (const char *) buf;
|
|
|
+ return keyed_string(LK_EASY_STRERROR, curl_easy_strerror(error), ccsid);
|
|
|
}
|
|
|
|
|
|
|
|
|
const char *
|
|
|
curl_share_strerror_ccsid(CURLSHcode error, unsigned int ccsid)
|
|
|
{
|
|
|
- int i;
|
|
|
- const char *s;
|
|
|
- char *buf;
|
|
|
-
|
|
|
- s = curl_share_strerror(error);
|
|
|
-
|
|
|
- if(!s)
|
|
|
- return s;
|
|
|
-
|
|
|
- i = MAX_CONV_EXPANSION * (strlen(s) + 1);
|
|
|
-
|
|
|
- buf = Curl_thread_buffer(LK_SHARE_STRERROR, i);
|
|
|
- if(!buf)
|
|
|
- return (const char *) NULL;
|
|
|
-
|
|
|
- if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
|
|
|
- return (const char *) NULL;
|
|
|
-
|
|
|
- return (const char *) buf;
|
|
|
+ return keyed_string(LK_SHARE_STRERROR, curl_share_strerror(error), ccsid);
|
|
|
}
|
|
|
|
|
|
|
|
|
const char *
|
|
|
curl_multi_strerror_ccsid(CURLMcode error, unsigned int ccsid)
|
|
|
{
|
|
|
- int i;
|
|
|
- const char *s;
|
|
|
- char *buf;
|
|
|
-
|
|
|
- s = curl_multi_strerror(error);
|
|
|
-
|
|
|
- if(!s)
|
|
|
- return s;
|
|
|
-
|
|
|
- i = MAX_CONV_EXPANSION * (strlen(s) + 1);
|
|
|
-
|
|
|
- buf = Curl_thread_buffer(LK_MULTI_STRERROR, i);
|
|
|
- if(!buf)
|
|
|
- return (const char *) NULL;
|
|
|
+ return keyed_string(LK_MULTI_STRERROR, curl_multi_strerror(error), ccsid);
|
|
|
+}
|
|
|
|
|
|
- if(convert(buf, i, ccsid, s, -1, ASCII_CCSID) < 0)
|
|
|
- return (const char *) NULL;
|
|
|
|
|
|
- return (const char *) buf;
|
|
|
+const char *
|
|
|
+curl_url_strerror_ccsid(CURLUcode error, unsigned int ccsid)
|
|
|
+{
|
|
|
+ return keyed_string(LK_URL_STRERROR, curl_url_strerror(error), ccsid);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1087,17 +1063,15 @@ curl_formget_ccsid(struct curl_httppost *form, void *arg,
|
|
|
|
|
|
|
|
|
CURLcode
|
|
|
-curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
+curl_easy_setopt_ccsid(CURL *easy, CURLoption tag, ...)
|
|
|
{
|
|
|
CURLcode result;
|
|
|
va_list arg;
|
|
|
- struct Curl_easy *data;
|
|
|
char *s;
|
|
|
- char *cp;
|
|
|
+ char *cp = NULL;
|
|
|
unsigned int ccsid;
|
|
|
curl_off_t pfsize;
|
|
|
|
|
|
- data = (struct Curl_easy *) curl;
|
|
|
va_start(arg, tag);
|
|
|
|
|
|
switch(tag) {
|
|
@@ -1137,6 +1111,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
case CURLOPT_PASSWORD:
|
|
|
case CURLOPT_PINNEDPUBLICKEY:
|
|
|
case CURLOPT_PRE_PROXY:
|
|
|
+ case CURLOPT_PROTOCOLS_STR:
|
|
|
case CURLOPT_PROXY:
|
|
|
case CURLOPT_PROXYPASSWORD:
|
|
|
case CURLOPT_PROXYUSERNAME:
|
|
@@ -1158,6 +1133,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
case CURLOPT_PROXY_TLSAUTH_USERNAME:
|
|
|
case CURLOPT_RANDOM_FILE:
|
|
|
case CURLOPT_RANGE:
|
|
|
+ case CURLOPT_REDIR_PROTOCOLS_STR:
|
|
|
case CURLOPT_REFERER:
|
|
|
case CURLOPT_REQUEST_TARGET:
|
|
|
case CURLOPT_RTSP_SESSION_ID:
|
|
@@ -1167,6 +1143,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
case CURLOPT_SERVICE_NAME:
|
|
|
case CURLOPT_SOCKS5_GSSAPI_SERVICE:
|
|
|
case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
|
|
|
+ case CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256:
|
|
|
case CURLOPT_SSH_KNOWNHOSTS:
|
|
|
case CURLOPT_SSH_PRIVATE_KEYFILE:
|
|
|
case CURLOPT_SSH_PUBLIC_KEYFILE:
|
|
@@ -1199,7 +1176,7 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- result = curl_easy_setopt(curl, tag, s);
|
|
|
+ result = curl_easy_setopt(easy, tag, s);
|
|
|
free(s);
|
|
|
break;
|
|
|
|
|
@@ -1210,10 +1187,10 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
s = va_arg(arg, char *);
|
|
|
ccsid = va_arg(arg, unsigned int);
|
|
|
|
|
|
- pfsize = data->set.postfieldsize;
|
|
|
+ pfsize = easy->set.postfieldsize;
|
|
|
|
|
|
if(!s || !pfsize || ccsid == NOCONV_CCSID || ccsid == ASCII_CCSID) {
|
|
|
- result = curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, s);
|
|
|
+ result = curl_easy_setopt(easy, CURLOPT_COPYPOSTFIELDS, s);
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -1251,30 +1228,68 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...)
|
|
|
pfsize = convert(cp, pfsize, ASCII_CCSID, s, len, ccsid);
|
|
|
|
|
|
if(pfsize < 0) {
|
|
|
- free(cp);
|
|
|
result = CURLE_OUT_OF_MEMORY;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- data->set.postfieldsize = pfsize; /* Replace data size. */
|
|
|
+ easy->set.postfieldsize = pfsize; /* Replace data size. */
|
|
|
s = cp;
|
|
|
}
|
|
|
|
|
|
- result = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, s);
|
|
|
- data->set.str[STRING_COPYPOSTFIELDS] = s; /* Give to library. */
|
|
|
+ result = curl_easy_setopt(easy, CURLOPT_POSTFIELDS, s);
|
|
|
+ easy->set.str[STRING_COPYPOSTFIELDS] = s; /* Give to library. */
|
|
|
break;
|
|
|
|
|
|
- case CURLOPT_ERRORBUFFER: /* This is an output buffer. */
|
|
|
default:
|
|
|
- result = Curl_vsetopt(curl, tag, arg);
|
|
|
+ if(tag / 10000 == CURLOPTTYPE_BLOB) {
|
|
|
+ struct curl_blob *bp = va_arg(arg, struct curl_blob *);
|
|
|
+ struct curl_blob blob;
|
|
|
+
|
|
|
+ ccsid = va_arg(arg, unsigned int);
|
|
|
+
|
|
|
+ if(bp && bp->data && bp->len &&
|
|
|
+ ccsid != NOCONV_CCSID && ccsid != ASCII_CCSID) {
|
|
|
+ pfsize = (curl_off_t) bp->len * MAX_CONV_EXPANSION;
|
|
|
+
|
|
|
+ if(pfsize > SIZE_MAX)
|
|
|
+ pfsize = SIZE_MAX;
|
|
|
+
|
|
|
+ cp = malloc(pfsize);
|
|
|
+
|
|
|
+ if(!cp) {
|
|
|
+ result = CURLE_OUT_OF_MEMORY;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ pfsize = convert(cp, pfsize, ASCII_CCSID, bp->data, bp->len, ccsid);
|
|
|
+
|
|
|
+ if(pfsize < 0) {
|
|
|
+ result = CURLE_OUT_OF_MEMORY;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ blob.data = cp;
|
|
|
+ blob.len = pfsize;
|
|
|
+ blob.flags = bp->flags | CURL_BLOB_COPY;
|
|
|
+ bp = &blob;
|
|
|
+ }
|
|
|
+ result = curl_easy_setopt(easy, tag, &blob);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ /* FALLTHROUGH */
|
|
|
+ case CURLOPT_ERRORBUFFER: /* This is an output buffer. */
|
|
|
+ result = Curl_vsetopt(easy, tag, arg);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
va_end(arg);
|
|
|
+ free(cp);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
+/* ILE/RPG helper functions. */
|
|
|
+
|
|
|
char *
|
|
|
curl_form_long_value(long value)
|
|
|
{
|
|
@@ -1460,3 +1475,24 @@ curl_easy_option_get_name_ccsid(const struct curl_easyoption *option,
|
|
|
|
|
|
return (const char *) name;
|
|
|
}
|
|
|
+
|
|
|
+/* Header API CCSID support. */
|
|
|
+CURLHcode
|
|
|
+curl_easy_header_ccsid(CURL *easy, const char *name, size_t index,
|
|
|
+ unsigned int origin, int request,
|
|
|
+ struct curl_header **hout, unsigned int ccsid)
|
|
|
+{
|
|
|
+ CURLHcode result = CURLHE_BAD_ARGUMENT;
|
|
|
+
|
|
|
+ if(name) {
|
|
|
+ char *s = dynconvert(ASCII_CCSID, name, -1, ccsid);
|
|
|
+
|
|
|
+ result = CURLHE_OUT_OF_MEMORY;
|
|
|
+ if(s) {
|
|
|
+ result = curl_easy_header(easy, s, index, origin, request, hout);
|
|
|
+ free(s);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|