File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / tests / libtest / testtrace.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:16 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    1: /***************************************************************************
    2:  *                                  _   _ ____  _
    3:  *  Project                     ___| | | |  _ \| |
    4:  *                             / __| | | | |_) | |
    5:  *                            | (__| |_| |  _ <| |___
    6:  *                             \___|\___/|_| \_\_____|
    7:  *
    8:  * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
    9:  *
   10:  * This software is licensed as described in the file COPYING, which
   11:  * you should have received as part of this distribution. The terms
   12:  * are also available at https://curl.haxx.se/docs/copyright.html.
   13:  *
   14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
   15:  * copies of the Software, and permit persons to whom the Software is
   16:  * furnished to do so, under the terms of the COPYING file.
   17:  *
   18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
   19:  * KIND, either express or implied.
   20:  *
   21:  ***************************************************************************/
   22: 
   23: #include "test.h"
   24: #include "testutil.h"
   25: #include "testtrace.h"
   26: #include "memdebug.h"
   27: 
   28: struct libtest_trace_cfg libtest_debug_config;
   29: 
   30: static time_t epoch_offset; /* for test time tracing */
   31: static int    known_offset; /* for test time tracing */
   32: 
   33: static
   34: void libtest_debug_dump(const char *timebuf, const char *text, FILE *stream,
   35:                         const unsigned char *ptr, size_t size, int nohex)
   36: {
   37:   size_t i;
   38:   size_t c;
   39: 
   40:   unsigned int width = 0x10;
   41: 
   42:   if(nohex)
   43:     /* without the hex output, we can fit more on screen */
   44:     width = 0x40;
   45: 
   46:   fprintf(stream, "%s%s, %zu bytes (0x%zx)\n", timebuf, text,
   47:           size, size);
   48: 
   49:   for(i = 0; i < size; i += width) {
   50: 
   51:     fprintf(stream, "%04zx: ", i);
   52: 
   53:     if(!nohex) {
   54:       /* hex not disabled, show it */
   55:       for(c = 0; c < width; c++)
   56:         if(i + c < size)
   57:           fprintf(stream, "%02x ", ptr[i + c]);
   58:         else
   59:           fputs("   ", stream);
   60:     }
   61: 
   62:     for(c = 0; (c < width) && (i + c < size); c++) {
   63:       /* check for 0D0A; if found, skip past and start a new line of output */
   64:       if(nohex &&
   65:          (i + c + 1 < size) && (ptr[i + c] == 0x0D) &&
   66:          (ptr[i + c + 1] == 0x0A)) {
   67:         i += (c + 2 - width);
   68:         break;
   69:       }
   70:       fprintf(stream, "%c", ((ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80)) ?
   71:               ptr[i + c] : '.');
   72:       /* check again for 0D0A, to avoid an extra \n if it's at width */
   73:       if(nohex &&
   74:          (i + c + 2 < size) && (ptr[i + c + 1] == 0x0D) &&
   75:          (ptr[i + c + 2] == 0x0A)) {
   76:         i += (c + 3 - width);
   77:         break;
   78:       }
   79:     }
   80:     fputc('\n', stream); /* newline */
   81:   }
   82:   fflush(stream);
   83: }
   84: 
   85: int libtest_debug_cb(CURL *handle, curl_infotype type,
   86:                      unsigned char *data, size_t size,
   87:                      void *userp)
   88: {
   89: 
   90:   struct libtest_trace_cfg *trace_cfg = userp;
   91:   const char *text;
   92:   struct timeval tv;
   93:   char timebuf[20];
   94:   char *timestr;
   95:   time_t secs;
   96: 
   97:   (void)handle;
   98: 
   99:   timebuf[0] = '\0';
  100:   timestr = &timebuf[0];
  101: 
  102:   if(trace_cfg->tracetime) {
  103:     struct tm *now;
  104:     tv = tutil_tvnow();
  105:     if(!known_offset) {
  106:       epoch_offset = time(NULL) - tv.tv_sec;
  107:       known_offset = 1;
  108:     }
  109:     secs = epoch_offset + tv.tv_sec;
  110:     now = localtime(&secs);  /* not thread safe but we don't care */
  111:     msnprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld ",
  112:               now->tm_hour, now->tm_min, now->tm_sec, (long)tv.tv_usec);
  113:   }
  114: 
  115:   switch(type) {
  116:   case CURLINFO_TEXT:
  117:     fprintf(stderr, "%s== Info: %s", timestr, (char *)data);
  118:     /* FALLTHROUGH */
  119:   default: /* in case a new one is introduced to shock us */
  120:     return 0;
  121: 
  122:   case CURLINFO_HEADER_OUT:
  123:     text = "=> Send header";
  124:     break;
  125:   case CURLINFO_DATA_OUT:
  126:     text = "=> Send data";
  127:     break;
  128:   case CURLINFO_SSL_DATA_OUT:
  129:     text = "=> Send SSL data";
  130:     break;
  131:   case CURLINFO_HEADER_IN:
  132:     text = "<= Recv header";
  133:     break;
  134:   case CURLINFO_DATA_IN:
  135:     text = "<= Recv data";
  136:     break;
  137:   case CURLINFO_SSL_DATA_IN:
  138:     text = "<= Recv SSL data";
  139:     break;
  140:   }
  141: 
  142:   libtest_debug_dump(timebuf, text, stderr, data, size, trace_cfg->nohex);
  143:   return 0;
  144: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>