diff options
author | AlexSm <alex@ydb.tech> | 2024-01-18 11:28:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-18 11:28:56 +0100 |
commit | 9d0a3761b3201e0d9db879a7adf91876ebdb0564 (patch) | |
tree | 541d11ac878c18efd7ebca81e35112aa0fef995b /contrib/libs/curl/src/tool_cb_dbg.c | |
parent | 404ef8886ecc9736bc58ade6da2fbd83b486a408 (diff) | |
download | ydb-9d0a3761b3201e0d9db879a7adf91876ebdb0564.tar.gz |
Library import 8 (#1074)
* Library import 8
* Add contrib/libs/cxxsupp/libcxx/include/__verbose_abort
Diffstat (limited to 'contrib/libs/curl/src/tool_cb_dbg.c')
-rw-r--r-- | contrib/libs/curl/src/tool_cb_dbg.c | 122 |
1 files changed, 87 insertions, 35 deletions
diff --git a/contrib/libs/curl/src/tool_cb_dbg.c b/contrib/libs/curl/src/tool_cb_dbg.c index c1dba85ab8..ce5e25e92c 100644 --- a/contrib/libs/curl/src/tool_cb_dbg.c +++ b/contrib/libs/curl/src/tool_cb_dbg.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al. + * 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 @@ -34,53 +34,110 @@ #include "memdebug.h" /* keep this as LAST include */ -static void dump(const char *timebuf, const char *text, +static void dump(const char *timebuf, const char *idsbuf, const char *text, FILE *stream, const unsigned char *ptr, size_t size, trace tracetype, curl_infotype infotype); /* + * Return the formatted HH:MM:SS for the tv_sec given. + * NOT thread safe. + */ +static const char *hms_for_sec(time_t tv_sec) +{ + static time_t cached_tv_sec; + static char hms_buf[12]; + static time_t epoch_offset; + static int known_epoch; + + if(tv_sec != cached_tv_sec) { + struct tm *now; + time_t secs; + /* recalculate */ + if(!known_epoch) { + epoch_offset = time(NULL) - tv_sec; + known_epoch = 1; + } + secs = epoch_offset + tv_sec; + /* !checksrc! disable BANNEDFUNC 1 */ + now = localtime(&secs); /* not thread safe but we don't care */ + msnprintf(hms_buf, sizeof(hms_buf), "%02d:%02d:%02d", + now->tm_hour, now->tm_min, now->tm_sec); + cached_tv_sec = tv_sec; + } + return hms_buf; +} + +static void log_line_start(FILE *log, const char *timebuf, + const char *idsbuf, curl_infotype type) +{ + /* + * This is the trace look that is similar to what libcurl makes on its + * own. + */ + static const char * const s_infotype[] = { + "* ", "< ", "> ", "{ ", "} ", "{ ", "} " + }; + if((timebuf && *timebuf) || (idsbuf && *idsbuf)) + fprintf(log, "%s%s%s", timebuf, idsbuf, s_infotype[type]); + else + fputs(s_infotype[type], log); +} + +#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] " +#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \ + CURL_FORMAT_CURL_OFF_T "] " +/* ** callback for CURLOPT_DEBUGFUNCTION */ - int tool_debug_cb(CURL *handle, curl_infotype type, char *data, size_t size, void *userdata) { struct OperationConfig *operation = userdata; struct GlobalConfig *config = operation->global; - FILE *output = config->errors; + FILE *output = tool_stderr; const char *text; struct timeval tv; char timebuf[20]; - time_t secs; + /* largest signed 64bit is: 9,223,372,036,854,775,807 + * max length in decimal: 1 + (6*3) = 19 + * formatted via TRC_IDS_FORMAT_IDS_2 this becomes 2 + 19 + 1 + 19 + 2 = 43 + * negative xfer-id are not printed, negative conn-ids use TRC_IDS_FORMAT_1 + */ + char idsbuf[60]; + curl_off_t xfer_id, conn_id; (void)handle; /* not used */ if(config->tracetime) { - struct tm *now; - static time_t epoch_offset; - static int known_offset; tv = tvnow(); - if(!known_offset) { - epoch_offset = time(NULL) - tv.tv_sec; - known_offset = 1; - } - secs = epoch_offset + tv.tv_sec; - /* !checksrc! disable BANNEDFUNC 1 */ - now = localtime(&secs); /* not thread safe but we don't care */ - msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ", - now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec); + msnprintf(timebuf, sizeof(timebuf), "%s.%06ld ", + hms_for_sec(tv.tv_sec), (long)tv.tv_usec); } else timebuf[0] = 0; + if(handle && config->traceids && + !curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) { + if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) && + conn_id >= 0) { + msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, + xfer_id, conn_id); + } + else { + msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id); + } + } + else + idsbuf[0] = 0; + if(!config->trace_stream) { /* open for append */ if(!strcmp("-", config->trace_dump)) config->trace_stream = stdout; else if(!strcmp("%", config->trace_dump)) /* Ok, this is somewhat hackish but we do it undocumented for now */ - config->trace_stream = config->errors; /* aka stderr */ + config->trace_stream = tool_stderr; else { config->trace_stream = fopen(config->trace_dump, FOPEN_WRITETEXT); config->trace_fopened = TRUE; @@ -96,13 +153,6 @@ int tool_debug_cb(CURL *handle, curl_infotype type, } if(config->tracetype == TRACE_PLAIN) { - /* - * This is the trace look that is similar to what libcurl makes on its - * own. - */ - static const char * const s_infotype[] = { - "*", "<", ">", "{", "}", "{", "}" - }; static bool newl = FALSE; static bool traced_data = FALSE; @@ -114,7 +164,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, for(i = 0; i < size - 1; i++) { if(data[i] == '\n') { /* LF */ if(!newl) { - fprintf(output, "%s%s ", timebuf, s_infotype[type]); + log_line_start(output, timebuf, idsbuf, type); } (void)fwrite(data + st, i - st + 1, 1, output); st = i + 1; @@ -122,7 +172,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, } } if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); + log_line_start(output, timebuf, idsbuf, type); (void)fwrite(data + st, i - st + 1, 1, output); } newl = (size && (data[size - 1] != '\n')) ? TRUE : FALSE; @@ -131,7 +181,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, case CURLINFO_TEXT: case CURLINFO_HEADER_IN: if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); + log_line_start(output, timebuf, idsbuf, type); (void)fwrite(data, size, 1, output); newl = (size && (data[size - 1] != '\n')) ? TRUE : FALSE; traced_data = FALSE; @@ -145,9 +195,10 @@ int tool_debug_cb(CURL *handle, curl_infotype type, to stderr or stdout, we don't display the alert about the data not being shown as the data _is_ shown then just not via this function */ - if(!config->isatty || ((output != stderr) && (output != stdout))) { + if(!config->isatty || + ((output != tool_stderr) && (output != stdout))) { if(!newl) - fprintf(output, "%s%s ", timebuf, s_infotype[type]); + log_line_start(output, timebuf, idsbuf, type); fprintf(output, "[%zu bytes data]\n", size); newl = FALSE; traced_data = TRUE; @@ -165,7 +216,7 @@ int tool_debug_cb(CURL *handle, curl_infotype type, switch(type) { case CURLINFO_TEXT: - fprintf(output, "%s== Info: %.*s", timebuf, (int)size, data); + fprintf(output, "%s%s== Info: %.*s", timebuf, idsbuf, (int)size, data); /* FALLTHROUGH */ default: /* in case a new one is introduced to shock us */ return 0; @@ -190,12 +241,12 @@ int tool_debug_cb(CURL *handle, curl_infotype type, break; } - dump(timebuf, text, output, (unsigned char *) data, size, config->tracetype, - type); + dump(timebuf, idsbuf, text, output, (unsigned char *) data, size, + config->tracetype, type); return 0; } -static void dump(const char *timebuf, const char *text, +static void dump(const char *timebuf, const char *idsbuf, const char *text, FILE *stream, const unsigned char *ptr, size_t size, trace tracetype, curl_infotype infotype) { @@ -208,7 +259,8 @@ static void dump(const char *timebuf, const char *text, /* without the hex output, we can fit more on screen */ width = 0x40; - fprintf(stream, "%s%s, %zu bytes (0x%zx)\n", timebuf, text, size, size); + fprintf(stream, "%s%s%s, %zu bytes (0x%zx)\n", timebuf, idsbuf, + text, size, size); for(i = 0; i < size; i += width) { |