*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <ctype.h>
#include <stdio.h>
#include <common/error.h>
#include <common/macros.h>
#include <common/utils.h>
+#include <common/compat/getenv.h>
#include <lttng/lttng-error.h>
#include <libxml/parser.h>
#include <libxml/valid.h>
const char * const config_element_control_uri = "control_uri";
const char * const config_element_data_uri = "data_uri";
const char * const config_element_max_size = "max_size";
+const char * const config_element_pid = "pid";
+const char * const config_element_pids = "pids";
const char * const config_domain_type_kernel = "KERNEL";
const char * const config_domain_type_ust = "UST";
const char * const config_domain_type_jul = "JUL";
const char * const config_domain_type_log4j = "LOG4J";
+const char * const config_domain_type_python = "PYTHON";
const char * const config_buffer_type_per_pid = "PER_PID";
const char * const config_buffer_type_per_uid = "PER_UID";
}
LTTNG_HIDDEN
-struct config_writer *config_writer_create(int fd_output)
+struct config_writer *config_writer_create(int fd_output, int indent)
{
int ret;
struct config_writer *writer;
ret = xmlTextWriterSetIndentString(writer->writer,
BAD_CAST config_xml_indent_string);
- if (ret) {
+ if (ret) {
goto error_destroy;
}
- ret = xmlTextWriterSetIndent(writer->writer, 1);
- if (ret) {
+ ret = xmlTextWriterSetIndent(writer->writer, indent);
+ if (ret) {
goto error_destroy;
}
char *get_session_config_xsd_path()
{
char *xsd_path;
- const char *base_path = getenv(DEFAULT_SESSION_CONFIG_XSD_PATH_ENV);
+ const char *base_path = lttng_secure_getenv(DEFAULT_SESSION_CONFIG_XSD_PATH_ENV);
size_t base_path_len;
size_t max_path_len;
ret = LTTNG_DOMAIN_JUL;
} else if (!strcmp((char *) domain, config_domain_type_log4j)) {
ret = LTTNG_DOMAIN_LOG4J;
+ } else if (!strcmp((char *) domain, config_domain_type_python)) {
+ ret = LTTNG_DOMAIN_PYTHON;
} else {
goto error;
}
int i;
struct lttng_domain *domain;
struct lttng_domain *domains[] =
- { kernel_domain, ust_domain, jul_domain, log4j_domain};
+ { kernel_domain, ust_domain, jul_domain, log4j_domain };
/* network destination */
if (live_timer_interval && live_timer_interval != UINT64_MAX) {
ret = lttng_enable_event_with_exclusions(handle, &event, channel_name,
filter_expression, exclusion_count, exclusions);
+ if (ret) {
+ goto end;
+ }
+
+ if (!event.enabled) {
+ /*
+ * Note that we should use lttng_disable_event_ext() (2.6+) to
+ * eliminate the risk of clashing on events of the same
+ * name (with different event types and loglevels).
+ *
+ * Unfortunately, lttng_disable_event_ext() only performs a
+ * match on the name and event type and errors out if any other
+ * event attribute is not set to its default value.
+ *
+ * This will disable all events that match this name.
+ */
+ ret = lttng_disable_event(handle, event.name, channel_name);
+ }
end:
for (i = 0; i < exclusion_count; i++) {
free(exclusions[i]);
xmlNodePtr perf_attr_node;
/* perf */
- context.ctx = LTTNG_EVENT_CONTEXT_PERF_COUNTER;
+ context.ctx = handle->domain.type == LTTNG_DOMAIN_KERNEL ?
+ LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER :
+ LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER;
for (perf_attr_node = xmlFirstElementChild(context_child_node);
perf_attr_node; perf_attr_node =
xmlNextElementSibling(perf_attr_node)) {
struct lttng_domain *ust_domain = NULL;
struct lttng_domain *jul_domain = NULL;
struct lttng_domain *log4j_domain = NULL;
+ struct lttng_domain *python_domain = NULL;
for (node = xmlFirstElementChild(session_node); node;
node = xmlNextElementSibling(node)) {
}
log4j_domain = domain;
break;
+ case LTTNG_DOMAIN_PYTHON:
+ if (python_domain) {
+ /* Same domain seen twice, invalid! */
+ goto domain_init_error;
+ }
+ python_domain = domain;
+ break;
default:
WARN("Invalid domain type");
goto domain_init_error;
free(ust_domain);
free(jul_domain);
free(log4j_domain);
+ free(python_domain);
free(name);
return ret;
}