Rename filter string to filter expression in liblttng-ctl
[lttng-tools.git] / src / lib / lttng-ctl / lttng-ctl.c
index b47231e00e060ddc58a337f63d96bd5f23ea3e5b..fe0527d425b0e32e86b75d6b415a0e2aebf5e65b 100644 (file)
@@ -1694,10 +1694,15 @@ int lttng_list_channels(struct lttng_handle *handle,
                struct lttng_channel **channels)
 {
        int ret;
+       size_t channel_count, i;
+       const size_t channel_size = sizeof(struct lttng_channel) +
+                       sizeof(struct lttcomm_channel_extended);
        struct lttcomm_session_msg lsm;
+       void *extended_at;
 
        if (handle == NULL) {
-               return -LTTNG_ERR_INVALID;
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
        }
 
        memset(&lsm, 0, sizeof(lsm));
@@ -1709,10 +1714,30 @@ int lttng_list_channels(struct lttng_handle *handle,
 
        ret = lttng_ctl_ask_sessiond(&lsm, (void**) channels);
        if (ret < 0) {
-               return ret;
+               goto end;
+       }
+
+       if (ret % channel_size) {
+               ret = -LTTNG_ERR_UNK;
+               free(*channels);
+               *channels = NULL;
+               goto end;
        }
+       channel_count = (size_t) ret / channel_size;
 
-       return ret / sizeof(struct lttng_channel);
+       /* Set extended info pointers */
+       extended_at = ((void *) *channels) +
+                       channel_count * sizeof(struct lttng_channel);
+       for (i = 0; i < channel_count; i++) {
+               struct lttng_channel *chan = &(*channels)[i];
+
+               chan->attr.extended.ptr = extended_at;
+               extended_at += sizeof(struct lttcomm_channel_extended);
+       }
+
+       ret = (int) channel_count;
+end:
+       return ret;
 }
 
 /*
@@ -1726,6 +1751,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 +1767,140 @@ 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;
+               extended_at +=
+                       ext_header->nb_exclusions * LTTNG_SYMBOL_NAME_LEN;
+       }
+
+       return ret;
+error:
+       free(cmd_header);
+       free(*events);
+       return ret;
+}
+
+int lttng_event_get_filter_expression(struct lttng_event *event,
+       const char **filter_expression)
+{
+       int ret = 0;
+       struct lttcomm_event_extended_header *ext_header;
+
+       if (!event || !filter_expression) {
+               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_expression = NULL;
+               goto end;
+       }
+
+       if (ext_header->filter_len) {
+               *filter_expression = ((const char *) (ext_header)) +
+                               sizeof(*ext_header);
+       } else {
+               *filter_expression = NULL;
+       }
+
+end:
+       return ret;
+}
+
+int lttng_event_get_exclusion_name_count(struct lttng_event *event)
+{
+       int ret;
+       struct lttcomm_event_extended_header *ext_header;
+
+       if (!event) {
+               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.
+                */
+               ret = 0;
+               goto end;
+       }
+
+       if (ext_header->nb_exclusions > INT_MAX) {
+               ret = -LTTNG_ERR_OVERFLOW;
+               goto end;
+       }
+       ret = (int) ext_header->nb_exclusions;
+end:
+       return ret;
+}
+
+int lttng_event_get_exclusion_name(struct lttng_event *event,
+               size_t index, const char **exclusion_name)
+{
+       int ret = 0;
+       struct lttcomm_event_extended_header *ext_header;
+       void *at;
+
+       if (!event || !exclusion_name) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       ext_header = event->extended.ptr;
+       if (!ext_header) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       if (index >= ext_header->nb_exclusions) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       at = (void *) ext_header + sizeof(*ext_header);
+       at += ext_header->filter_len;
+       at += index * LTTNG_SYMBOL_NAME_LEN;
+       *exclusion_name = at;
+
+end:
+       return ret;
 }
 
 /*
@@ -1845,6 +1999,58 @@ void lttng_channel_set_default_attr(struct lttng_domain *domain,
        }
 }
 
+int lttng_channel_get_discarded_event_count(struct lttng_channel *channel,
+               uint64_t *discarded_events)
+{
+       int ret = 0;
+       struct lttcomm_channel_extended *chan_ext;
+
+       if (!channel || !discarded_events) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       chan_ext = channel->attr.extended.ptr;
+       if (!chan_ext) {
+               /*
+                * This can happen since the lttng_channel structure is
+                * used for other tasks where this pointer is never set.
+                */
+               *discarded_events = 0;
+               goto end;
+       }
+
+       *discarded_events = chan_ext->discarded_events;
+end:
+       return ret;
+}
+
+int lttng_channel_get_lost_packet_count(struct lttng_channel *channel,
+               uint64_t *lost_packets)
+{
+       int ret = 0;
+       struct lttcomm_channel_extended *chan_ext;
+
+       if (!channel || !lost_packets) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       chan_ext = channel->attr.extended.ptr;
+       if (!chan_ext) {
+               /*
+                * This can happen since the lttng_channel structure is
+                * used for other tasks where this pointer is never set.
+                */
+               *lost_packets = 0;
+               goto end;
+       }
+
+       *lost_packets = chan_ext->lost_packets;
+end:
+       return ret;
+}
+
 /*
  * Check if session daemon is alive.
  *
This page took 0.026706 seconds and 5 git commands to generate.