Buy commercial curl support from WolfSSL. We help you work
out your issues, debug your libcurl applications, use the API, port to new
platforms, add new features and more. With a team lead by the curl founder
himself.
[PATCH v4] setopt: make curl_easy_vsetopt public
- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]
From: Drew DeVault via curl-library <curl-library_at_lists.haxx.se>
Date: Tue, 29 Mar 2022 09:10:37 +0200
This moves the internal Curl_vsetopt function into the public API so
that users can set options with a va_list.
Signed-off-by: Drew DeVault <sir_at_cmpwn.com>
Date: Tue, 29 Mar 2022 09:10:37 +0200
This moves the internal Curl_vsetopt function into the public API so
that users can set options with a va_list.
Signed-off-by: Drew DeVault <sir_at_cmpwn.com>
--- Incorporates feedback from GitHub, which ought to have been forwarded to the mailing list. docs/libcurl/Makefile.inc | 1 + docs/libcurl/curl_easy_vsetopt.3 | 63 +++++++++++++++++++++++++++++++ include/curl/easy.h | 4 ++ lib/setopt.c | 15 +++----- lib/setopt.h | 3 +- packages/OS400/ccsidcurl.c | 4 +- tests/data/test1135 | 1 + tests/libtest/Makefile.inc | 6 ++- tests/libtest/lib3026.c | 64 ++++++++++++++++++++++++++++++++ 9 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 docs/libcurl/curl_easy_vsetopt.3 create mode 100644 tests/libtest/lib3026.c diff --git a/docs/libcurl/Makefile.inc b/docs/libcurl/Makefile.inc index d314f95a3..9c022eabb 100644 --- a/docs/libcurl/Makefile.inc +++ b/docs/libcurl/Makefile.inc _at__at_ -42,6 +42,7 _at__at_ man_MANS = \ curl_easy_strerror.3 \ curl_easy_unescape.3 \ curl_easy_upkeep.3 \ + curl_easy_vsetopt.3 \ curl_escape.3 \ curl_formadd.3 \ curl_formfree.3 \ diff --git a/docs/libcurl/curl_easy_vsetopt.3 b/docs/libcurl/curl_easy_vsetopt.3 new file mode 100644 index 000000000..ab436dcdc --- /dev/null +++ b/docs/libcurl/curl_easy_vsetopt.3 _at__at_ -0,0 +1,63 _at__at_ +.\" ************************************************************************** +.\" * _ _ ____ _ +.\" * Project ___| | | | _ \| | +.\" * / __| | | | |_) | | +.\" * | (__| |_| | _ <| |___ +.\" * \___|\___/|_| \_\_____| +.\" * +.\" * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel_at_haxx.se>, et al. +.\" * +.\" * This software is licensed as described in the file COPYING, which +.\" * you should have received as part of this distribution. The terms +.\" * are also available at https://curl.se/docs/copyright.html. +.\" * +.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell +.\" * copies of the Software, and permit persons to whom the Software is +.\" * furnished to do so, under the terms of the COPYING file. +.\" * +.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +.\" * KIND, either express or implied. +.\" * +.\" ************************************************************************** +.\" +.TH curl_easy_vsetopt 3 "29 Mar 2022" "libcurl 7.83.0" "libcurl Manual" +.SH NAME +curl_easy_vsetopt \- set options for a curl easy handle from a va_list +.SH SYNOPSIS +.nf +#include <stdarg.h> +#include <curl/curl.h> + +CURLcode curl_easy_vsetopt(CURL *handle, CURLoption option, va_list ap); +.fi +.SH DESCRIPTION +\fIcurl_easy_vsetopt(3)\fP is used to set options for a curl easy handle from a +variadic argument list specified by the ap parameter. In all other respects it +is identical to \fIcurl_easy_setopt(3)\fP. +.SH EXAMPLE +.nf +void run_url(CURL *curl, ...) +{ + CURL *curl; + CURLcode res; + va_list arg; + va_start(arg, curl); + curl = curl_easy_init(); + res = curl_easy_vsetopt(curl, CURLOPT_URL, arg); + va_end(arg); + if (res != CURLE_OK) { + // handle error... + } + res = curl_easy_perform(curl); + if (res != CURLE_OK) { + // handle error... + } + curl_easy_cleanup(curl); +} +.fi +.SH AVAILABILITY +Added in 7.83.0 +.SH RETURN VALUE +See \fIcurl_easy_setopt(3)\fP. +.SH "SEE ALSO" +.BR curl_easy_setopt "(3)" diff --git a/include/curl/easy.h b/include/curl/easy.h index 2dbfb26b5..f8297e3d9 100644 --- a/include/curl/easy.h +++ b/include/curl/easy.h _at__at_ -21,6 +21,8 _at__at_ * KIND, either express or implied. * ***************************************************************************/ +#include <stdarg.h> + #ifdef __cplusplus extern "C" { #endif _at__at_ -38,6 +40,8 _at__at_ struct curl_blob { CURL_EXTERN CURL *curl_easy_init(void); CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); +CURL_EXTERN CURLcode curl_easy_vsetopt(CURL *curl, CURLoption option, + va_list param); CURL_EXTERN CURLcode curl_easy_perform(CURL *curl); CURL_EXTERN void curl_easy_cleanup(CURL *curl); diff --git a/lib/setopt.c b/lib/setopt.c index 8e1bf1279..46d7448c3 100644 --- a/lib/setopt.c +++ b/lib/setopt.c _at__at_ -146,11 +146,8 _at__at_ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp) #define C_SSLVERSION_VALUE(x) (x & 0xffff) #define C_SSLVERSION_MAX_VALUE(x) (x & 0xffff0000) -/* - * Do not make Curl_vsetopt() static: it is called from - * packages/OS400/ccsidcurl.c. - */ -CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) +CURLcode curl_easy_vsetopt(struct Curl_easy *data, CURLoption option, + va_list param) { char *argptr; CURLcode result = CURLE_OK; _at__at_ -160,6 +157,9 _at__at_ CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list param) #endif curl_off_t bigsize; + if(!data) + return CURLE_BAD_FUNCTION_ARGUMENT; + switch(option) { case CURLOPT_DNS_CACHE_TIMEOUT: arg = va_arg(param, long); _at__at_ -3044,12 +3044,9 _at__at_ CURLcode curl_easy_setopt(struct Curl_easy *data, CURLoption tag, ...) va_list arg; CURLcode result; - if(!data) - return CURLE_BAD_FUNCTION_ARGUMENT; - va_start(arg, tag); - result = Curl_vsetopt(data, tag, arg); + result = curl_easy_vsetopt(data, tag, arg); va_end(arg); return result; diff --git a/lib/setopt.h b/lib/setopt.h index affbfd996..53dbd3845 100644 --- a/lib/setopt.h +++ b/lib/setopt.h _at__at_ -7,7 +7,7 _at__at_ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel_at_haxx.se>, et al. + * Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel_at_haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms _at__at_ -25,6 +25,5 _at__at_ CURLcode Curl_setstropt(char **charp, const char *s); CURLcode Curl_setblobopt(struct curl_blob **blobp, const struct curl_blob *blob); -CURLcode Curl_vsetopt(struct Curl_easy *data, CURLoption option, va_list arg); #endif /* HEADER_CURL_SETOPT_H */ diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c index 4b30683ea..6b5939977 100644 --- a/packages/OS400/ccsidcurl.c +++ b/packages/OS400/ccsidcurl.c _at__at_ -5,7 +5,7 _at__at_ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel_at_haxx.se>, et al. + * Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel_at_haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms _at__at_ -1264,7 +1264,7 _at__at_ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...) case CURLOPT_ERRORBUFFER: /* This is an output buffer. */ default: - result = Curl_vsetopt(curl, tag, arg); + result = curl_easy_vsetopt(curl, tag, arg); break; } diff --git a/tests/data/test1135 b/tests/data/test1135 index e0aae514f..8c6a14707 100644 --- a/tests/data/test1135 +++ b/tests/data/test1135 _at__at_ -68,6 +68,7 _at__at_ CURL_EXTERN const char *curl_share_strerror CURL_EXTERN CURLcode curl_easy_pause CURL_EXTERN CURL *curl_easy_init CURL_EXTERN CURLcode curl_easy_setopt +CURL_EXTERN CURLcode curl_easy_vsetopt CURL_EXTERN CURLcode curl_easy_perform CURL_EXTERN void curl_easy_cleanup CURL_EXTERN CURLcode curl_easy_getinfo diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index a87390733..aab9865fd 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc _at__at_ -62,7 +62,7 _at__at_ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \ lib1905 lib1906 lib1907 lib1908 lib1910 lib1911 lib1912 lib1913 \ lib1915 lib1916 lib1917 lib1918 lib1933 lib1934 lib1935 lib1936 \ lib1937 lib1938 lib1939 lib1940 lib1945 lib1946 \ - lib3010 lib3025 + lib3010 lib3025 lib3026 chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \ ../../lib/curl_ctype.c ../../lib/dynbuf.c ../../lib/strdup.c _at__at_ -743,3 +743,7 _at__at_ lib3010_CPPFLAGS = $(AM_CPPFLAGS) lib3025_SOURCES = lib3025.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) lib3025_LDADD = $(TESTUTIL_LIBS) lib3025_CPPFLAGS = $(AM_CPPFLAGS) + +lib3026_SOURCES = lib3026.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) +lib3026_LDADD = $(TESTUTIL_LIBS) +lib3026_CPPFLAGS = $(AM_CPPFLAGS) diff --git a/tests/libtest/lib3026.c b/tests/libtest/lib3026.c new file mode 100644 index 000000000..e70e95018 --- /dev/null +++ b/tests/libtest/lib3026.c _at__at_ -0,0 +1,64 _at__at_ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel_at_haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "test.h" +#include "memdebug.h" + +#include <stdarg.h> + +CURLcode test_vsetopt(CURL *curl, CURLoption opt, ...) +{ + va_list ap; + va_start(ap, opt); + curl_easy_vsetopt(curl, opt, ap); + va_end(ap); +} + +int test(char *URL) +{ + CURLcode res; + CURL *curl; + + if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { + fprintf(stderr, "curl_global_init() failed\n"); + return TEST_ERR_MAJOR_BAD; + } + + curl = curl_easy_init(); + if(!curl) { + fprintf(stderr, "curl_easy_init() failed\n"); + curl_global_cleanup(); + return TEST_ERR_MAJOR_BAD; + } + + test_vsetopt(curl, CURLOPT_VERBOSE, 1L); + test_vsetopt(curl, CURLOPT_HEADER, 1L); + test_vsetopt(curl, CURLOPT_URL, URL); + + res = curl_easy_perform(curl); + +test_cleanup: + + curl_easy_cleanup(curl); + curl_global_cleanup(); + + return (int)res; +} -- 2.35.1 -- Unsubscribe: https://lists.haxx.se/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.htmlReceived on 2022-03-29