/* This file is part of Eclat.
Copyright (C) 2012-2018 Sergey Poznyakoff.
Eclat is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
Eclat is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Eclat. If not, see . */
#include "libeclat.h"
#include
#include
static void
dump(const char *text, FILE *stream, unsigned char *ptr, size_t size, int hex)
{
size_t i;
size_t c;
unsigned int width = 0x10;
if (!hex)
/* without the hex output, we can fit more on screen */
width = 0x40;
fprintf(stream, "%s, %zd bytes (0x%zx)\n", text, size, size);
for (i = 0; i < size; i += width) {
fprintf(stream, "%04zx: ", i);
if (hex) {
for (c = 0; c < width; c++)
if (i+c < size)
fprintf(stream, "%02x ", ptr[i+c]);
else
fputs(" ", stream);
}
for (c = 0; (c < width) && (i+c < size); c++) {
/* check for CRLf; if found, skip past and start a
new line of output */
if (!hex && (i + c + 1 < size) &&
ptr[i+c] == '\r' && ptr[i+c+1] == '\n') {
i += (c + 2 -width);
break;
}
fprintf(stream, "%c",
isprint(ptr[i+c]) ? ptr[i+c] : '.');
/* check again for CRLF, to avoid an extra \n if
it's at width */
if (!hex && (i + c + 2 < size) &&
ptr[i+c+1] == '\r' && ptr[i+c+2] == '\n') {
i += (c + 3 - width);
break;
}
}
fputc('\n', stream);
}
fflush(stream);
}
int
eclat_trace_fun(CURL *handle, curl_infotype type,
char *data, size_t size,
void *userp)
{
int hex;
const char *text;
hex = !!userp;
switch (type) {
case CURLINFO_TEXT:
fprintf(stderr, "== Info: %s", data);
default: /* in case a new one is introduced to shock us */
return 0;
case CURLINFO_HEADER_OUT:
text = "=> Send header";
break;
case CURLINFO_DATA_OUT:
text = "=> Send data";
break;
case CURLINFO_SSL_DATA_OUT:
text = "=> Send SSL data";
break;
case CURLINFO_HEADER_IN:
text = "<= Recv header";
break;
case CURLINFO_DATA_IN:
text = "<= Recv data";
break;
case CURLINFO_SSL_DATA_IN:
text = "<= Recv SSL data";
break;
}
dump(text, stderr, (unsigned char *)data, size, hex);
return 0;
}
void
eclat_set_curl_trace(CURL *curl, int lev)
{
if (lev == 0)
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
else {
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
if (lev > 1) {
curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION,
eclat_trace_fun);
if (lev > 2)
curl_easy_setopt(curl, CURLOPT_DEBUGDATA, 1L);
}
}
}