sk_tracedata_pop_free(trace_data_stack, tracedata_free);
}
+static void setup_trace_category(int category)
+{
+ BIO *channel;
+ tracedata *trace_data;
+
+ if (OSSL_trace_enabled(category))
+ return;
+
+ channel = BIO_push(BIO_new(apps_bf_prefix()),
+ dup_bio_err(FORMAT_TEXT));
+ trace_data = OPENSSL_zalloc(sizeof(*trace_data));
+
+ if (trace_data == NULL
+ || (trace_data->bio = channel) == NULL
+ || OSSL_trace_set_callback(category, internal_trace_cb,
+ trace_data) == 0
+ || sk_tracedata_push(trace_data_stack, trace_data) == 0) {
+
+ fprintf(stderr,
+ "warning: unable to setup trace callback for category '%s'.\n",
+ OSSL_trace_get_category_name(category));
+
+ OSSL_trace_set_callback(category, NULL, NULL);
+ BIO_free_all(channel);
+ }
+}
+
static void setup_trace(const char *str)
{
char *val;
for (valp = val; (item = strtok(valp, ",")) != NULL; valp = NULL) {
int category = OSSL_trace_get_category_num(item);
- if (category >= 0) {
- BIO *channel = BIO_push(BIO_new(apps_bf_prefix()),
- dup_bio_err(FORMAT_TEXT));
- tracedata *trace_data = OPENSSL_zalloc(sizeof(*trace_data));
-
- if (trace_data == NULL
- || (trace_data->bio = channel) == NULL
- || OSSL_trace_set_callback(category, internal_trace_cb,
- trace_data) == 0
- || sk_tracedata_push(trace_data_stack, trace_data) == 0) {
- OSSL_trace_set_callback(category, NULL, NULL);
- BIO_free_all(channel);
- fprintf(stderr,
- "warning: unable to setup trace callback for category '%s'.\n",
- item);
- }
+ if (category == OSSL_TRACE_CATEGORY_ANY) {
+ while (++category < OSSL_TRACE_CATEGORY_NUM)
+ setup_trace_category(category);
+ break;
+ } else if (category > 0) {
+ setup_trace_category(category);
} else {
fprintf(stderr,
- "warning: unknown trace category: '%s'.\n",
- item);
+ "warning: unknown trace category: '%s'.\n", item);
}
}
}
#ifndef OPENSSL_NO_TRACE
if (category >= 0 && category < OSSL_TRACE_CATEGORY_NUM)
return set_trace_data(category, SIMPLE_CHANNEL, &channel, NULL, NULL,
- trace_attach_cb, trace_detach_cb))
+ trace_attach_cb, trace_detach_cb);
#endif
return 0;
}
There is also C<OSSL_TRACE_CATEGORY_ANY>, which works as a fallback
and can be used to get I<all> trace output.
+Note, however, that in this case all trace output will effectively be
+associated with the 'ALL' category, which is undesirable if the
+application intends to include the category name in the trace output.
+In this case it is better to register separate channels for each
+trace category instead.
+
=head1 RETURN VALUES
OSSL_trace_set_channel(), OSSL_trace_set_prefix(),
* BIO which sends all trace output it receives to the registered application
* callback.
*
- * The ANY category is used as a fallback category.
+ * The ANY category can be used as a fallback category to register a single
+ * channel which receives the output from all categories. However, if the
+ * application intends to print the trace channel name in the line prefix,
+ * it is better to register channels for all categories separately.
+ * (This is how the openssl application does it.)
*/
# define OSSL_TRACE_CATEGORY_ANY 0 /* The fallback */
# define OSSL_TRACE_CATEGORY_TRACE 1