Compare commits

...

14 Commits

Author SHA1 Message Date
Viktor Szakats
b4834a7d6d
examples: prefer return over exit() (cont.)
Some of these calls were not in callbacks. These examples may leak
handles.

Also fix some whitespace.

Follow-up to 08c7c937dc #16507
Closes #16524
2025-03-01 02:09:02 +01:00
Viktor Szakats
5693342ec2
winbuild: reduce command-line length by dropping whitespace
Keep the `@for %%i in [...]` lines within limits by stripping whitespace
from the input `.c` source lists read from `Makefile.inc`. To avoid this
error after adding a new `.c` source:
```
configuration name: libcurl-vc14-x64-release-dll-ssl-dll-ipv6-sspi
NMAKE : fatal error U1095: expanded command line 'for %i in (altsvc.obj            amigaos.obj
           asyn-ares.obj         asyn-thread.obj       base64.obj            bufq.obj
              bufref.obj            cf-h1-proxy.obj       cf-h2-proxy.obj       cf-haproxy.obj [...]
  vssh/wolfssh.obj) do @echo ..\builds\libcurl-vc14-x64-release-dll-ssl-dll-ipv6-sspi-obj-lib/%i \
                   ' too long
Stop.
Command exited with code 2
```
Ref: https://ci.appveyor.com/project/curlorg/curl/builds/51605338/job/dqg6qtebtscb279g#L44

Reported-by: Stefan Eissing
Bug: https://github.com/curl/curl/pull/16508#issuecomment-2690443409
Fixes #16521
Closes #16528
2025-03-01 02:04:42 +01:00
Dan Fandrich
c693cc02b0 docs: vulnerabilities in debug code are not eligible for a bounty
This is code that is off by default and is therefore treated as a
regular bug.

Ref: #16526
Closes #16527
2025-02-28 14:21:46 -08:00
Viktor Szakats
e7751571eb
GHA/macos: use quictls in some jobs, other small improvements
- enable quictls in autotools and cmake jobs. autotools requires
  a workaround due to wrong libpath in the quictls pkg-config.
  nghttp3 is offered by Homebrew, but not ngtcp2, to enable H3.

- install `libnghttp2` rather than `nghttp2`.
  `libnghttp2` is preinstalled and smaller. It also avoids detecting
  `nghttpx`, which confuses `pytest`.

- limit `brew unlink openssl` to libressl/quictls jobs.

Closes #16517
2025-02-28 16:58:12 +01:00
Zhaoming Luo
7211576442
tests: fix comment in lib533
Closes #16523
2025-02-28 16:12:20 +01:00
Stefan Eissing
794dfe7fc4
gnutls: fix use of pkcs11 urls for keys/certs
Fixes #16249
Forwarded-to-us-by: Carlos Henrique Lima Melara

Always use `gnutls_certificate_set_x509_key_file2()` for loading keys
and certificates, even without a password, since this function support
pkcs11 urls.

Thanks to @tatsuhiro-t for finding this out.
Help-by: Tatsuhiro Tsujikawa

Closes #16472
2025-02-28 16:08:10 +01:00
Viktor Szakats
049352dd80
cmake: allow CURL_STATIC_CRT with shared libcurl and no curl exe
Follow-up to edfa537100 #16456

Closes #16516
2025-02-28 13:11:41 +01:00
Viktor Szakats
08c7c937dc
tidy-up: prefer return over exit(), fix fallouts
To avoid breaking the control flow and align to majority of code
already using `return`.

`exit()` has the side-effect of suppressing leak detection in cases.
Fix fallouts detected after switching to `return`.

- configure:
  - fix `getaddrinfo` run test to call `freeaddrinfo()` to pacify ASAN,
    and call `WSACleanup()` to deinit winsock2.
  - fix `getifaddrs` run test to call `freeifaddrs()` to pacify ASAN.
- tests/server:
  - setup `atexit(win32_cleanup)` via `win32_init()`.
  - return 2 instead of 1 on winsock2 init failures.
  - sws: goto cleanup instead of `exit()` in `http_connect()`.
    Follow-up to 02dfe71937 #7235
- tests/client/http:
  - cleanup memory to pacify ASAN in `h2-upgrade-extreme`,
    `tls-session-reuse`.
- examples:
  - block_ip: fix memory leak reported by CI.
  - http2-upload: avoid handle leaks.

Untouched `exit()` calls, made from callbacks:
- docs/examples: ephiperfifo.c, ghiper.c, hiperfifo.c
- tests/libtest: lib582.c, lib655.c, lib670.c
- tests/server: tftpd.c

Closes #16507
2025-02-28 13:11:41 +01:00
Stefan Eissing
2e585f5640
test488: set --output-dir
Otherwise the downloaded files land in the `tests` directory and
show up in git status.

Closes #16519
2025-02-28 12:47:31 +01:00
Viktor Szakats
399cb7130a
cmake: drop HAVE_C_FLAG_Wno_long_double logic for ancient Apple gcc
The initial curl CMake commit introduced it in 2009-04-02 via
4c5307b456. Suppressing a stray
`-Wlong-double` warning in `mprintf.c`. This was before Apple switched
to clang, and likely affected the Apple distributed GCC, version 4.2.1
at the time. It applied the workaround to CMake builds only, though
the issue seems build-tool agnostic. Yet, it was not suppressed or
reported for autotools builds.

For these reasons this logic seems obsolete and this patch drops it with
no replacement. It saves a feature detection for GCC builds for macOS.

In PR sub-commits I added (and reverted) in-source suppression. In case
it becomes necessary, that should fix it for all build tools.

Closes #16513
2025-02-28 03:40:40 +01:00
Viktor Szakats
5a021aba41
cmake: improve httpd detection for pytest
Look for `httpd` in addition to `apache2`, like `./configure` does.
It fixes detection with macOS Homebrew for example.

Closes #16515
2025-02-28 03:40:40 +01:00
Viktor Szakats
6913c9b6ab
GHA/linux: improve 'test configs' step, don't set TFLAGS for pytest
- omit comments from th config dump, show filenames for each line.
- `TFLAGS` is not used by pytest, don't set it.

Closes #16514
2025-02-28 03:40:40 +01:00
Daniel Stenberg
953cd694dc
asyn-ares: use the correct port number
Only triggers with old c-ares versions.

Follow-up to 8ded8e5f3f

Closes #16511
2025-02-27 22:18:43 +01:00
Viktor Szakats
af6172c8f2
GHA/linux: merge two package install steps
Merge pytest prereq package install step into the main package install
step, to save install time.

Closes #16509
2025-02-27 20:32:50 +01:00
38 changed files with 283 additions and 239 deletions

View File

