X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Flttng-ctl.c;h=146783fd3e5e09289ebb0d14d0606fd50a1c0aeb;hb=d31d3e8cf774b98a8ed46b8c7f6273364360f246;hp=b47231e00e060ddc58a337f63d96bd5f23ea3e5b;hpb=795a978d0fddb43019e4031932cf98840c54f504;p=lttng-tools.git diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index b47231e00..146783fd3 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -1726,6 +1726,10 @@ int lttng_list_events(struct lttng_handle *handle, { int ret; struct lttcomm_session_msg lsm; + struct lttcomm_event_command_header *cmd_header = NULL; + size_t cmd_header_len; + uint32_t nb_events, i; + void *extended_at; /* Safety check. An handle and channel name are mandatory */ if (handle == NULL || channel_name == NULL) { @@ -1738,15 +1742,77 @@ int lttng_list_events(struct lttng_handle *handle, sizeof(lsm.session.name)); lttng_ctl_copy_string(lsm.u.list.channel_name, channel_name, sizeof(lsm.u.list.channel_name)); - lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain); - ret = lttng_ctl_ask_sessiond(&lsm, (void**) events); + ret = lttng_ctl_ask_sessiond_varlen(&lsm, NULL, 0, (void **) events, + (void **) &cmd_header, &cmd_header_len); if (ret < 0) { - return ret; + goto error; } - return ret / sizeof(struct lttng_event); + /* Set number of events and free command header */ + nb_events = cmd_header->nb_events; + if (nb_events > INT_MAX) { + ret = -EOVERFLOW; + goto error; + } + ret = (int) nb_events; + free(cmd_header); + cmd_header = NULL; + + /* Set extended info pointers */ + extended_at = ((void*) (*events)) + + nb_events * sizeof(struct lttng_event); + + for (i = 0; i < nb_events; i++) { + struct lttcomm_event_extended_header *ext_header; + struct lttng_event *event = &(*events)[i]; + + event->extended.ptr = extended_at; + ext_header = + (struct lttcomm_event_extended_header *) extended_at; + extended_at += sizeof(*ext_header); + extended_at += ext_header->filter_len; + } + + return ret; +error: + free(cmd_header); + free(*events); + return ret; +} + +int lttng_event_get_filter_string(struct lttng_event *event, + const char **filter_string) +{ + int ret = 0; + struct lttcomm_event_extended_header *ext_header; + + if (!event || !filter_string) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + ext_header = event->extended.ptr; + + if (!ext_header) { + /* + * This can happen since the lttng_event structure is + * used for other tasks where this pointer is never set. + */ + *filter_string = NULL; + goto end; + } + + if (ext_header->filter_len) { + *filter_string = ((const char *) (ext_header)) + + sizeof(*ext_header); + } else { + *filter_string = NULL; + } + +end: + return ret; } /*