mirror of
https://github.com/curl/curl.git
synced 2024-11-27 05:50:21 +08:00
strerror: Preserve Windows error code in some functions
This is a follow-up toaf02162
which removed (SET_)ERRNO macros. That commit was an earlier draft that I committed by mistake, which was then remedied bya5834e5
ande909de6
, and now this commit. With this commit there is now no difference between the current code and the changes that were approved in the final draft. Thanks-to: Max Dymond, Marcel Raad, Daniel Stenberg, Gisle Vanem Ref: https://github.com/curl/curl/pull/1589
This commit is contained in:
parent
e909de65b9
commit
c5e87fdb7a
@ -49,6 +49,10 @@
|
||||
#include "curl_memory.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
#if defined(WIN32) || defined(_WIN32_WCE)
|
||||
#define PRESERVE_WINDOWS_ERROR_CODE
|
||||
#endif
|
||||
|
||||
const char *
|
||||
curl_easy_strerror(CURLcode error)
|
||||
{
|
||||
@ -432,6 +436,10 @@ curl_share_strerror(CURLSHcode error)
|
||||
static const char *
|
||||
get_winsock_error (int err, char *buf, size_t len)
|
||||
{
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
DWORD old_win_err = GetLastError();
|
||||
#endif
|
||||
int old_errno = errno;
|
||||
const char *p;
|
||||
|
||||
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||
@ -611,6 +619,15 @@ get_winsock_error (int err, char *buf, size_t len)
|
||||
#endif
|
||||
strncpy(buf, p, len);
|
||||
buf [len-1] = '\0';
|
||||
|
||||
if(errno != old_errno)
|
||||
errno = old_errno;
|
||||
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
if(old_win_err != GetLastError())
|
||||
SetLastError(old_win_err);
|
||||
#endif
|
||||
|
||||
return buf;
|
||||
}
|
||||
#endif /* USE_WINSOCK */
|
||||
@ -628,19 +645,16 @@ get_winsock_error (int err, char *buf, size_t len)
|
||||
*/
|
||||
const char *Curl_strerror(struct connectdata *conn, int err)
|
||||
{
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
DWORD old_win_err = GetLastError();
|
||||
#endif
|
||||
int old_errno = errno;
|
||||
char *buf, *p;
|
||||
size_t max;
|
||||
int old_errno;
|
||||
#ifdef WIN32
|
||||
DWORD old_win_err;
|
||||
#endif
|
||||
|
||||
DEBUGASSERT(conn);
|
||||
DEBUGASSERT(err >= 0);
|
||||
|
||||
old_errno = errno;
|
||||
#ifdef WIN32
|
||||
old_win_err = GetLastError();
|
||||
#endif
|
||||
buf = conn->syserr_buf;
|
||||
max = sizeof(conn->syserr_buf)-1;
|
||||
*buf = '\0';
|
||||
@ -727,12 +741,14 @@ const char *Curl_strerror(struct connectdata *conn, int err)
|
||||
p = strrchr(buf, '\r');
|
||||
if(p && (p - buf) >= 1)
|
||||
*p = '\0';
|
||||
#ifdef WIN32
|
||||
|
||||
if(errno != old_errno)
|
||||
errno = old_errno;
|
||||
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
if(old_win_err != GetLastError())
|
||||
SetLastError(old_win_err);
|
||||
#endif
|
||||
if(errno != old_errno)
|
||||
errno = old_errno;
|
||||
|
||||
return buf;
|
||||
}
|
||||
@ -740,17 +756,19 @@ const char *Curl_strerror(struct connectdata *conn, int err)
|
||||
#ifdef USE_WINDOWS_SSPI
|
||||
const char *Curl_sspi_strerror (struct connectdata *conn, int err)
|
||||
{
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
DWORD old_win_err = GetLastError();
|
||||
#endif
|
||||
int old_errno = errno;
|
||||
const char *txt;
|
||||
char *outbuf;
|
||||
size_t outmax;
|
||||
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||
char txtbuf[80];
|
||||
char msgbuf[sizeof(conn->syserr_buf)];
|
||||
char *p, *str, *msg = NULL;
|
||||
bool msg_formatted = FALSE;
|
||||
int old_errno;
|
||||
DWORD old_win_err;
|
||||
#endif
|
||||
const char *txt;
|
||||
char *outbuf;
|
||||
size_t outmax;
|
||||
|
||||
DEBUGASSERT(conn);
|
||||
|
||||
@ -760,9 +778,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
|
||||
|
||||
#ifndef CURL_DISABLE_VERBOSE_STRINGS
|
||||
|
||||
old_errno = errno;
|
||||
old_win_err = GetLastError();
|
||||
|
||||
switch(err) {
|
||||
case SEC_E_OK:
|
||||
txt = "No error";
|
||||
@ -1062,12 +1077,6 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
|
||||
strncpy(outbuf, str, outmax);
|
||||
}
|
||||
|
||||
if(old_win_err != GetLastError())
|
||||
SetLastError(old_win_err);
|
||||
|
||||
if(errno != old_errno)
|
||||
errno = old_errno;
|
||||
|
||||
#else
|
||||
|
||||
if(err == SEC_E_OK)
|
||||
@ -1081,6 +1090,14 @@ const char *Curl_sspi_strerror (struct connectdata *conn, int err)
|
||||
|
||||
outbuf[outmax] = '\0';
|
||||
|
||||
if(errno != old_errno)
|
||||
errno = old_errno;
|
||||
|
||||
#ifdef PRESERVE_WINDOWS_ERROR_CODE
|
||||
if(old_win_err != GetLastError())
|
||||
SetLastError(old_win_err);
|
||||
#endif
|
||||
|
||||
return outbuf;
|
||||
}
|
||||
#endif /* USE_WINDOWS_SSPI */
|
||||
|
@ -42,7 +42,6 @@ int test(char *URL)
|
||||
int hd;
|
||||
struct_stat file_info;
|
||||
struct curl_slist *hl;
|
||||
int error;
|
||||
|
||||
struct curl_slist *headerlist=NULL;
|
||||
const char *buf_1 = "RNFR 505";
|
||||
@ -55,9 +54,8 @@ int test(char *URL)
|
||||
|
||||
hd_src = fopen(libtest_arg2, "rb");
|
||||
if(NULL == hd_src) {
|
||||
error = errno;
|
||||
fprintf(stderr, "fopen failed with error: %d %s\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "Error opening file: %s\n", libtest_arg2);
|
||||
return TEST_ERR_MAJOR_BAD; /* if this happens things are major weird */
|
||||
}
|
||||
@ -66,9 +64,8 @@ int test(char *URL)
|
||||
hd = fstat(fileno(hd_src), &file_info);
|
||||
if(hd == -1) {
|
||||
/* can't open file, bail out */
|
||||
error = errno;
|
||||
fprintf(stderr, "fstat() failed with error: %d %s\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
|
||||
fclose(hd_src);
|
||||
return TEST_ERR_MAJOR_BAD;
|
||||
|
@ -35,7 +35,6 @@ int test(char *URL)
|
||||
CURL *curl = NULL;
|
||||
FILE *hd_src = NULL;
|
||||
int hd;
|
||||
int error;
|
||||
struct_stat file_info;
|
||||
CURLM *m = NULL;
|
||||
int running;
|
||||
@ -55,9 +54,8 @@ int test(char *URL)
|
||||
|
||||
hd_src = fopen(libtest_arg2, "rb");
|
||||
if(NULL == hd_src) {
|
||||
error = errno;
|
||||
fprintf(stderr, "fopen failed with error: %d (%s)\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2);
|
||||
return TEST_ERR_FOPEN;
|
||||
}
|
||||
@ -66,9 +64,8 @@ int test(char *URL)
|
||||
hd = fstat(fileno(hd_src), &file_info);
|
||||
if(hd == -1) {
|
||||
/* can't open file, bail out */
|
||||
error = errno;
|
||||
fprintf(stderr, "fstat() failed with error: %d (%s)\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2);
|
||||
fclose(hd_src);
|
||||
return TEST_ERR_FSTAT;
|
||||
|
@ -38,7 +38,6 @@ int test(char *URL)
|
||||
FILE *hd_src;
|
||||
int hd;
|
||||
struct_stat file_info;
|
||||
int error;
|
||||
|
||||
if(!libtest_arg2) {
|
||||
fprintf(stderr, "Usage: <url> <file-to-upload>\n");
|
||||
@ -47,9 +46,8 @@ int test(char *URL)
|
||||
|
||||
hd_src = fopen(libtest_arg2, "rb");
|
||||
if(NULL == hd_src) {
|
||||
error = errno;
|
||||
fprintf(stderr, "fopen failed with error: %d %s\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "Error opening file: %s\n", libtest_arg2);
|
||||
return -2; /* if this happens things are major weird */
|
||||
}
|
||||
@ -58,9 +56,8 @@ int test(char *URL)
|
||||
hd = fstat(fileno(hd_src), &file_info);
|
||||
if(hd == -1) {
|
||||
/* can't open file, bail out */
|
||||
error = errno;
|
||||
fprintf(stderr, "fstat() failed with error: %d %s\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2);
|
||||
fclose(hd_src);
|
||||
return TEST_ERR_MAJOR_BAD;
|
||||
|
@ -228,7 +228,6 @@ int test(char *URL)
|
||||
CURL *curl = NULL;
|
||||
FILE *hd_src = NULL;
|
||||
int hd;
|
||||
int error;
|
||||
struct_stat file_info;
|
||||
CURLM *m = NULL;
|
||||
struct ReadWriteSockets sockets = {{NULL, 0, 0}, {NULL, 0, 0}};
|
||||
@ -244,9 +243,8 @@ int test(char *URL)
|
||||
|
||||
hd_src = fopen(libtest_arg2, "rb");
|
||||
if(NULL == hd_src) {
|
||||
error = errno;
|
||||
fprintf(stderr, "fopen() failed with error: %d (%s)\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg2);
|
||||
return TEST_ERR_FOPEN;
|
||||
}
|
||||
@ -255,9 +253,8 @@ int test(char *URL)
|
||||
hd = fstat(fileno(hd_src), &file_info);
|
||||
if(hd == -1) {
|
||||
/* can't open file, bail out */
|
||||
error = errno;
|
||||
fprintf(stderr, "fstat() failed with error: %d (%s)\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "ERROR: cannot open file (%s)\n", libtest_arg2);
|
||||
fclose(hd_src);
|
||||
return TEST_ERR_FSTAT;
|
||||
|
@ -44,15 +44,13 @@ int test(char *URL)
|
||||
int msgs_left;
|
||||
CURLMsg *msg;
|
||||
FILE *upload = NULL;
|
||||
int error;
|
||||
|
||||
start_test_timing();
|
||||
|
||||
upload = fopen(libtest_arg3, "rb");
|
||||
if(!upload) {
|
||||
error = errno;
|
||||
fprintf(stderr, "fopen() failed with error: %d (%s)\n",
|
||||
error, strerror(error));
|
||||
errno, strerror(errno));
|
||||
fprintf(stderr, "Error opening file: (%s)\n", libtest_arg3);
|
||||
return TEST_ERR_FOPEN;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user