X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=0041969657e18089c8a957c941924363a752daaf;hb=3f451dc03f23277be8198628b817abdc3a19bd91;hp=a398e34d6d7b3c825bb8e4a4e0802412ae96e83f;hpb=18a720cd7bbc2eeea6d075903668e21337b5d916;p=lttng-tools.git diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index a398e34d6..004196965 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -20,6 +20,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -106,6 +107,7 @@ void lttng_ctl_copy_lttng_domain(struct lttng_domain *dst, case LTTNG_DOMAIN_UST: case LTTNG_DOMAIN_JUL: case LTTNG_DOMAIN_LOG4J: + case LTTNG_DOMAIN_PYTHON: memcpy(dst, src, sizeof(struct lttng_domain)); break; default: @@ -224,7 +226,7 @@ int lttng_check_tracing_group(void) } /* Alloc group list of the right size */ - grp_list = malloc(grp_list_size * sizeof(gid_t)); + grp_list = zmalloc(grp_list_size * sizeof(gid_t)); if (!grp_list) { perror("malloc"); goto end; @@ -444,7 +446,11 @@ int lttng_ctl_ask_sessiond_varlen(struct lttcomm_session_msg *lsm, goto end; } - data = (void*) malloc(size); + data = zmalloc(size); + if (!data) { + ret = -ENOMEM; + goto end; + } /* Get payload data */ ret = recv_data_sessiond(data, size); @@ -484,7 +490,7 @@ struct lttng_handle *lttng_create_handle(const char *session_name, goto end; } - handle = malloc(sizeof(struct lttng_handle)); + handle = zmalloc(sizeof(struct lttng_handle)); if (handle == NULL) { PERROR("malloc handle"); goto end; @@ -690,25 +696,25 @@ int lttng_enable_event_with_filter(struct lttng_handle *handle, } /* - * Depending on the event, return a newly allocated JUL filter expression or + * Depending on the event, return a newly allocated agent filter expression or * NULL if not applicable. * * An event with NO loglevel and the name is * will return NULL. */ -static char *set_jul_filter(const char *filter, struct lttng_event *ev) +static char *set_agent_filter(const char *filter, struct lttng_event *ev) { int err; - char *jul_filter = NULL; + char *agent_filter = NULL; assert(ev); /* Don't add filter for the '*' event. */ if (ev->name[0] != '*') { if (filter) { - err = asprintf(&jul_filter, "(%s) && (logger_name == \"%s\")", filter, + err = asprintf(&agent_filter, "(%s) && (logger_name == \"%s\")", filter, ev->name); } else { - err = asprintf(&jul_filter, "logger_name == \"%s\"", ev->name); + err = asprintf(&agent_filter, "logger_name == \"%s\"", ev->name); } if (err < 0) { PERROR("asprintf"); @@ -726,18 +732,18 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev) op = "=="; } - if (filter || jul_filter) { + if (filter || agent_filter) { char *new_filter; err = asprintf(&new_filter, "(%s) && (int_loglevel %s %d)", - jul_filter ? jul_filter : filter, op, + agent_filter ? agent_filter : filter, op, ev->loglevel); - if (jul_filter) { - free(jul_filter); + if (agent_filter) { + free(agent_filter); } - jul_filter = new_filter; + agent_filter = new_filter; } else { - err = asprintf(&jul_filter, "int_loglevel %s %d", op, + err = asprintf(&agent_filter, "int_loglevel %s %d", op, ev->loglevel); } if (err < 0) { @@ -746,9 +752,9 @@ static char *set_jul_filter(const char *filter, struct lttng_event *ev) } } - return jul_filter; + return agent_filter; error: - free(jul_filter); + free(agent_filter); return NULL; } @@ -941,7 +947,8 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, */ if (exclusion_count == 0 && filter_expression == NULL && (handle->domain.type != LTTNG_DOMAIN_JUL && - handle->domain.type != LTTNG_DOMAIN_LOG4J)) { + handle->domain.type != LTTNG_DOMAIN_LOG4J && + handle->domain.type != LTTNG_DOMAIN_PYTHON)) { goto ask_sessiond; } @@ -952,24 +959,26 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, /* Parse filter expression */ if (filter_expression != NULL || handle->domain.type == LTTNG_DOMAIN_JUL - || handle->domain.type == LTTNG_DOMAIN_LOG4J) { + || handle->domain.type == LTTNG_DOMAIN_LOG4J + || handle->domain.type == LTTNG_DOMAIN_PYTHON) { if (handle->domain.type == LTTNG_DOMAIN_JUL || - handle->domain.type == LTTNG_DOMAIN_LOG4J) { - char *jul_filter; + handle->domain.type == LTTNG_DOMAIN_LOG4J || + handle->domain.type == LTTNG_DOMAIN_PYTHON) { + char *agent_filter; /* Setup JUL filter if needed. */ - jul_filter = set_jul_filter(filter_expression, ev); - if (!jul_filter) { + agent_filter = set_agent_filter(filter_expression, ev); + if (!agent_filter) { if (!filter_expression) { /* No JUL and no filter, just skip everything below. */ goto ask_sessiond; } } else { /* - * With a JUL filter, the original filter has been added to it - * thus replace the filter expression. + * With an agent filter, the original filter has been added to + * it thus replace the filter expression. */ - filter_expression = jul_filter; + filter_expression = agent_filter; free_filter_expression = 1; } } @@ -1102,7 +1111,8 @@ int lttng_disable_event_ext(struct lttng_handle *handle, */ if (filter_expression == NULL && (handle->domain.type != LTTNG_DOMAIN_JUL && - handle->domain.type != LTTNG_DOMAIN_LOG4J)) { + handle->domain.type != LTTNG_DOMAIN_LOG4J && + handle->domain.type != LTTNG_DOMAIN_PYTHON)) { goto ask_sessiond; } @@ -1113,14 +1123,16 @@ int lttng_disable_event_ext(struct lttng_handle *handle, /* Parse filter expression */ if (filter_expression != NULL || handle->domain.type == LTTNG_DOMAIN_JUL - || handle->domain.type == LTTNG_DOMAIN_LOG4J) { + || handle->domain.type == LTTNG_DOMAIN_LOG4J + || handle->domain.type == LTTNG_DOMAIN_PYTHON) { if (handle->domain.type == LTTNG_DOMAIN_JUL || - handle->domain.type == LTTNG_DOMAIN_LOG4J) { - char *jul_filter; + handle->domain.type == LTTNG_DOMAIN_LOG4J || + handle->domain.type == LTTNG_DOMAIN_PYTHON) { + char *agent_filter; /* Setup JUL filter if needed. */ - jul_filter = set_jul_filter(filter_expression, ev); - if (!jul_filter) { + agent_filter = set_agent_filter(filter_expression, ev); + if (!agent_filter) { if (!filter_expression) { /* No JUL and no filter, just skip everything below. */ goto ask_sessiond; @@ -1130,7 +1142,7 @@ int lttng_disable_event_ext(struct lttng_handle *handle, * With a JUL filter, the original filter has been added to it * thus replace the filter expression. */ - filter_expression = jul_filter; + filter_expression = agent_filter; free_filter_expression = 1; } } @@ -1323,6 +1335,35 @@ int lttng_list_tracepoint_fields(struct lttng_handle *handle, return ret / sizeof(struct lttng_event_field); } +/* + * Lists all available kernel system calls. Allocates and sets the contents of + * the events array. + * + * Returns the number of lttng_event entries in events; on error, returns a + * negative value. + */ +int lttng_list_syscalls(struct lttng_event **events) +{ + int ret; + struct lttcomm_session_msg lsm; + + if (!events) { + return -LTTNG_ERR_INVALID; + } + + memset(&lsm, 0, sizeof(lsm)); + lsm.cmd_type = LTTNG_LIST_SYSCALLS; + /* Force kernel domain for system calls. */ + lsm.domain.type = LTTNG_DOMAIN_KERNEL; + + ret = lttng_ctl_ask_sessiond(&lsm, (void **) events); + if (ret < 0) { + return ret; + } + + return ret / sizeof(struct lttng_event); +} + /* * Returns a human readable string describing * the error code (a negative value).