Use non-deprecated CRT function variants on Windows.
- introduce `curlx_fdopen()`, `curlx_close()` and use them. Map them to
non-deprecated, underscored, CRT functions on Windows.
- replace `close()` uses with either `sclose()` (for sockets) or
`curlx_close()` (for files).
- map `fileno`, `unlink`, `isatty` to their non-deprecated, underscored,
versions on Windows.
- tool_dirhie: map `mkdir` to `_mkdir` on Windows.
- easy: use `_strdup()` on Windows, regardless of how `HAVE_STRDUP` is
set.
- cmake: assume `HAVE_STRDUP` on Windows. To allow dropping a detection
hack using `_CRT_NONSTDC_NO_DEPRECATE` with MSVC. Windows always has
`_strdup()` which the code uses, but also needs `HAVE_STRDUP` defined
to disable curl's own `strdup()` implementation.
- curl_setup.h: drop `_CRT_NONSTDC_NO_DEPRECATE` as no longer necessary.
Closes #20212
set(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1)
set(HAVE_SOCKET 1)
set(HAVE_SOCKETPAIR 0)
-set(HAVE_STRDUP 1)
set(HAVE_STRERROR_R 0)
set(HAVE_STROPTS_H 0)
set(HAVE_STRUCT_SOCKADDR_STORAGE 1)
# Apply to all feature checks
list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
- if(MSVC)
- list(APPEND CMAKE_REQUIRED_DEFINITIONS "-D_CRT_NONSTDC_NO_DEPRECATE") # for strdup() detection
- endif()
set(CURL_TARGET_WINDOWS_VERSION "" CACHE STRING "Minimum target Windows version as hex string")
if(CURL_TARGET_WINDOWS_VERSION)
check_function_exists("sendmsg" HAVE_SENDMSG)
check_function_exists("sendmmsg" HAVE_SENDMMSG)
check_symbol_exists("select" "${CURL_INCLUDES}" HAVE_SELECT) # proto/bsdsocket.h sys/select.h sys/socket.h
-check_symbol_exists("strdup" "string.h" HAVE_STRDUP)
check_symbol_exists("memrchr" "string.h" HAVE_MEMRCHR)
check_symbol_exists("alarm" "unistd.h" HAVE_ALARM)
check_symbol_exists("fcntl" "fcntl.h" HAVE_FCNTL)
check_function_exists("setlocale" HAVE_SETLOCALE)
check_function_exists("setrlimit" HAVE_SETRLIMIT)
-if(NOT WIN32)
+if(WIN32)
+ set(HAVE_STRDUP 1) # to not define local implementation. curl uses _strdup() on Windows.
+else()
check_function_exists("if_nametoindex" HAVE_IF_NAMETOINDEX) # net/if.h
check_function_exists("realpath" HAVE_REALPATH)
check_function_exists("sched_yield" HAVE_SCHED_YIELD)
check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP)
+ check_symbol_exists("strdup" "string.h" HAVE_STRDUP)
check_symbol_exists("stricmp" "string.h" HAVE_STRICMP)
check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI)
endif()
allowfunc atoi
allowfunc atol
allowfunc calloc
+allowfunc close
allowfunc fclose
allowfunc fdopen
allowfunc fopen
atoi
atol
calloc
+ close
CreateFile
CreateFileA
CreateFileW
if(fcntl(*sockfd, F_SETFD, FD_CLOEXEC) < 0) {
failf(data, "fcntl set CLOEXEC: %s",
curlx_strerror(SOCKERRNO, errbuf, sizeof(errbuf)));
- close(*sockfd);
+ sclose(*sockfd);
*sockfd = CURL_SOCKET_BAD;
return CURLE_COULDNT_CONNECT;
}
fail:
if(fd != -1) {
- close(fd);
+ curlx_close(fd);
unlink(tempstore);
}
#ifdef _MSC_VER
/* Disable Visual Studio warnings: 4127 "conditional expression is constant" */
#pragma warning(disable:4127)
-/* Avoid VS2005 and upper complaining about portable C functions. */
-#ifndef _CRT_NONSTDC_NO_DEPRECATE /* mingw-w64 v2+. MS SDK ~10+/~VS2017+. */
-#define _CRT_NONSTDC_NO_DEPRECATE /* for close(), fileno(), unlink(), etc. */
-#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS /* for getenv(), tests: sscanf() */
#endif
# define read(fd, buf, count) (ssize_t)_read(fd, buf, curlx_uztoui(count))
# undef write
# define write(fd, buf, count) (ssize_t)_write(fd, buf, curlx_uztoui(count))
+/* Avoid VS2005+ _CRT_NONSTDC_NO_DEPRECATE warnings about non-portable funcs */
+# undef fileno
+# define fileno(fh) _fileno(fh)
+# undef unlink
+# define unlink(fn) _unlink(fn)
+# undef isatty
+# define isatty(fd) _isatty(fd)
#endif
/*
int curlx_win32_rename(const char *oldpath, const char *newpath);
#define CURLX_FOPEN_LOW(fname, mode) curlx_win32_fopen(fname, mode)
#define CURLX_FREOPEN_LOW(fname, mode, fh) curlx_win32_freopen(fname, mode, fh)
+#define CURLX_FDOPEN_LOW _fdopen
#define curlx_stat(fname, stp) curlx_win32_stat(fname, stp)
#define curlx_open curlx_win32_open
+#define curlx_close _close
#define curlx_rename curlx_win32_rename
#else
#define CURLX_FOPEN_LOW fopen
#define CURLX_FREOPEN_LOW freopen
+#define CURLX_FDOPEN_LOW fdopen
#define curlx_stat(fname, stp) stat(fname, stp)
#define curlx_open open
+#define curlx_close close
#define curlx_rename rename
#endif
#else
#define curlx_fopen CURLX_FOPEN_LOW
#define curlx_freopen CURLX_FREOPEN_LOW
-#define curlx_fdopen fdopen
+#define curlx_fdopen CURLX_FDOPEN_LOW
#define curlx_fclose fclose
#endif
* ways, but at this point it must be defined as the system-supplied strdup
* so the callback pointer is initialized correctly.
*/
-#ifdef HAVE_STRDUP
#ifdef _WIN32
#define system_strdup _strdup
-#else
+#elif defined(HAVE_STRDUP)
#define system_strdup strdup
-#endif
#else
#define system_strdup Curl_strdup
#endif
Curl_safefree(file->freepath);
file->path = NULL;
if(file->fd != -1) {
- close(file->fd);
+ curlx_close(file->fd);
file->fd = -1;
}
}
/* treat the negative resume offset value as the case of "-" */
if(data->state.resume_from < 0) {
if(fstat(fd, &file_stat)) {
- close(fd);
+ curlx_close(fd);
failf(data, "cannot get the size of %s", file->path);
return CURLE_WRITE_ERROR;
}
result = Curl_pgrsUpdate(data);
out:
- close(fd);
+ curlx_close(fd);
Curl_multi_xfer_ulbuf_release(data, xfer_ulbuf);
return result;
FILE *curl_dbg_fdopen(int filedes, const char *mode,
int line, const char *source)
{
- /* !checksrc! disable BANNEDFUNC 1 */
- FILE *res = fdopen(filedes, mode);
+ FILE *res = CURLX_FDOPEN_LOW(filedes, mode);
if(source)
curl_dbg_log("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n",
source, line, filedes, mode, (void *)res);
#ifdef HAVE_FCNTL
if(fcntl(socks[0], F_SETFD, FD_CLOEXEC) ||
fcntl(socks[1], F_SETFD, FD_CLOEXEC)) {
- close(socks[0]);
- close(socks[1]);
+ sclose(socks[0]);
+ sclose(socks[1]);
socks[0] = socks[1] = CURL_SOCKET_BAD;
return -1;
}
if(nonblocking) {
if(curlx_nonblock(socks[0], TRUE) < 0 ||
curlx_nonblock(socks[1], TRUE) < 0) {
- close(socks[0]);
- close(socks[1]);
+ sclose(socks[0]);
+ sclose(socks[1]);
socks[0] = socks[1] = CURL_SOCKET_BAD;
return -1;
}
if(nonblocking) {
if(curlx_nonblock(socks[0], TRUE) < 0 ||
curlx_nonblock(socks[1], TRUE) < 0) {
- close(socks[0]);
- close(socks[1]);
+ sclose(socks[0]);
+ sclose(socks[1]);
return -1;
}
}
#include "../cf-socket.h"
#include "../connect.h"
#include "../progress.h"
+#include "../curlx/fopen.h"
#include "../curlx/dynbuf.h"
#include "../http1.h"
#include "../select.h"
ssize_t rc = write(ctx->qlogfd, data, datalen);
if(rc == -1) {
/* on write error, stop further write attempts */
- close(ctx->qlogfd);
+ curlx_close(ctx->qlogfd);
ctx->qlogfd = -1;
}
}
if(!ctx->initialized)
return;
if(ctx->qlogfd != -1) {
- close(ctx->qlogfd);
+ curlx_close(ctx->qlogfd);
}
ctx->qlogfd = -1;
Curl_vquic_tls_cleanup(&ctx->tls);
"atoi" => 1,
"atol" => 1,
"calloc" => 1,
+ "close" => 1,
"CreateFile" => 1,
"CreateFileA" => 1,
"CreateFileW" => 1,
if(fd != -1) {
file = curlx_fdopen(fd, "wb");
if(!file)
- close(fd);
+ curlx_close(fd);
}
}
***************************************************************************/
#include "tool_setup.h"
-#ifdef _WIN32
-#include <direct.h>
-#endif
-
#include "tool_dirhie.h"
#include "tool_msgs.h"
-#if defined(_WIN32) || (defined(MSDOS) && !defined(__DJGPP__))
+#ifdef _WIN32
+# include <direct.h>
+# define mkdir(x, y) _mkdir(x)
+#elif defined(MSDOS) && !defined(__DJGPP__)
# define mkdir(x, y) (mkdir)(x)
#endif
int fd = curlx_open(c, O_RDONLY);
if(fd >= 0) {
char *path = curlx_strdup(c);
- close(fd);
+ curlx_close(fd);
curl_free(c);
return path;
}
}
if(STDIN_FILENO != fd)
- close(fd);
+ curlx_close(fd);
return password; /* return pointer to buffer */
}
{
helpf("cannot open '%s'", per->uploadfile);
if(per->infd != -1) {
- close(per->infd);
+ curlx_close(per->infd);
per->infd = STDIN_FILENO;
}
return CURLE_READ_ERROR;
else
#endif
if(per->infdopen)
- close(per->infd);
+ curlx_close(per->infd);
if(per->skip)
goto skip;
t518_num_open.rlim_cur < t518_num_open.rlim_max;
t518_num_open.rlim_cur++)
if(t518_testfd[t518_num_open.rlim_cur] > 0)
- close(t518_testfd[t518_num_open.rlim_cur]);
+ curlx_close(t518_testfd[t518_num_open.rlim_cur]);
curlx_free(t518_testfd);
t518_testfd = NULL;
}
for(t518_num_open.rlim_cur = 0;
t518_testfd[t518_num_open.rlim_cur] >= 0;
t518_num_open.rlim_cur++)
- close(t518_testfd[t518_num_open.rlim_cur]);
+ curlx_close(t518_testfd[t518_num_open.rlim_cur]);
curlx_free(t518_testfd);
t518_testfd = NULL;
curlx_free(memchunk);
t537_num_open.rlim_cur < t537_num_open.rlim_max;
t537_num_open.rlim_cur++)
if(t537_testfd[t537_num_open.rlim_cur] > 0)
- close(t537_testfd[t537_num_open.rlim_cur]);
+ curlx_close(t537_testfd[t537_num_open.rlim_cur]);
curlx_free(t537_testfd);
t537_testfd = NULL;
}
for(t537_num_open.rlim_cur = t537_num_open.rlim_max;
t537_testfd[t537_num_open.rlim_cur] >= 0;
t537_num_open.rlim_cur++) {
- close(t537_testfd[t537_num_open.rlim_cur]);
+ curlx_close(t537_testfd[t537_num_open.rlim_cur]);
t537_testfd[t537_num_open.rlim_cur] = -1;
}
goto test_cleanup;
}
fstat(sdp, &file_info);
- close(sdp);
+ curlx_close(sdp);
sdpf = curlx_fopen(libtest_arg2, "rb");
if(!sdpf) {
goto test_cleanup;
}
fstat(params, &file_info);
- close(params);
+ curlx_close(params);
paramsf = curlx_fopen(libtest_arg2, "rb");
if(!paramsf) {
write_behind(test, pf->f_convert);
/* close the output file as early as possible after upload completion */
if(test->ofile > 0) {
- close(test->ofile);
+ curlx_close(test->ofile);
test->ofile = 0;
}
abort:
/* make sure the output file is closed in case of abort */
if(test->ofile > 0) {
- close(test->ofile);
+ curlx_close(test->ofile);
test->ofile = 0;
}
return;
tftpd_cleanup:
if(test.ofile > 0)
- close(test.ofile);
+ curlx_close(test.ofile);
if((peer != sock) && (peer != CURL_SOCKET_BAD))
sclose(peer);
#endif
static const char msg[] = "exit_signal_handler: called\n";
(void)!write(fd, msg, sizeof(msg) - 1);
- close(fd);
+ curlx_close(fd);
}
else {
static const char msg[] = "exit_signal_handler: failed opening ";