mirror of
https://github.com/curl/curl.git
synced 2026-04-23 03:12:13 +03:00
Before this patch, standard `E*` errno codes were redefined on Windows,
onto matching winsock2 `WSA*` error codes, which have different values.
This broke uses where using the `E*` value in non-socket context, or
other places expecting a POSIX `errno`, e.g. file I/O, threads, IDN or
interfacing with dependencies.
Fix it by introducing a curl-specific `SOCKE*` set of macros that map to
`WSA*` on Windows and standard POSIX codes on other platforms. Then
verify and update the code to use `SOCKE*` or `E*` macro depending on
context.
- Add `SOCKE*` macros that map to either winsock2 or POSIX error codes.
And use them with `SOCKERRNO` or in contexts requiring
platform-dependent socket error codes.
This fixes `E*` uses which were supposed be POSIX values, not `WSA*`
socket errors, on Windows:
- lib/curl_multibyte.c
- lib/curl_threads.c
- lib/idn.c
- lib/vtls/gtls.c
- lib/vtls/rustls.c
- src/tool_cb_wrt.c
- src/tool_dirhie.c
- Ban `E*` codes having a `SOCKE*` mapping, via checksrc.
Authored-by: Daniel Stenberg
- Add exceptions for `E*` codes used in file I/O, or other contexts
requiring POSIX error codes.
Also:
- ftp: fix missing `SOCKEACCES` mapping for Windows.
- add `SOCKENOMEM` for `Curl_getaddrinfo()` via `asyn-thread.c`.
- tests/server/sockfilt: fix to set `SOCKERRNO` in local `select()`
override on Windows.
- lib/inet_ntop: fix to return `WSAEINVAL` on Windows, where `ENOSPC` is
used on other platforms. To simulate Windows' built-in `inet_ntop()`,
as tested on a Win10 machine.
Note:
- WINE returns `STATUS_INVALID_PARAMETER` = `0xC000000D`.
- Microsoft documentation says it returns `WSA_INVALID_PARAMETER`
(= `ERROR_INVALID_PARAMETER`) 87:
https://learn.microsoft.com/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_ntop#return-value
- lib/inet_ntop: drop redundant `CURL_SETERRNO(ENOSPC)`.
`inet_ntop4()` already sets it before returning `NULL`.
- replace stray `WSAEWOULDBLOCK` with `USE_WINSOCK` macro to detect
winsock2.
- move existing `SOCKE*` mappings from `tests/server` to
`curl_setup_once.h`.
- add missing `EINTR`, `EINVAL` constants for WinCE.
Follow-up to abf80aae38 #16612
Follow-up to d69425ed7d #16615
Bug: https://github.com/curl/curl/pull/16553#issuecomment-2704679377
Closes #16621
106 lines
3.3 KiB
C
106 lines
3.3 KiB
C
#ifndef HEADER_CURL_SERVER_UTIL_H
|
|
#define HEADER_CURL_SERVER_UTIL_H
|
|
/***************************************************************************
|
|
* _ _ ____ _
|
|
* Project ___| | | | _ \| |
|
|
* / __| | | | |_) | |
|
|
* | (__| |_| | _ <| |___
|
|
* \___|\___/|_| \_\_____|
|
|
*
|
|
* Copyright (C) Daniel Stenberg, <daniel@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.
|
|
*
|
|
* SPDX-License-Identifier: curl
|
|
*
|
|
***************************************************************************/
|
|
#include "server_setup.h"
|
|
|
|
enum {
|
|
DOCNUMBER_NOTHING = -7,
|
|
DOCNUMBER_QUIT = -6,
|
|
DOCNUMBER_BADCONNECT = -5,
|
|
DOCNUMBER_INTERNAL = -4,
|
|
DOCNUMBER_CONNECT = -3,
|
|
DOCNUMBER_WERULEZ = -2,
|
|
DOCNUMBER_404 = -1
|
|
};
|
|
|
|
char *data_to_hex(char *data, size_t len);
|
|
void logmsg(const char *msg, ...) CURL_PRINTF(1, 2);
|
|
void loghex(unsigned char *buffer, ssize_t len);
|
|
unsigned char byteval(char *value);
|
|
|
|
#define SERVERLOGS_LOCKDIR "lock" /* within logdir */
|
|
|
|
/* global variables */
|
|
extern const char *path; /* where to find the 'data' dir */
|
|
extern const char *pidname;
|
|
extern const char *portname;
|
|
extern const char *serverlogfile; /* log file name */
|
|
extern int serverlogslocked;
|
|
extern const char *configfile;
|
|
extern const char *logdir;
|
|
extern char loglockfile[256];
|
|
#ifdef USE_IPV6
|
|
extern bool use_ipv6;
|
|
#endif
|
|
extern const char *ipv_inuse;
|
|
extern unsigned short server_port;
|
|
extern const char *socket_type;
|
|
extern int socket_domain;
|
|
|
|
#ifdef _WIN32
|
|
int win32_init(void);
|
|
const char *sstrerror(int err);
|
|
#else
|
|
#define sstrerror(e) strerror(e)
|
|
#endif
|
|
|
|
/* fopens the test case file */
|
|
FILE *test2fopen(long testno, const char *logdir);
|
|
|
|
#include "timeval.h"
|
|
|
|
int wait_ms(timediff_t timeout_ms);
|
|
curl_off_t our_getpid(void);
|
|
int write_pidfile(const char *filename);
|
|
int write_portfile(const char *filename, int port);
|
|
void set_advisor_read_lock(const char *filename);
|
|
void clear_advisor_read_lock(const char *filename);
|
|
|
|
/* global variable which if set indicates that the program should finish */
|
|
extern volatile int got_exit_signal;
|
|
|
|
/* global variable which if set indicates the first signal handled */
|
|
extern volatile int exit_signal;
|
|
|
|
#ifdef _WIN32
|
|
/* global event which if set indicates that the program should finish */
|
|
extern HANDLE exit_event;
|
|
#endif
|
|
|
|
void install_signal_handlers(bool keep_sigalrm);
|
|
void restore_signal_handlers(bool keep_sigalrm);
|
|
|
|
#ifdef USE_UNIX_SOCKETS
|
|
#include <curl/curl.h> /* for curl_socket_t */
|
|
#ifdef HAVE_SYS_UN_H
|
|
#include <sys/un.h> /* for sockaddr_un */
|
|
#endif
|
|
int bind_unix_socket(curl_socket_t sock, const char *unix_socket,
|
|
struct sockaddr_un *sau);
|
|
#endif /* USE_UNIX_SOCKETS */
|
|
|
|
unsigned short util_ultous(unsigned long ulnum);
|
|
|
|
#endif /* HEADER_CURL_SERVER_UTIL_H */
|