Skip to content

Commit db91dbb

Browse files
icingbagder
authored andcommitted
curl_log: for failf/infof and debug logging implementations
- new functions and macros for cfilter debugging - set CURL_DEBUG with names of cfilters where debug logging should be enabled - use GNUC __attribute__ to enable printf format checks during compile Closes curl#10271
1 parent 5cf5bfc commit db91dbb

29 files changed

+656
-466
lines changed

lib/Makefile.inc

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ LIB_CFILES = \
120120
curl_get_line.c \
121121
curl_gethostname.c \
122122
curl_gssapi.c \
123+
curl_log.c \
123124
curl_memrchr.c \
124125
curl_multibyte.c \
125126
curl_ntlm_core.c \
@@ -249,6 +250,7 @@ LIB_HFILES = \
249250
curl_hmac.h \
250251
curl_krb5.h \
251252
curl_ldap.h \
253+
curl_log.h \
252254
curl_md4.h \
253255
curl_md5.h \
254256
curl_memory.h \

lib/cf-socket.c

+30-37
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,6 @@
7979
#include "memdebug.h"
8080

8181

82-
#define DEBUG_CF 1
83-
84-
#if DEBUG_CF
85-
#define CF_DEBUGF(x) x
86-
#else
87-
#define CF_DEBUGF(x) do { } while(0)
88-
#endif
89-
9082
static void tcpnodelay(struct Curl_easy *data, curl_socket_t sockfd)
9183
{
9284
#if defined(TCP_NODELAY)
@@ -305,15 +297,13 @@ static int socket_close(struct Curl_easy *data, struct connectdata *conn,
305297
{
306298
if(use_callback && conn && conn->fclosesocket) {
307299
int rc;
308-
CF_DEBUGF(infof(data, "socket_close(%d) via callback", (int)sock));
309300
Curl_multi_closed(data, sock);
310301
Curl_set_in_callback(data, true);
311302
rc = conn->fclosesocket(conn->closesocket_client, sock);
312303
Curl_set_in_callback(data, false);
313304
return rc;
314305
}
315306

316-
CF_DEBUGF(infof(data, "socket_close(%d)", (int)sock));
317307
if(conn)
318308
/* tell the multi-socket code about this */
319309
Curl_multi_closed(data, sock);
@@ -777,22 +767,20 @@ static void cf_socket_close(struct Curl_cfilter *cf, struct Curl_easy *data)
777767
* closed it) and we just forget about it.
778768
*/
779769
if(ctx->sock == cf->conn->sock[cf->sockindex]) {
780-
CF_DEBUGF(infof(data, CFMSG(cf, "cf_socket_close(%d) active"),
781-
(int)ctx->sock));
770+
DEBUGF(LOG_CF(data, cf, "cf_socket_close(%d) active", (int)ctx->sock));
782771
socket_close(data, cf->conn, !ctx->accepted, ctx->sock);
783772
cf->conn->sock[cf->sockindex] = CURL_SOCKET_BAD;
784773
}
785774
else {
786-
CF_DEBUGF(infof(data, CFMSG(cf, "cf_socket_close(%d) no longer at "
787-
"conn->sock[%d], discarding"), (int)ctx->sock));
775+
DEBUGF(LOG_CF(data, cf, "cf_socket_close(%d) no longer at "
776+
"conn->sock[], discarding", (int)ctx->sock));
788777
}
789778
if(cf->sockindex == FIRSTSOCKET)
790779
cf->conn->remote_addr = NULL;
791780
}
792781
else {
793782
/* this is our local socket, we did never publish it */
794-
CF_DEBUGF(infof(data, CFMSG(cf, "cf_socket_close(%d) local"),
795-
(int)ctx->sock));
783+
DEBUGF(LOG_CF(data, cf, "cf_socket_close(%d) local", (int)ctx->sock));
796784
sclose(ctx->sock);
797785
}
798786
ctx->sock = CURL_SOCKET_BAD;
@@ -807,6 +795,7 @@ static void cf_socket_destroy(struct Curl_cfilter *cf, struct Curl_easy *data)
807795
struct cf_socket_ctx *ctx = cf->ctx;
808796

809797
cf_socket_close(cf, data);
798+
DEBUGF(LOG_CF(data, cf, "destroy"));
810799
free(ctx);
811800
cf->ctx = NULL;
812801
}
@@ -1018,7 +1007,7 @@ static CURLcode cf_tcp_connect(struct Curl_cfilter *cf,
10181007
CURLcode result = CURLE_COULDNT_CONNECT;
10191008
int rc = 0;
10201009

1021-
CF_DEBUGF(infof(data, CFMSG(cf, "connect")));
1010+
DEBUGF(LOG_CF(data, cf, "connect"));
10221011
(void)data;
10231012
if(cf->connected) {
10241013
*done = TRUE;
@@ -1036,7 +1025,7 @@ static CURLcode cf_tcp_connect(struct Curl_cfilter *cf,
10361025
if(result)
10371026
goto out;
10381027

1039-
CF_DEBUGF(infof(data, CFMSG(cf, "connect opened(%d)"), (int)ctx->sock));
1028+
DEBUGF(LOG_CF(data, cf, "connect opened(%d)", (int)ctx->sock));
10401029
/* Connect TCP socket */
10411030
rc = do_connect(cf, data);
10421031
if(-1 == rc) {
@@ -1141,8 +1130,8 @@ static ssize_t cf_socket_send(struct Curl_cfilter *cf, struct Curl_easy *data,
11411130

11421131
DEBUGASSERT(data->conn == cf->conn);
11431132
nwritten = Curl_send_plain(data, cf->sockindex, buf, len, err);
1144-
CF_DEBUGF(infof(data, CFMSG(cf, "send(len=%zu) -> %d, err=%d"),
1145-
len, (int)nwritten, *err));
1133+
DEBUGF(LOG_CF(data, cf, "send(len=%zu) -> %d, err=%d",
1134+
len, (int)nwritten, *err));
11461135
return nwritten;
11471136
}
11481137

@@ -1153,8 +1142,8 @@ static ssize_t cf_socket_recv(struct Curl_cfilter *cf, struct Curl_easy *data,
11531142

11541143
DEBUGASSERT(data->conn == cf->conn);
11551144
nread = Curl_recv_plain(data, cf->sockindex, buf, len, err);
1156-
CF_DEBUGF(infof(data, CFMSG(cf, "recv(len=%zu) -> %d, err=%d"),
1157-
len, (int)nread, *err));
1145+
DEBUGF(LOG_CF(data, cf, "recv(len=%zu) -> %d, err=%d", len, (int)nread,
1146+
*err));
11581147
return nread;
11591148
}
11601149

@@ -1263,9 +1252,10 @@ static bool cf_socket_conn_is_alive(struct Curl_cfilter *cf,
12631252
return TRUE;
12641253
}
12651254

1266-
static const struct Curl_cftype cft_tcp = {
1255+
struct Curl_cftype Curl_cft_tcp = {
12671256
"TCP",
12681257
CF_TYPE_IP_CONNECT,
1258+
CURL_LOG_DEFAULT,
12691259
cf_socket_destroy,
12701260
cf_tcp_connect,
12711261
cf_socket_close,
@@ -1300,7 +1290,7 @@ CURLcode Curl_cf_tcp_create(struct Curl_cfilter **pcf,
13001290
Curl_sock_assign_addr(&ctx->addr, ai, ctx->transport);
13011291
ctx->sock = CURL_SOCKET_BAD;
13021292

1303-
result = Curl_cf_create(&cf, &cft_tcp, ctx);
1293+
result = Curl_cf_create(&cf, &Curl_cft_tcp, ctx);
13041294

13051295
out:
13061296
*pcf = (!result)? cf : NULL;
@@ -1342,9 +1332,10 @@ static CURLcode cf_udp_connect(struct Curl_cfilter *cf,
13421332
return result;
13431333
}
13441334

1345-
static const struct Curl_cftype cft_udp = {
1335+
struct Curl_cftype Curl_cft_udp = {
13461336
"UDP",
13471337
CF_TYPE_IP_CONNECT,
1338+
CURL_LOG_DEFAULT,
13481339
cf_socket_destroy,
13491340
cf_udp_connect,
13501341
cf_socket_close,
@@ -1379,7 +1370,7 @@ CURLcode Curl_cf_udp_create(struct Curl_cfilter **pcf,
13791370
Curl_sock_assign_addr(&ctx->addr, ai, ctx->transport);
13801371
ctx->sock = CURL_SOCKET_BAD;
13811372

1382-
result = Curl_cf_create(&cf, &cft_udp, ctx);
1373+
result = Curl_cf_create(&cf, &Curl_cft_udp, ctx);
13831374

13841375
out:
13851376
*pcf = (!result)? cf : NULL;
@@ -1392,9 +1383,10 @@ CURLcode Curl_cf_udp_create(struct Curl_cfilter **pcf,
13921383
}
13931384

13941385
/* this is the TCP filter which can also handle this case */
1395-
static const struct Curl_cftype cft_unix = {
1386+
struct Curl_cftype Curl_cft_unix = {
13961387
"UNIX",
13971388
CF_TYPE_IP_CONNECT,
1389+
CURL_LOG_DEFAULT,
13981390
cf_socket_destroy,
13991391
cf_tcp_connect,
14001392
cf_socket_close,
@@ -1429,7 +1421,7 @@ CURLcode Curl_cf_unix_create(struct Curl_cfilter **pcf,
14291421
Curl_sock_assign_addr(&ctx->addr, ai, ctx->transport);
14301422
ctx->sock = CURL_SOCKET_BAD;
14311423

1432-
result = Curl_cf_create(&cf, &cft_unix, ctx);
1424+
result = Curl_cf_create(&cf, &Curl_cft_unix, ctx);
14331425

14341426
out:
14351427
*pcf = (!result)? cf : NULL;
@@ -1455,9 +1447,10 @@ static CURLcode cf_tcp_accept_connect(struct Curl_cfilter *cf,
14551447
return CURLE_FAILED_INIT;
14561448
}
14571449

1458-
static const struct Curl_cftype cft_tcp_accept = {
1450+
struct Curl_cftype Curl_cft_tcp_accept = {
14591451
"TCP-ACCEPT",
14601452
CF_TYPE_IP_CONNECT,
1453+
CURL_LOG_DEFAULT,
14611454
cf_socket_destroy,
14621455
cf_tcp_accept_connect,
14631456
cf_socket_close,
@@ -1492,7 +1485,7 @@ CURLcode Curl_conn_tcp_listen_set(struct Curl_easy *data,
14921485
ctx->transport = conn->transport;
14931486
ctx->sock = *s;
14941487
ctx->accepted = FALSE;
1495-
result = Curl_cf_create(&cf, &cft_tcp_accept, ctx);
1488+
result = Curl_cf_create(&cf, &Curl_cft_tcp_accept, ctx);
14961489
if(result)
14971490
goto out;
14981491
Curl_conn_cf_add(data, conn, sockindex, cf);
@@ -1502,8 +1495,7 @@ CURLcode Curl_conn_tcp_listen_set(struct Curl_easy *data,
15021495
set_local_ip(cf, data);
15031496
ctx->active = TRUE;
15041497
cf->connected = TRUE;
1505-
CF_DEBUGF(infof(data, CFMSG(cf, "Curl_conn_tcp_listen_set(%d)"),
1506-
(int)ctx->sock));
1498+
DEBUGF(LOG_CF(data, cf, "Curl_conn_tcp_listen_set(%d)", (int)ctx->sock));
15071499

15081500
out:
15091501
if(result) {
@@ -1521,7 +1513,7 @@ CURLcode Curl_conn_tcp_accepted_set(struct Curl_easy *data,
15211513
struct cf_socket_ctx *ctx = NULL;
15221514

15231515
cf = conn->cfilter[sockindex];
1524-
if(!cf || cf->cft != &cft_tcp_accept)
1516+
if(!cf || cf->cft != &Curl_cft_tcp_accept)
15251517
return CURLE_FAILED_INIT;
15261518

15271519
ctx = cf->ctx;
@@ -1534,16 +1526,17 @@ CURLcode Curl_conn_tcp_accepted_set(struct Curl_easy *data,
15341526
ctx->active = TRUE;
15351527
ctx->accepted = TRUE;
15361528
cf->connected = TRUE;
1537-
CF_DEBUGF(infof(data, CFMSG(cf, "Curl_conn_tcp_accepted_set(%d)"),
1538-
(int)ctx->sock));
1529+
DEBUGF(LOG_CF(data, cf, "Curl_conn_tcp_accepted_set(%d)", (int)ctx->sock));
15391530

15401531
return CURLE_OK;
15411532
}
15421533

15431534
bool Curl_cf_is_socket(struct Curl_cfilter *cf)
15441535
{
1545-
return cf && (cf->cft == &cft_tcp || cf->cft == &cft_udp ||
1546-
cf->cft == &cft_unix || cf->cft == &cft_tcp_accept);
1536+
return cf && (cf->cft == &Curl_cft_tcp ||
1537+
cf->cft == &Curl_cft_udp ||
1538+
cf->cft == &Curl_cft_unix ||
1539+
cf->cft == &Curl_cft_tcp_accept);
15471540
}
15481541

15491542
CURLcode Curl_cf_socket_peek(struct Curl_cfilter *cf,

lib/cf-socket.h

+5
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,9 @@ CURLcode Curl_cf_socket_peek(struct Curl_cfilter *cf,
178178
const char **premote_ip_str,
179179
int *premote_port);
180180

181+
extern struct Curl_cftype Curl_cft_tcp;
182+
extern struct Curl_cftype Curl_cft_udp;
183+
extern struct Curl_cftype Curl_cft_unix;
184+
extern struct Curl_cftype Curl_cft_tcp_accept;
185+
181186
#endif /* HEADER_CURL_CF_SOCKET_H */

lib/cfilters.c

+3-30
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,6 @@
4444
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
4545
#endif
4646

47-
#define DEBUG_CF 0
48-
49-
#if DEBUG_CF
50-
#define CF_DEBUGF(x) x
51-
#else
52-
#define CF_DEBUGF(x) do { } while(0)
53-
#endif
5447

5548
void Curl_cf_def_destroy_this(struct Curl_cfilter *cf, struct Curl_easy *data)
5649
{
@@ -197,7 +190,6 @@ ssize_t Curl_conn_recv(struct Curl_easy *data, int num, char *buf,
197190
size_t len, CURLcode *code)
198191
{
199192
struct Curl_cfilter *cf;
200-
ssize_t nread;
201193

202194
DEBUGASSERT(data);
203195
DEBUGASSERT(data->conn);
@@ -206,10 +198,7 @@ ssize_t Curl_conn_recv(struct Curl_easy *data, int num, char *buf,
206198
cf = cf->next;
207199
}
208200
if(cf) {
209-
nread = cf->cft->do_recv(cf, data, buf, len, code);
210-
CF_DEBUGF(infof(data, "Curl_conn_recv(handle=%p, index=%d)"
211-
"-> %ld, err=%d", data, num, nread, *code));
212-
return nread;
201+
return cf->cft->do_recv(cf, data, buf, len, code);
213202
}
214203
failf(data, CMSGI(data->conn, num, "recv: no filter connected"));
215204
*code = CURLE_FAILED_INIT;
@@ -220,7 +209,6 @@ ssize_t Curl_conn_send(struct Curl_easy *data, int num,
220209
const void *mem, size_t len, CURLcode *code)
221210
{
222211
struct Curl_cfilter *cf;
223-
ssize_t nwritten;
224212

225213
DEBUGASSERT(data);
226214
DEBUGASSERT(data->conn);
@@ -229,10 +217,7 @@ ssize_t Curl_conn_send(struct Curl_easy *data, int num,
229217
cf = cf->next;
230218
}
231219
if(cf) {
232-
nwritten = cf->cft->do_send(cf, data, mem, len, code);
233-
CF_DEBUGF(infof(data, "Curl_conn_send(handle=%p, index=%d, len=%ld)"
234-
" -> %ld, err=%d", data, num, len, nwritten, *code));
235-
return nwritten;
220+
return cf->cft->do_send(cf, data, mem, len, code);
236221
}
237222
failf(data, CMSGI(data->conn, num, "send: no filter connected"));
238223
DEBUGASSERT(0);
@@ -274,7 +259,7 @@ void Curl_conn_cf_add(struct Curl_easy *data,
274259
cf->conn = conn;
275260
cf->sockindex = index;
276261
conn->cfilter[index] = cf;
277-
CF_DEBUGF(infof(data, CFMSG(cf, "added")));
262+
DEBUGF(LOG_CF(data, cf, "added"));
278263
}
279264

280265
void Curl_conn_cf_insert_after(struct Curl_cfilter *cf_at,
@@ -381,18 +366,6 @@ CURLcode Curl_conn_connect(struct Curl_easy *data,
381366
}
382367
}
383368

384-
#ifdef DEBUGBUILD
385-
if(result) {
386-
CF_DEBUGF(infof(data, DMSGI(data, sockindex, "connect()-> %d, done=%d"),
387-
result, *done));
388-
}
389-
else if(!*done) {
390-
while(cf->next && !cf->next->connected)
391-
cf = cf->next;
392-
CF_DEBUGF(infof(data, DMSGI(data, sockindex, "connect()-> waiting for %s"),
393-
cf->cft->name));
394-
}
395-
#endif
396369
return result;
397370
}
398371

lib/cfilters.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ typedef CURLcode Curl_cft_query(struct Curl_cfilter *cf,
153153
/* A connection filter type, e.g. specific implementation. */
154154
struct Curl_cftype {
155155
const char *name; /* name of the filter type */
156-
long flags; /* flags of filter type */
156+
int flags; /* flags of filter type */
157+
int log_level; /* log level for such filters */
157158
Curl_cft_destroy_this *destroy; /* destroy resources of this cf */
158159
Curl_cft_connect *connect; /* establish connection */
159160
Curl_cft_close *close; /* close conn */

0 commit comments

Comments
 (0)