• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef HEADER_CURL_TRC_H
2 #define HEADER_CURL_TRC_H
3 /***************************************************************************
4  *                                  _   _ ____  _
5  *  Project                     ___| | | |  _ \| |
6  *                             / __| | | | |_) | |
7  *                            | (__| |_| |  _ <| |___
8  *                             \___|\___/|_| \_\_____|
9  *
10  * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
11  *
12  * This software is licensed as described in the file COPYING, which
13  * you should have received as part of this distribution. The terms
14  * are also available at https://curl.se/docs/copyright.html.
15  *
16  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17  * copies of the Software, and permit persons to whom the Software is
18  * furnished to do so, under the terms of the COPYING file.
19  *
20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21  * KIND, either express or implied.
22  *
23  * SPDX-License-Identifier: curl
24  *
25  ***************************************************************************/
26 
27 struct Curl_easy;
28 struct Curl_cfilter;
29 
30 /**
31  * Init logging, return != 0 on failure.
32  */
33 CURLcode Curl_trc_init(void);
34 
35 /**
36  * Configure tracing. May be called several times during global
37  * initialization. Later calls may not take effect.
38  *
39  * Configuration format supported:
40  * - comma-separated list of component names to enable logging on.
41  *   E.g. 'http/2,ssl'. Unknown names are ignored. Names are compared
42  *   case-insensitive.
43  * - component 'all' applies to all known log components
44  * - prefixing a component with '+' or '-' will en-/disable logging for
45  *   that component
46  * Example: 'all,-ssl' would enable logging for all components but the
47  * SSL filters.
48  *
49  * @param config configuration string
50  */
51 CURLcode Curl_trc_opt(const char *config);
52 
53 /* the function used to output verbose information */
54 void Curl_debug(struct Curl_easy *data, curl_infotype type,
55                 char *ptr, size_t size);
56 
57 /**
58  * Output an informational message when transfer's verbose logging is enabled.
59  */
60 void Curl_infof(struct Curl_easy *data,
61 #if defined(__GNUC__) && !defined(printf) &&                    \
62   defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
63   !defined(__MINGW32__)
64                        const char *fmt, ...)
65                        __attribute__((format(printf, 2, 3)));
66 #else
67                        const char *fmt, ...);
68 #endif
69 
70 /**
71  * Output a failure message on registered callbacks for transfer.
72  */
73 void Curl_failf(struct Curl_easy *data,
74 #if defined(__GNUC__) && !defined(printf) &&                    \
75   defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
76   !defined(__MINGW32__)
77                        const char *fmt, ...)
78                        __attribute__((format(printf, 2, 3)));
79 #else
80                        const char *fmt, ...);
81 #endif
82 
83 #define failf Curl_failf
84 
85 /**
86  * Output an informational message when both transfer's verbose logging
87  * and connection filters verbose logging are enabled.
88  */
89 void Curl_trc_cf_infof(struct Curl_easy *data, struct Curl_cfilter *cf,
90 #if defined(__GNUC__) && !defined(printf) &&                    \
91   defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
92   !defined(__MINGW32__)
93                        const char *fmt, ...)
94                        __attribute__((format(printf, 3, 4)));
95 #else
96                        const char *fmt, ...);
97 #endif
98 
99 #define CURL_LOG_LVL_NONE  0
100 #define CURL_LOG_LVL_INFO  1
101 
102 
103 #if !defined(CURL_DISABLE_VERBOSE_STRINGS)
104 /* informational messages enabled */
105 
106 #define Curl_trc_is_verbose(data)    ((data) && (data)->set.verbose)
107 #define Curl_trc_cf_is_verbose(cf, data) \
108                             ((data) && (data)->set.verbose && \
109                             (cf) && (cf)->cft->log_level >= CURL_LOG_LVL_INFO)
110 
111 /* explainer: we have some mix configuration and werror settings
112  * that define HAVE_VARIADIC_MACROS_C99 even though C89 is enforced
113  * on gnuc and some other compiler. Need to treat carefully.
114  */
115 #if defined(HAVE_VARIADIC_MACROS_C99) && \
116     defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
117 
118 #define infof(data, ...) \
119   do { if(Curl_trc_is_verbose(data)) \
120          Curl_infof(data, __VA_ARGS__); } while(0)
121 #define CURL_TRC_CF(data, cf, ...) \
122   do { if(Curl_trc_cf_is_verbose(cf, data)) \
123          Curl_trc_cf_infof(data, cf, __VA_ARGS__); } while(0)
124 
125 #else /* no variadic macro args */
126 #define infof Curl_infof
127 #define CURL_TRC_CF Curl_trc_cf_infof
128 #endif /* variadic macro args */
129 
130 #else /* !CURL_DISABLE_VERBOSE_STRINGS */
131 /* All informational messages are not compiled in for size savings */
132 
133 #define Curl_trc_is_verbose(d)        ((void)(d), FALSE)
134 #define Curl_trc_cf_is_verbose(x,y)   ((void)(x), (void)(y), FALSE)
135 
136 #if defined(HAVE_VARIADIC_MACROS_C99)
137 #define infof(...)  Curl_nop_stmt
138 #define CURL_TRC_CF(...)  Curl_nop_stmt
139 #define Curl_trc_cf_infof(...)  Curl_nop_stmt
140 #elif defined(HAVE_VARIADIC_MACROS_GCC)
141 #define infof(x...)  Curl_nop_stmt
142 #define CURL_TRC_CF(x...)  Curl_nop_stmt
143 #define Curl_trc_cf_infof(x...)  Curl_nop_stmt
144 #else
145 #error "missing VARIADIC macro define, fix and rebuild!"
146 #endif
147 
148 #endif /* CURL_DISABLE_VERBOSE_STRINGS */
149 
150 #endif /* HEADER_CURL_TRC_H */
151