@ -454,9 +454,7 @@ jobs:
grep -F '#define' bld/lib/curl_config.h | sort || true grep -F '#define' bld/lib/curl_config.h | sort || true
- name: 'test configs' - name: 'test configs'
run: | run: grep -H -v '^#' bld/tests/config bld/tests/http/config.ini || true
cat bld/tests/config || true
cat bld/tests/http/config.ini || true
- name: 'build' - name: 'build'
run: | run: |
@ -500,7 +498,6 @@ jobs:
- name: 'run pytest event based' - name: 'run pytest event based'
env: env:
TFLAGS: '${{ matrix.build.tflags }}'
CURL_TEST_EVENT: 1 CURL_TEST_EVENT: 1
CURL_CI: github CURL_CI: github
PYTEST_ADDOPTS: '--color=yes' PYTEST_ADDOPTS: '--color=yes'

View File

@ -304,7 +304,8 @@ jobs:
libtool autoconf automake pkgconf ninja-build \ libtool autoconf automake pkgconf ninja-build \
${{ matrix.build.install_steps != 'skipall' && matrix.build.install_steps != 'skiprun' && 'stunnel4' || '' }} \ ${{ matrix.build.install_steps != 'skipall' && matrix.build.install_steps != 'skiprun' && 'stunnel4' || '' }} \
libpsl-dev libbrotli-dev libzstd-dev \ libpsl-dev libbrotli-dev libzstd-dev \
${{ matrix.build.install_packages }} ${{ matrix.build.install_packages }} \
${{ contains(matrix.build.install_steps, 'pytest') && 'apache2 apache2-dev libnghttp2-dev vsftpd' || '' }}
python3 -m venv $HOME/venv python3 -m venv $HOME/venv
- name: 'install prereqs' - name: 'install prereqs'
@ -319,11 +320,6 @@ jobs:
${{ matrix.build.install_packages }} ${{ matrix.build.install_packages }}
python3 -m venv $HOME/venv python3 -m venv $HOME/venv
- name: 'install prereqs for pytest'
if: contains(matrix.build.install_steps, 'pytest')
run: |
sudo apt-get -o Dpkg::Use-Pty=0 install apache2 apache2-dev libnghttp2-dev vsftpd
- name: 'install dependencies' - name: 'install dependencies'
if: startsWith(matrix.build.container, 'alpine') if: startsWith(matrix.build.container, 'alpine')
run: | run: |
@ -616,9 +612,7 @@ jobs:
grep -F '#define' bld/lib/curl_config.h | sort || true grep -F '#define' bld/lib/curl_config.h | sort || true
- name: 'test configs' - name: 'test configs'
run: | run: grep -H -v '^#' bld/tests/config bld/tests/http/config.ini || true
cat bld/tests/config || true
cat bld/tests/http/config.ini || true
- name: 'build' - name: 'build'
run: | run: |
@ -694,7 +688,6 @@ jobs:
- name: 'run pytest' - name: 'run pytest'
if: contains(matrix.build.install_steps, 'pytest') if: contains(matrix.build.install_steps, 'pytest')
env: env:
TFLAGS: '${{ matrix.build.tflags }}'
CURL_CI: github CURL_CI: github
PYTEST_ADDOPTS: '--color=yes' PYTEST_ADDOPTS: '--color=yes'
run: | run: |

View File

@ -123,9 +123,10 @@ jobs:
compiler: clang compiler: clang
configure: --enable-debug --with-openssl=$(brew --prefix openssl) configure: --enable-debug --with-openssl=$(brew --prefix openssl)
tflags: --test-event tflags: --test-event
- name: 'OpenSSL libssh2 !ldap 10.15' - name: 'quictls libssh2 !ldap 10.15'
compiler: clang compiler: clang
configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix openssl) install: quictls
configure: --enable-debug --disable-ldap --with-openssl=$(brew --prefix quictls) LDFLAGS="${LDFLAGS} -L$(brew --prefix quictls)/lib"
macos-version-min: '10.15' macos-version-min: '10.15'
# cmake # cmake
- name: 'OpenSSL gsasl rtmp AppleIDN' - name: 'OpenSSL gsasl rtmp AppleIDN'
@ -136,9 +137,9 @@ jobs:
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DUSE_APPLE_IDN=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DUSE_APPLE_IDN=ON -DCURL_CLANG_TIDY=ON -DCLANG_TIDY=$(brew --prefix llvm)/bin/clang-tidy
clang-tidy: true clang-tidy: true
chkprefill: _chkprefill chkprefill: _chkprefill
- name: 'OpenSSL +static libssh +examples' - name: 'quictls +static libssh +examples'
install: libssh install: quictls libssh
generate: -DOPENSSL_ROOT_DIR=$(brew --prefix openssl) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON generate: -DOPENSSL_ROOT_DIR=$(brew --prefix quictls) -DBUILD_STATIC_LIBS=ON -DCURL_USE_LIBSSH2=OFF -DCURL_USE_LIBSSH=ON
- name: 'SecureTransport debug' - name: 'SecureTransport debug'
generate: -DCURL_USE_SECTRANSP=ON -DENABLE_DEBUG=ON generate: -DCURL_USE_SECTRANSP=ON -DENABLE_DEBUG=ON
macos-version-min: '10.8' macos-version-min: '10.8'
@ -184,11 +185,12 @@ jobs:
run: | run: |
echo ${{ matrix.build.generate && 'ninja' || 'automake libtool' }} \ echo ${{ matrix.build.generate && 'ninja' || 'automake libtool' }} \
pkgconf libpsl libssh2 \ pkgconf libpsl libssh2 \
${{ !matrix.build.clang-tidy && 'nghttp2 stunnel' || '' }} \ ${{ !matrix.build.clang-tidy && 'libnghttp2 stunnel' || '' }} \
${{ matrix.build.install }} | xargs -Ix -n1 echo brew '"x"' > /tmp/Brewfile ${{ matrix.build.install }} | xargs -Ix -n1 echo brew '"x"' > /tmp/Brewfile
while [[ $? == 0 ]]; do for i in 1 2 3; do brew update && brew bundle install --no-lock --file /tmp/Brewfile && break 2 || { echo Error: wait to try again; sleep 10; } done; false Too many retries; done while [[ $? == 0 ]]; do for i in 1 2 3; do brew update && brew bundle install --no-lock --file /tmp/Brewfile && break 2 || { echo Error: wait to try again; sleep 10; } done; false Too many retries; done
- name: 'brew unlink openssl' - name: 'brew unlink openssl'
if: ${{ contains(matrix.build.install, 'libressl') || contains(matrix.build.install, 'quictls') }}
run: | run: |
if test -d $(brew --prefix)/include/openssl; then if test -d $(brew --prefix)/include/openssl; then
brew unlink openssl brew unlink openssl
@ -343,7 +345,7 @@ jobs:
if: ${{ contains(matrix.build.name, '+examples') }} if: ${{ contains(matrix.build.name, '+examples') }}
run: | run: |
if [ -n '${{ matrix.build.generate }}' ]; then if [ -n '${{ matrix.build.generate }}' ]; then
cmake --build bld --target curl-examples --verbose cmake --build bld --verbose --target curl-examples
else else
make -C bld examples V=1 make -C bld examples V=1
fi fi

View File

