{
struct lttng_channel *channel = nullptr;
int ret = CMD_SUCCESS, warn = 0, error = 0, success = 0;
- enum lttng_kernel_tracer_status kernel_tracer_status;
char *channel_name;
struct lttng_domain dom;
ret = lttng_enable_channel(handle, channel);
if (ret < 0) {
+ bool msg_already_printed = false;
+
success = 0;
switch (-ret) {
case LTTNG_ERR_KERN_CHAN_EXIST:
case LTTNG_ERR_UST_CHAN_EXIST:
case LTTNG_ERR_CHAN_EXIST:
- WARN("Channel %s: %s (session %s)",
- channel_name,
- lttng_strerror(ret),
- session_name);
warn = 1;
break;
case LTTNG_ERR_INVALID_CHANNEL_NAME:
"Channel names may not start with '.', and "
"may not contain '/'.",
channel_name);
+ msg_already_printed = true;
error = 1;
break;
default:
- ERR("Channel %s: %s (session %s)",
- channel_name,
- lttng_strerror(ret),
- session_name);
error = 1;
break;
}
- /*
- * Ask the sessiond for the more details on the status of the kernel tracer.
- */
- ret = lttng_get_kernel_tracer_status(&kernel_tracer_status);
- if (ret < 0) {
- ERR("Failed to get kernel tracer status: %s", lttng_strerror(ret));
- } else {
- switch (kernel_tracer_status) {
- case LTTNG_KERNEL_TRACER_STATUS_INITIALIZED:
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_UNKNOWN:
- MSG("\tKernel module loading failed");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_MISSING:
- MSG("\tMissing one or more required kernel modules");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_SIGNATURE:
- MSG("\tKernel module signature error prevented loading of one or more required kernel modules");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_NEED_ROOT:
- MSG("\tlttng-sessiond isn't running as root");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_NOTIFIER:
- MSG("\tFailed to setup notifiers");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_OPEN_PROC_LTTNG:
- MSG("\tlttng-sessiond failed to open proc lttng");
- break;
- case LTTNG_KERNEL_TRACER_STATUS_ERR_VERSION_MISMATCH:
- MSG("\tVersion mismatch between kernel tracer and kernel tracer ABI");
- break;
- default:
- MSG("\tUnknown kernel tracer status (%d)", kernel_tracer_status);
- break;
- }
- MSG("\tConsult lttng-sessiond logs for more information");
+
+ if (!msg_already_printed) {
+ LOG(error ? PRINT_ERR : PRINT_WARN,
+ "Failed to enable channel `%s` under session `%s`: %s",
+ channel_name,
+ session_name,
+ lttng_strerror(ret));
+ }
+
+ if (opt_kernel) {
+ print_kernel_tracer_status_error();
}
} else {
- MSG("%s channel %s enabled for session %s",
+ MSG("%s channel `%s` enabled for session `%s`",
lttng_domain_type_str(dom.type),
channel_name,
session_name);
#include <ctype.h>
#include <fnmatch.h>
#include <inttypes.h>
+#include <iostream>
#include <limits.h>
#include <netinet/in.h>
#include <signal.h>
return lttng::cli::session_list();
}
+
+void print_kernel_tracer_status_error()
+{
+ if (lttng_opt_mi) {
+ return;
+ }
+
+ enum lttng_kernel_tracer_status kernel_tracer_status;
+ const auto ret = lttng_get_kernel_tracer_status(&kernel_tracer_status);
+
+ if (ret < 0) {
+ ERR("Failed to get kernel tracer status: %s", lttng_strerror(ret));
+ } else {
+ switch (kernel_tracer_status) {
+ case LTTNG_KERNEL_TRACER_STATUS_INITIALIZED:
+ return;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_UNKNOWN:
+ std::cerr << "\tKernel module loading failed" << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_MISSING:
+ std::cerr << "\tMissing one or more required kernel modules" << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_MODULES_SIGNATURE:
+ std::cerr
+ << "\tKernel module signature error prevented loading of one or more required kernel modules"
+ << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_NEED_ROOT:
+ std::cerr << "\tlttng-sessiond isn't running as root" << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_NOTIFIER:
+ std::cerr << "\tFailed to setup notifiers" << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_OPEN_PROC_LTTNG:
+ std::cerr << "\tlttng-sessiond failed to open /proc/lttng" << std::endl;
+ break;
+ case LTTNG_KERNEL_TRACER_STATUS_ERR_VERSION_MISMATCH:
+ std::cerr
+ << "\tVersion mismatch between kernel tracer and kernel tracer ABI"
+ << std::endl;
+ break;
+ default:
+ std::cerr << lttng::format("\t\tUnknown kernel tracer status (%d)",
+ static_cast<int>(kernel_tracer_status))
+ << std::endl;
+ break;
+ }
+
+ std::cerr << "\tConsult lttng-sessiond logs for more information" << std::endl;
+ }
+}