@ -352,13 +352,12 @@ endif()
if(WIN32) if(WIN32)
option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF) option(CURL_STATIC_CRT "Build libcurl with static CRT with MSVC (/MT)" OFF)
if(CURL_STATIC_CRT AND MSVC) if(CURL_STATIC_CRT AND MSVC)
if(BUILD_STATIC_CURL) if(BUILD_STATIC_CURL OR NOT BUILD_CURL_EXE)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
string(APPEND CMAKE_C_FLAGS_RELEASE " -MT") string(APPEND CMAKE_C_FLAGS_RELEASE " -MT")
string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd") string(APPEND CMAKE_C_FLAGS_DEBUG " -MTd")
else() else()
message(WARNING "Static CRT requires curl executable built with static libcurl " message(WARNING "Static CRT requires static or no curl executable.")
"(BUILD_STATIC_LIBS=ON and BUILD_STATIC_CURL=ON).")
endif() endif()
endif() endif()
endif() endif()
@ -1954,22 +1953,6 @@ endif()
# Some other minor tests # Some other minor tests
if(CMAKE_COMPILER_IS_GNUCC AND APPLE)
include(CheckCCompilerFlag)
check_c_compiler_flag("-Wno-long-double" HAVE_C_FLAG_Wno_long_double)
if(HAVE_C_FLAG_Wno_long_double)
# The Mac version of GCC warns about use of long double. Disable it.
get_source_file_property(_mprintf_compile_flags "mprintf.c" COMPILE_FLAGS)
if(_mprintf_compile_flags)
string(APPEND _mprintf_compile_flags " -Wno-long-double")
else()
set(_mprintf_compile_flags "-Wno-long-double")
endif()
set_source_files_properties("mprintf.c" PROPERTIES
COMPILE_FLAGS ${_mprintf_compile_flags})
endif()
endif()
if(_cmake_try_compile_target_type_save) if(_cmake_try_compile_target_type_save)
set(CMAKE_TRY_COMPILE_TARGET_TYPE ${_cmake_try_compile_target_type_save}) set(CMAKE_TRY_COMPILE_TARGET_TYPE ${_cmake_try_compile_target_type_save})
unset(_cmake_try_compile_target_type_save) unset(_cmake_try_compile_target_type_save)

View File

@ -238,7 +238,7 @@ target_link_libraries(my_target PRIVATE CURL::libcurl)
- `CURL_LIBCURL_VERSIONED_SYMBOLS`: Enable libcurl versioned symbols. Default: `OFF` - `CURL_LIBCURL_VERSIONED_SYMBOLS`: Enable libcurl versioned symbols. Default: `OFF`
- `CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX`: Override default versioned symbol prefix. Default: `<TLS-BACKEND>_` or `MULTISSL_` - `CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX`: Override default versioned symbol prefix. Default: `<TLS-BACKEND>_` or `MULTISSL_`
- `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF` - `CURL_LTO`: Enable compiler Link Time Optimizations. Default: `OFF`
- `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static curl executable). Default: `OFF` - `CURL_STATIC_CRT`: Build libcurl with static CRT with MSVC (`/MT`) (requires static or no curl executable). Default: `OFF`
- `CURL_TARGET_WINDOWS_VERSION`: Minimum target Windows version as hex string. - `CURL_TARGET_WINDOWS_VERSION`: Minimum target Windows version as hex string.
- `CURL_TEST_BUNDLES`: Bundle `libtest` and `unittest` tests into single binaries. Default: `OFF` - `CURL_TEST_BUNDLES`: Bundle `libtest` and `unittest` tests into single binaries. Default: `OFF`
- `CURL_WERROR`: Turn compiler warnings into errors. Default: `OFF` - `CURL_WERROR`: Turn compiler warnings into errors. Default: `OFF`

View File

@ -247,11 +247,11 @@ local system or network, the bar is raised. If a local user wrongfully has
elevated rights on your system enough to attack curl, they can probably elevated rights on your system enough to attack curl, they can probably
already do much worse harm and the problem is not really in curl. already do much worse harm and the problem is not really in curl.
## Experiments ## Debug & Experiments
Vulnerabilities in features which are off by default (in the build) and Vulnerabilities in features which are off by default (in the build) and
documented as experimental, are not eligible for a reward and we do not documented as experimental, or exist only in debug mode, are not eligible for a
consider them security problems. reward and we do not consider them security problems.
## URL inconsistencies ## URL inconsistencies

View File

@ -298,14 +298,19 @@ int main(void)
filter = (struct connection_filter *)calloc(1, sizeof(*filter)); filter = (struct connection_filter *)calloc(1, sizeof(*filter));
if(!filter) if(!filter)
exit(1); return 1;
if(curl_global_init(CURL_GLOBAL_DEFAULT)) if(curl_global_init(CURL_GLOBAL_DEFAULT)) {
exit(1); free(filter);
return 1;
}
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) if(!curl) {
exit(1); curl_global_cleanup();
free(filter);
return 1;
}
/* Set the target URL */ /* Set the target URL */
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost"); curl_easy_setopt(curl, CURLOPT_URL, "http://localhost");

View File

@ -79,12 +79,12 @@ int main(int argc, char *argv[])
fprintf(stderr, fprintf(stderr,
"\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n", "\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n",
appname); appname);
exit(1); return 1;
case 'v': case 'v':
case 'V': case 'V':
fprintf(stderr, "\r%s %s - %s\n", fprintf(stderr, "\r%s %s - %s\n",
appname, CHKSPEED_VERSION, curl_version()); appname, CHKSPEED_VERSION, curl_version());
exit(1); return 1;
case 'a': case 'a':
case 'A': case 'A':
prtall = 1; prtall = 1;

View File

@ -34,8 +34,7 @@
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/mprintf.h> #include <curl/mprintf.h>
static void static int print_cookies(CURL *curl)
print_cookies(CURL *curl)
{ {
CURLcode res; CURLcode res;
struct curl_slist *cookies; struct curl_slist *cookies;
@ -47,7 +46,7 @@ print_cookies(CURL *curl)
if(res != CURLE_OK) { if(res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n",
curl_easy_strerror(res)); curl_easy_strerror(res));
exit(1); return 1;
} }
nc = cookies; nc = cookies;
i = 1; i = 1;
@ -60,6 +59,8 @@ print_cookies(CURL *curl)
printf("(none)\n"); printf("(none)\n");
} }
curl_slist_free_all(cookies); curl_slist_free_all(cookies);
return 0;
} }
int int

View File

@ -418,22 +418,22 @@ static int init_fifo(GlobalInfo *g)
struct epoll_event epev; struct epoll_event epev;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) { if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit(1); return 1;
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit(1); return 1;
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
exit(1); return 1;
} }
g->fifofd = sockfd; g->fifofd = sockfd;
@ -449,9 +449,9 @@ static int init_fifo(GlobalInfo *g)
static void clean_fifo(GlobalInfo *g) static void clean_fifo(GlobalInfo *g)
{ {
epoll_ctl(g->epfd, EPOLL_CTL_DEL, g->fifofd, NULL); epoll_ctl(g->epfd, EPOLL_CTL_DEL, g->fifofd, NULL);
fclose(g->input); fclose(g->input);
unlink(fifo); unlink(fifo);
} }
@ -478,13 +478,13 @@ int main(int argc, char **argv)
g.epfd = epoll_create1(EPOLL_CLOEXEC); g.epfd = epoll_create1(EPOLL_CLOEXEC);
if(g.epfd == -1) { if(g.epfd == -1) {
perror("epoll_create1 failed"); perror("epoll_create1 failed");
exit(1); return 1;
} }
g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC); g.tfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
if(g.tfd == -1) { if(g.tfd == -1) {
perror("timerfd_create failed"); perror("timerfd_create failed");
exit(1); return 1;
} }
memset(&its, 0, sizeof(struct itimerspec)); memset(&its, 0, sizeof(struct itimerspec));
@ -496,7 +496,8 @@ int main(int argc, char **argv)
ev.data.fd = g.tfd; ev.data.fd = g.tfd;
epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev); epoll_ctl(g.epfd, EPOLL_CTL_ADD, g.tfd, &ev);
init_fifo(&g); if(init_fifo(&g))
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
/* setup the generic multi interface options we want */ /* setup the generic multi interface options we want */
@ -521,7 +522,7 @@ int main(int argc, char **argv)
} }
else { else {
perror("epoll_wait"); perror("epoll_wait");
exit(1); return 1;
} }
} }

View File

@ -402,22 +402,22 @@ static int init_fifo(GlobalInfo *g)
curl_socket_t sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) { if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit(1); return 1;
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit(1); return 1;
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
exit(1); return 1;
} }
g->input = fdopen(sockfd, "r"); g->input = fdopen(sockfd, "r");
@ -436,7 +436,8 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo)); memset(&g, 0, sizeof(GlobalInfo));
g.loop = ev_default_loop(0); g.loop = ev_default_loop(0);
init_fifo(&g); if(init_fifo(&g))
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
ev_timer_init(&g.timer_event, timer_cb, 0., 0.); ev_timer_init(&g.timer_event, timer_cb, 0., 0.);

View File

@ -392,21 +392,21 @@ int init_fifo(void)
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit(1); return CURL_SOCKET_BAD;
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo(fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit(1); return CURL_SOCKET_BAD;
} }
socket = open(fifo, O_RDWR | O_NONBLOCK, 0); socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(socket == -1) { if(socket == CURL_SOCKET_BAD) {
perror("open"); perror("open");
exit(1); return socket;
} }
MSG_OUT("Now, pipe some URL's into > %s\n", fifo); MSG_OUT("Now, pipe some URL's into > %s\n", fifo);
@ -421,6 +421,8 @@ int main(void)
GIOChannel* ch; GIOChannel* ch;
fd = init_fifo(); fd = init_fifo();
if(fd == CURL_SOCKET_BAD)
return 1;
ch = g_io_channel_unix_new(fd); ch = g_io_channel_unix_new(fd);
g_io_add_watch(ch, G_IO_IN, fifo_cb, g); g_io_add_watch(ch, G_IO_IN, fifo_cb, g);
gmain = g_main_loop_new(NULL, FALSE); gmain = g_main_loop_new(NULL, FALSE);

View File

@ -399,22 +399,22 @@ static int init_fifo(GlobalInfo *g)
curl_socket_t sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if(lstat (fifo, &st) == 0) { if(lstat(fifo, &st) == 0) {
if((st.st_mode & S_IFMT) == S_IFREG) { if((st.st_mode & S_IFMT) == S_IFREG) {
errno = EEXIST; errno = EEXIST;
perror("lstat"); perror("lstat");
exit(1); return 1;
} }
} }
unlink(fifo); unlink(fifo);
if(mkfifo (fifo, 0600) == -1) { if(mkfifo (fifo, 0600) == -1) {
perror("mkfifo"); perror("mkfifo");
exit(1); return 1;
} }
sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0); sockfd = open(fifo, O_RDWR | O_NONBLOCK, 0);
if(sockfd == -1) { if(sockfd == -1) {
perror("open"); perror("open");
exit(1); return 1;
} }
g->input = fdopen(sockfd, "r"); g->input = fdopen(sockfd, "r");
@ -440,7 +440,8 @@ int main(int argc, char **argv)
memset(&g, 0, sizeof(GlobalInfo)); memset(&g, 0, sizeof(GlobalInfo));
g.evbase = event_base_new(); g.evbase = event_base_new();
init_fifo(&g); if(init_fifo(&g))
return 1;
g.multi = curl_multi_init(); g.multi = curl_multi_init();
evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g); evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g);

View File

@ -94,7 +94,7 @@ static bool init(CURL *&conn, const char *url)
if(conn == NULL) { if(conn == NULL) {
fprintf(stderr, "Failed to create CURL connection\n"); fprintf(stderr, "Failed to create CURL connection\n");
exit(EXIT_FAILURE); return false;
} }
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer); code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
@ -270,7 +270,7 @@ int main(int argc, char *argv[])
if(argc != 2) { if(argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]); fprintf(stderr, "Usage: %s <url>\n", argv[0]);
exit(EXIT_FAILURE); return EXIT_FAILURE;
} }
curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_init(CURL_GLOBAL_DEFAULT);
@ -279,7 +279,7 @@ int main(int argc, char *argv[])
if(!init(conn, argv[1])) { if(!init(conn, argv[1])) {
fprintf(stderr, "Connection initialization failed\n"); fprintf(stderr, "Connection initialization failed\n");
exit(EXIT_FAILURE); return EXIT_FAILURE;
} }
// Retrieve content for the URL // Retrieve content for the URL
@ -289,7 +289,7 @@ int main(int argc, char *argv[])
if(code != CURLE_OK) { if(code != CURLE_OK) {
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer); fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
exit(EXIT_FAILURE); return EXIT_FAILURE;
} }
// Parse the (assumed) HTML code // Parse the (assumed) HTML code

View File

@ -142,7 +142,7 @@ int my_trace(CURL *handle, curl_infotype type,
return 0; return 0;
} }
static void setup(struct transfer *t, int num) static int setup(struct transfer *t, int num)
{ {
char filename[128]; char filename[128];
CURL *hnd; CURL *hnd;
@ -155,7 +155,7 @@ static void setup(struct transfer *t, int num)
if(!t->out) { if(!t->out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n", fprintf(stderr, "error: could not open file %s for writing: %s\n",
filename, strerror(errno)); filename, strerror(errno));
exit(1); return 1;
} }
/* write to this file */ /* write to this file */
@ -179,6 +179,7 @@ static void setup(struct transfer *t, int num)
/* wait for pipe connection to confirm */ /* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L); curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif #endif
return 0;
} }
/* /*
@ -204,7 +205,8 @@ int main(int argc, char **argv)
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) { for(i = 0; i < num_transfers; i++) {
setup(&trans[i], i); if(setup(&trans[i], i))
return 1;
/* add the individual transfer */ /* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].easy); curl_multi_add_handle(multi_handle, trans[i].easy);

View File

@ -200,7 +200,7 @@ static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *userp)
return retcode; return retcode;
} }
static void setup(struct input *i, int num, const char *upload) static int setup(struct input *i, int num, const char *upload)
{ {
FILE *out; FILE *out;
char url[256]; char url[256];
@ -209,14 +209,15 @@ static void setup(struct input *i, int num, const char *upload)
curl_off_t uploadsize; curl_off_t uploadsize;
CURL *hnd; CURL *hnd;
hnd = i->hnd = curl_easy_init(); hnd = i->hnd = NULL;
i->num = num; i->num = num;
curl_msnprintf(filename, 128, "dl-%d", num); curl_msnprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb"); out = fopen(filename, "wb");
if(!out) { if(!out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n", upload, fprintf(stderr, "error: could not open file %s for writing: %s\n", upload,
strerror(errno)); strerror(errno));
exit(1); return 1;
} }
curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num); curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num);
@ -225,7 +226,8 @@ static void setup(struct input *i, int num, const char *upload)
if(stat(upload, &file_info)) { if(stat(upload, &file_info)) {
fprintf(stderr, "error: could not stat file %s: %s\n", upload, fprintf(stderr, "error: could not stat file %s: %s\n", upload,
strerror(errno)); strerror(errno));
exit(1); fclose(out);
return 1;
} }
uploadsize = file_info.st_size; uploadsize = file_info.st_size;
@ -234,9 +236,12 @@ static void setup(struct input *i, int num, const char *upload)
if(!i->in) { if(!i->in) {
fprintf(stderr, "error: could not open file %s for reading: %s\n", upload, fprintf(stderr, "error: could not open file %s for reading: %s\n", upload,
strerror(errno)); strerror(errno));
exit(1); fclose(out);
return 1;
} }
hnd = i->hnd = curl_easy_init();
/* write to this file */ /* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out); curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
@ -269,6 +274,7 @@ static void setup(struct input *i, int num, const char *upload)
/* wait for pipe connection to confirm */ /* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L); curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif #endif
return 0;
} }
/* /*
@ -301,7 +307,8 @@ int main(int argc, char **argv)
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) { for(i = 0; i < num_transfers; i++) {
setup(&trans[i], i, filename); if(setup(&trans[i], i, filename))
return 1;
/* add the individual transfer */ /* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].hnd); curl_multi_add_handle(multi_handle, trans[i].hnd);

View File

@ -592,7 +592,7 @@ static void query_completed_cb(void *arg, /* (struct connectdata *) */
res->num_pending--; res->num_pending--;
if(CURL_ASYNC_SUCCESS == status) { if(CURL_ASYNC_SUCCESS == status) {
struct Curl_addrinfo *ai = Curl_he2ai(hostent, data->conn->localport); struct Curl_addrinfo *ai = Curl_he2ai(hostent, data->conn->remote_port);
if(ai) { if(ai) {
compound_results(res, ai); compound_results(res, ai);
} }

View File

@ -959,7 +959,7 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
return CURLE_SSL_CONNECT_ERROR; return CURLE_SSL_CONNECT_ERROR;
} }
} }
else if(ssl_config->key_passwd) { else {
const unsigned int supported_key_encryption_algorithms = const unsigned int supported_key_encryption_algorithms =
GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR | GNUTLS_PKCS_USE_PKCS12_3DES | GNUTLS_PKCS_USE_PKCS12_ARCFOUR |
GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES | GNUTLS_PKCS_USE_PKCS12_RC2_40 | GNUTLS_PKCS_USE_PBES2_3DES |
@ -974,22 +974,12 @@ static CURLcode gtls_client_init(struct Curl_cfilter *cf,
supported_key_encryption_algorithms); supported_key_encryption_algorithms);
if(rc != GNUTLS_E_SUCCESS) { if(rc != GNUTLS_E_SUCCESS) {
failf(data, failf(data,
"error reading X.509 potentially-encrypted key file: %s", "error reading X.509 %skey file: %s",
ssl_config->key_passwd ? "potentially-encrypted " : "",
gnutls_strerror(rc)); gnutls_strerror(rc));
return CURLE_SSL_CONNECT_ERROR; return CURLE_SSL_CONNECT_ERROR;
} }
} }
else {
if(gnutls_certificate_set_x509_key_file(
gtls->shared_creds->creds,
config->clientcert,
ssl_config->key ? ssl_config->key : config->clientcert,
gnutls_do_file_type(ssl_config->cert_type) ) !=
GNUTLS_E_SUCCESS) {
failf(data, "error reading X.509 key or certificate file");
return CURLE_SSL_CONNECT_ERROR;
}
}
} }
#ifdef USE_GNUTLS_SRP #ifdef USE_GNUTLS_SRP

View File

@ -482,7 +482,7 @@ AC_DEFUN([CURL_COMPILER_WORKS_IFELSE], [
#endif #endif
]],[[ ]],[[
int i = 0; int i = 0;
exit(i); return i;
]]) ]])
],[ ],[
tmp_compiler_works="yes" tmp_compiler_works="yes"

View File

@ -1270,11 +1270,12 @@ AC_DEFUN([CURL_CHECK_FUNC_GETADDRINFO], [
struct addrinfo hints; struct addrinfo hints;
struct addrinfo *ai = 0; struct addrinfo *ai = 0;
int error; int error;
int exitcode;
#ifdef _WIN32 #ifdef _WIN32
WSADATA wsa; WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 2), &wsa)) if(WSAStartup(MAKEWORD(2, 2), &wsa))
exit(2); return 2;
#endif #endif
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
@ -1283,9 +1284,15 @@ AC_DEFUN([CURL_CHECK_FUNC_GETADDRINFO], [
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo("127.0.0.1", 0, &hints, &ai); error = getaddrinfo("127.0.0.1", 0, &hints, &ai);
if(error || !ai) if(error || !ai)
exit(1); /* fail */ exitcode = 1; /* fail */
else else {
exit(0); freeaddrinfo(ai);
exitcode = 0;
}
#ifdef _WIN32
WSACleanup();
#endif
return exitcode;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -1883,9 +1890,11 @@ AC_DEFUN([CURL_CHECK_FUNC_GETIFADDRS], [
error = getifaddrs(&ifa); error = getifaddrs(&ifa);
if(error || !ifa) if(error || !ifa)
exit(1); /* fail */ return 1; /* fail */
else else {
exit(0); freeifaddrs(ifa);
return 0;
}
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2003,9 +2012,9 @@ AC_DEFUN([CURL_CHECK_FUNC_GMTIME_R], [
gmt = gmtime_r(&local, &result); gmt = gmtime_r(&local, &result);
(void)result; (void)result;
if(gmt) if(gmt)
exit(0); return 0;
else else
exit(1); return 1;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2134,13 +2143,13 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [
/* - */ /* - */
ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res)); ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res));
if(!ipv4ptr) if(!ipv4ptr)
exit(1); /* fail */ return 1; /* fail */
if(ipv4ptr != ipv4res) if(ipv4ptr != ipv4res)
exit(1); /* fail */ return 1; /* fail */
if(!ipv4ptr[0]) if(!ipv4ptr[0])
exit(1); /* fail */ return 1; /* fail */
if(memcmp(ipv4res, "192.168.100.1", 13) != 0) if(memcmp(ipv4res, "192.168.100.1", 13) != 0)
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
ipv6res[0] = '\0'; ipv6res[0] = '\0';
memset(ipv6a, 0, sizeof(ipv6a)); memset(ipv6a, 0, sizeof(ipv6a));
@ -2158,15 +2167,15 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [
/* - */ /* - */
ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
if(!ipv6ptr) if(!ipv6ptr)
exit(1); /* fail */ return 1; /* fail */
if(ipv6ptr != ipv6res) if(ipv6ptr != ipv6res)
exit(1); /* fail */ return 1; /* fail */
if(!ipv6ptr[0]) if(!ipv6ptr[0])
exit(1); /* fail */ return 1; /* fail */
if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0) if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0)
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
exit(0); return 0;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -2286,18 +2295,18 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
/* - */ /* - */
memset(ipv4a, 1, sizeof(ipv4a)); memset(ipv4a, 1, sizeof(ipv4a));
if(1 != inet_pton(AF_INET, ipv4src, ipv4a)) if(1 != inet_pton(AF_INET, ipv4src, ipv4a))
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
if( (ipv4a[0] != 0xc0) || if( (ipv4a[0] != 0xc0) ||
(ipv4a[1] != 0xa8) || (ipv4a[1] != 0xa8) ||
(ipv4a[2] != 0x64) || (ipv4a[2] != 0x64) ||
(ipv4a[3] != 0x01) || (ipv4a[3] != 0x01) ||
(ipv4a[4] != 0x01) ) (ipv4a[4] != 0x01) )
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
memset(ipv6a, 1, sizeof(ipv6a)); memset(ipv6a, 1, sizeof(ipv6a));
if(1 != inet_pton(AF_INET6, ipv6src, ipv6a)) if(1 != inet_pton(AF_INET6, ipv6src, ipv6a))
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
if( (ipv6a[0] != 0xfe) || if( (ipv6a[0] != 0xfe) ||
(ipv6a[1] != 0x80) || (ipv6a[1] != 0x80) ||
@ -2310,7 +2319,7 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
(ipv6a[14] != 0x76) || (ipv6a[14] != 0x76) ||
(ipv6a[15] != 0xc8) || (ipv6a[15] != 0xc8) ||
(ipv6a[16] != 0x01) ) (ipv6a[16] != 0x01) )
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
if( (ipv6a[2] != 0x0) || if( (ipv6a[2] != 0x0) ||
(ipv6a[3] != 0x0) || (ipv6a[3] != 0x0) ||
@ -2318,9 +2327,9 @@ AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [
(ipv6a[5] != 0x0) || (ipv6a[5] != 0x0) ||
(ipv6a[6] != 0x0) || (ipv6a[6] != 0x0) ||
(ipv6a[7] != 0x0) ) (ipv6a[7] != 0x0) )
exit(1); /* fail */ return 1; /* fail */
/* - */ /* - */
exit(0); return 0;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -3809,11 +3818,11 @@ AC_DEFUN([CURL_CHECK_FUNC_STRERROR_R], [
buffer[0] = '\0'; buffer[0] = '\0';
string = strerror_r(EACCES, buffer, sizeof(buffer)); string = strerror_r(EACCES, buffer, sizeof(buffer));
if(!string) if(!string)
exit(1); /* fail */ return 1; /* fail */
if(!string[0]) if(!string[0])
exit(1); /* fail */ return 1; /* fail */
else else
exit(0); return 0;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
@ -3872,11 +3881,11 @@ AC_DEFUN([CURL_CHECK_FUNC_STRERROR_R], [
buffer[0] = '\0'; buffer[0] = '\0';
error = strerror_r(EACCES, buffer, sizeof(buffer)); error = strerror_r(EACCES, buffer, sizeof(buffer));
if(error) if(error)
exit(1); /* fail */ return 1; /* fail */
if(buffer[0] == '\0') if(buffer[0] == '\0')
exit(1); /* fail */ return 1; /* fail */
else else
exit(0); return 0;
]]) ]])
],[ ],[
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])

View File

@ -48,7 +48,7 @@ int main(int argc, char **argv)
if(argc < 1) { if(argc < 1) {
puts("report_openssl_version filename"); puts("report_openssl_version filename");
exit(1); return 1;
} }
libptr = dlopen(argv[1], 0); libptr = dlopen(argv[1], 0);
@ -65,7 +65,7 @@ int main(int argc, char **argv)
if(!ssl_version) { if(!ssl_version) {
puts("Unable to lookup version of OpenSSL"); puts("Unable to lookup version of OpenSSL");
exit(1); return 1;
} }
version = ssl_version(SSLEAY_VERSION); version = ssl_version(SSLEAY_VERSION);
@ -91,9 +91,9 @@ int main(int argc, char **argv)
status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type); status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type);
if(!$VMS_STATUS_SUCCESS(status)) { if(!$VMS_STATUS_SUCCESS(status)) {
exit(status); return status;
} }
} }
exit(0); return 0;
} }

View File

@ -36,7 +36,7 @@ http
Download two URLs provided on stdin Download two URLs provided on stdin
</name> </name>
<command> <command>
--url @- --output-dir %LOGDIR --url @-
</command> </command>
<stdin> <stdin>
http://%HOSTIP:%HTTPPORT/a http://%HOSTIP:%HTTPPORT/a

View File

@ -34,7 +34,7 @@ if(NOT VSFTPD)
endif() endif()
mark_as_advanced(VSFTPD) mark_as_advanced(VSFTPD)
find_program(HTTPD "apache2") # /usr/sbin/apache2 find_program(HTTPD NAMES "/usr/sbin/apache2" "httpd" "apache2")
if(NOT HTTPD) if(NOT HTTPD)
set(HTTPD "") set(HTTPD "")
endif() endif()

View File

@ -140,12 +140,6 @@ static int debug_cb(CURL *handle, curl_infotype type,
return 0; return 0;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
exit(2); \
} while(0)
static void usage(const char *msg) static void usage(const char *msg)
{ {
if(msg) if(msg)
@ -196,6 +190,13 @@ static size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
handle->idx, (long)realsize); handle->idx, (long)realsize);
return realsize; return realsize;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
return 2; \
} while(0)
#endif /* !_MSC_VER */ #endif /* !_MSC_VER */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -254,19 +255,19 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
exit(1); return 1;
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
exit(1); return 1;
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
exit(1); return 1;
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
exit(1); return 1;
} }
memset(&resolve, 0, sizeof(resolve)); memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",

View File

@ -138,24 +138,25 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
const char *url; const char *url;
CURLM *multi; CURLM *multi = NULL;
CURL *easy; CURL *easy;
CURLMcode mc; CURLMcode mc;
int running_handles = 0, start_count, numfds; int running_handles = 0, start_count, numfds;
CURLMsg *msg; CURLMsg *msg;
int msgs_in_queue; int msgs_in_queue;
char range[128]; char range[128];
int exitcode = 1;
if(argc != 2) { if(argc != 2) {
fprintf(stderr, "%s URL\n", argv[0]); fprintf(stderr, "%s URL\n", argv[0]);
exit(2); return 2;
} }
url = argv[1]; url = argv[1];
multi = curl_multi_init(); multi = curl_multi_init();
if(!multi) { if(!multi) {
fprintf(stderr, "curl_multi_init failed\n"); fprintf(stderr, "curl_multi_init failed\n");
exit(1); goto cleanup;
} }
start_count = 200; start_count = 200;
@ -164,7 +165,7 @@ int main(int argc, char *argv[])
easy = curl_easy_init(); easy = curl_easy_init();
if(!easy) { if(!easy) {
fprintf(stderr, "curl_easy_init failed\n"); fprintf(stderr, "curl_easy_init failed\n");
exit(1); goto cleanup;
} }
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -186,8 +187,9 @@ int main(int argc, char *argv[])
mc = curl_multi_add_handle(multi, easy); mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n", fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); curl_easy_cleanup(easy);
goto cleanup;
} }
--start_count; --start_count;
} }
@ -195,16 +197,16 @@ int main(int argc, char *argv[])
mc = curl_multi_perform(multi, &running_handles); mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n", fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); goto cleanup;
} }
if(running_handles) { if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds); mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n", fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); goto cleanup;
} }
} }
@ -224,12 +226,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) { else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result); ": failed with %d\n", xfer_id, msg->data.result);
exit(1); goto cleanup;
} }
else if(status != 206) { else if(status != 206) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 206)\n", xfer_id, status); ": wrong http status %ld (expected 206)\n", xfer_id, status);
exit(1); goto cleanup;
} }
curl_multi_remove_handle(multi, msg->easy_handle); curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle); curl_easy_cleanup(msg->easy_handle);
@ -244,5 +246,22 @@ int main(int argc, char *argv[])
} while(running_handles > 0 || start_count); } while(running_handles > 0 || start_count);
fprintf(stderr, "exiting\n"); fprintf(stderr, "exiting\n");
exit(EXIT_SUCCESS); exitcode = EXIT_SUCCESS;
cleanup:
if(multi) {
CURL **list = curl_multi_get_handles(multi);
if(list) {
int i;
for(i = 0; list[i]; i++) {
curl_multi_remove_handle(multi, list[i]);
curl_easy_cleanup(list[i]);
}
curl_free(list);
}
curl_multi_cleanup(multi);
}
return exitcode;
} }

View File

@ -136,9 +136,9 @@ static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
return size * nmemb; return size * nmemb;
} }
static void add_transfer(CURLM *multi, CURLSH *share, static int add_transfer(CURLM *multi, CURLSH *share,
struct curl_slist *resolve, struct curl_slist *resolve,
const char *url, int http_version) const char *url, int http_version)
{ {
CURL *easy; CURL *easy;
CURLMcode mc; CURLMcode mc;
@ -146,7 +146,7 @@ static void add_transfer(CURLM *multi, CURLSH *share,
easy = curl_easy_init(); easy = curl_easy_init();
if(!easy) { if(!easy) {
fprintf(stderr, "curl_easy_init failed\n"); fprintf(stderr, "curl_easy_init failed\n");
exit(1); return 1;
} }
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L); curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb); curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
@ -167,30 +167,33 @@ static void add_transfer(CURLM *multi, CURLSH *share,
mc = curl_multi_add_handle(multi, easy); mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n", fprintf(stderr, "curl_multi_add_handle: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); curl_easy_cleanup(easy);
return 1;
} }
return 0;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
const char *url; const char *url;
CURLM *multi; CURLM *multi = NULL;
CURLMcode mc; CURLMcode mc;
int running_handles = 0, numfds; int running_handles = 0, numfds;
CURLMsg *msg; CURLMsg *msg;
CURLSH *share; CURLSH *share = NULL;
CURLU *cu; CURLU *cu;
struct curl_slist resolve; struct curl_slist *resolve = NULL;
char resolve_buf[1024]; char resolve_buf[1024];
int msgs_in_queue; int msgs_in_queue;
int add_more, waits, ongoing = 0; int add_more, waits, ongoing = 0;
char *host, *port; char *host = NULL, *port = NULL;
int http_version = CURL_HTTP_VERSION_1_1; int http_version = CURL_HTTP_VERSION_1_1;
int exitcode = 1;
if(argc != 3) { if(argc != 3) {
fprintf(stderr, "%s proto URL\n", argv[0]); fprintf(stderr, "%s proto URL\n", argv[0]);
exit(2); return 2;
} }
if(!strcmp("h2", argv[1])) if(!strcmp("h2", argv[1]))
@ -202,41 +205,41 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
exit(1); return 1;
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
exit(1); goto cleanup;
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
exit(1); goto cleanup;
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
exit(1); goto cleanup;
} }
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
host, port); host, port);
curl_slist_append(&resolve, resolve_buf); resolve = curl_slist_append(resolve, resolve_buf);
multi = curl_multi_init(); multi = curl_multi_init();
if(!multi) { if(!multi) {
fprintf(stderr, "curl_multi_init failed\n"); fprintf(stderr, "curl_multi_init failed\n");
exit(1); goto cleanup;
} }
share = curl_share_init(); share = curl_share_init();
if(!share) { if(!share) {
fprintf(stderr, "curl_share_init failed\n"); fprintf(stderr, "curl_share_init failed\n");
exit(1); goto cleanup;
} }
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
add_transfer(multi, share, &resolve, url, http_version); if(add_transfer(multi, share, resolve, url, http_version))
goto cleanup;
++ongoing; ++ongoing;
add_more = 6; add_more = 6;
waits = 3; waits = 3;
@ -244,16 +247,16 @@ int main(int argc, char *argv[])
mc = curl_multi_perform(multi, &running_handles); mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n", fprintf(stderr, "curl_multi_perform: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); goto cleanup;
} }
if(running_handles) { if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds); mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) { if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n", fprintf(stderr, "curl_multi_poll: %s\n",
curl_multi_strerror(mc)); curl_multi_strerror(mc));
exit(1); goto cleanup;
} }
} }
@ -262,7 +265,8 @@ int main(int argc, char *argv[])
} }
else { else {
while(add_more) { while(add_more) {
add_transfer(multi, share, &resolve, url, http_version); if(add_transfer(multi, share, resolve, url, http_version))
goto cleanup;
++ongoing; ++ongoing;
--add_more; --add_more;
} }
@ -284,12 +288,12 @@ int main(int argc, char *argv[])
else if(msg->data.result) { else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result); ": failed with %d\n", xfer_id, msg->data.result);
exit(1); goto cleanup;
} }
else if(status != 200) { else if(status != 200) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 200)\n", xfer_id, status); ": wrong http status %ld (expected 200)\n", xfer_id, status);
exit(1); goto cleanup;
} }
curl_multi_remove_handle(multi, msg->easy_handle); curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle); curl_easy_cleanup(msg->easy_handle);
@ -305,5 +309,27 @@ int main(int argc, char *argv[])
} while(ongoing || add_more); } while(ongoing || add_more);
fprintf(stderr, "exiting\n"); fprintf(stderr, "exiting\n");
exit(EXIT_SUCCESS); exitcode = EXIT_SUCCESS;
cleanup:
if(multi) {
CURL **list = curl_multi_get_handles(multi);
if(list) {
int i;
for(i = 0; list[i]; i++) {
curl_multi_remove_handle(multi, list[i]);
curl_easy_cleanup(list[i]);
}
curl_free(list);
}
curl_multi_cleanup(multi);
}
curl_share_cleanup(share);
curl_slist_free_all(resolve);
curl_free(host);
curl_free(port);
curl_url_cleanup(cu);
return exitcode;
} }

View File

@ -180,12 +180,6 @@ static int progress_callback(void *clientp,
return 0; return 0;
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
exit(2); \
} while(0)
static void usage(const char *msg) static void usage(const char *msg)
{ {
if(msg) if(msg)
@ -196,6 +190,13 @@ static void usage(const char *msg)
" -V http_version (http/1.1, h2, h3) http version to use\n" " -V http_version (http/1.1, h2, h3) http version to use\n"
); );
} }
#define ERR() \
do { \
fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
return 2; \
} while(0)
#endif /* !_MSC_VER */ #endif /* !_MSC_VER */
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -245,19 +246,19 @@ int main(int argc, char *argv[])
cu = curl_url(); cu = curl_url();
if(!cu) { if(!cu) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
exit(1); return 1;
} }
if(curl_url_set(cu, CURLUPART_URL, url, 0)) { if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url); fprintf(stderr, "not a URL: '%s'\n", url);
exit(1); return 1;
} }
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) { if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url); fprintf(stderr, "could not get host of '%s'\n", url);
exit(1); return 1;
} }
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) { if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url); fprintf(stderr, "could not get port of '%s'\n", url);
exit(1); return 1;
} }
memset(&resolve, 0, sizeof(resolve)); memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1", curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
@ -267,7 +268,7 @@ int main(int argc, char *argv[])
curl = curl_easy_init(); curl = curl_easy_init();
if(!curl) { if(!curl) {
fprintf(stderr, "out of memory\n"); fprintf(stderr, "out of memory\n");
exit(1); return 1;
} }
/* We want to use our own read function. */ /* We want to use our own read function. */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

View File

@ -21,7 +21,7 @@
* SPDX-License-Identifier: curl * SPDX-License-Identifier: curl
* *
***************************************************************************/ ***************************************************************************/
/* used for test case 533, 534 and 535 */ /* used for test case 533, 534, 535 and 546 */
#include "test.h" #include "test.h"

View File

@ -1018,8 +1018,8 @@ int main(int argc, char *argv[])
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -99,8 +99,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
#if defined(CURLRES_IPV6) #if defined(CURLRES_IPV6)

View File

@ -1145,8 +1145,8 @@ int main(int argc, char *argv[])
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
install_signal_handlers(false); install_signal_handlers(false);

View File

@ -1507,8 +1507,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -1086,8 +1086,8 @@ int main(int argc, char *argv[])
} }
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
CURL_SET_BINMODE(stdin); CURL_SET_BINMODE(stdin);

View File

@ -1611,7 +1611,7 @@ static void http_connect(curl_socket_t *infdp,
if(!req2) { if(!req2) {
req2 = malloc(sizeof(*req2)); req2 = malloc(sizeof(*req2));
if(!req2) if(!req2)
exit(1); goto http_connect_cleanup; /* fail */
} }
memset(req2, 0, sizeof(*req2)); memset(req2, 0, sizeof(*req2));
logmsg("====> Client connect DATA"); logmsg("====> Client connect DATA");
@ -2207,8 +2207,8 @@ int main(int argc, char *argv[])
is_proxy ? "-proxy" : "", socket_type); is_proxy ? "-proxy" : "", socket_type);
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
install_signal_handlers(false); install_signal_handlers(false);

View File

@ -644,8 +644,8 @@ int main(int argc, char **argv)
logdir, SERVERLOGS_LOCKDIR, ipv_inuse); logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32 #ifdef _WIN32
win32_init(); if(win32_init())
atexit(win32_cleanup); return 2;
#endif #endif
install_signal_handlers(true); install_signal_handlers(true);

View File

@ -153,7 +153,17 @@ void win32_perror(const char *msg)
fprintf(stderr, "%s\n", buf); fprintf(stderr, "%s\n", buf);
} }
void win32_init(void) static void win32_cleanup(void)
{
#ifdef USE_WINSOCK
WSACleanup();
#endif /* USE_WINSOCK */
/* flush buffers of all streams regardless of their mode */
_flushall();
}
int win32_init(void)
{ {
#ifdef USE_WINSOCK #ifdef USE_WINSOCK
WORD wVersionRequested; WORD wVersionRequested;
@ -166,7 +176,7 @@ void win32_init(void)
if(err) { if(err) {
perror("Winsock init failed"); perror("Winsock init failed");
logmsg("Error initialising Winsock -- aborting"); logmsg("Error initialising Winsock -- aborting");
exit(1); return 1;
} }
if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) || if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
@ -174,19 +184,11 @@ void win32_init(void)
WSACleanup(); WSACleanup();
perror("Winsock init failed"); perror("Winsock init failed");
logmsg("No suitable winsock.dll found -- aborting"); logmsg("No suitable winsock.dll found -- aborting");
exit(1); return 1;
} }
#endif /* USE_WINSOCK */ #endif /* USE_WINSOCK */
} atexit(win32_cleanup);
return 0;
void win32_cleanup(void)
{
#ifdef USE_WINSOCK
WSACleanup();
#endif /* USE_WINSOCK */
/* flush buffers of all streams regardless of their mode */
_flushall();
} }
/* socket-safe strerror (works on Winsock errors, too) */ /* socket-safe strerror (works on Winsock errors, too) */

View File

@ -51,8 +51,7 @@ extern const char *cmdfile;
#define perror(m) win32_perror(m) #define perror(m) win32_perror(m)
void win32_perror(const char *msg); void win32_perror(const char *msg);
void win32_init(void); int win32_init(void);
void win32_cleanup(void);
const char *sstrerror(int err); const char *sstrerror(int err);
#else /* _WIN32 */ #else /* _WIN32 */

View File

@ -58,9 +58,11 @@ CFGSET=true
!ENDIF !ENDIF
!INCLUDE "../lib/Makefile.inc" !INCLUDE "../lib/Makefile.inc"
CSOURCES=$(CSOURCES: = )
LIBCURL_OBJS=$(CSOURCES:.c=.obj) LIBCURL_OBJS=$(CSOURCES:.c=.obj)
!INCLUDE "../src/Makefile.inc" !INCLUDE "../src/Makefile.inc"
CURL_CFILES=$(CURL_CFILES: = )
CURL_OBJS=$(CURL_CFILES:.c=.obj) CURL_OBJS=$(CURL_CFILES:.c=.obj)