}
static void increment_extended_len(const char *filter_expression,
- size_t *extended_len)
+ struct lttng_event_exclusion *exclusion, size_t *extended_len)
{
*extended_len += sizeof(struct lttcomm_event_extended_header);
if (filter_expression) {
*extended_len += strlen(filter_expression) + 1;
}
+
+ if (exclusion) {
+ *extended_len += exclusion->count * LTTNG_SYMBOL_NAME_LEN;
+ }
}
static void append_extended_info(const char *filter_expression,
- void **extended_at)
+ struct lttng_event_exclusion *exclusion, void **extended_at)
{
struct lttcomm_event_extended_header extended_header;
size_t filter_len = 0;
+ size_t nb_exclusions = 0;
if (filter_expression) {
filter_len = strlen(filter_expression) + 1;
}
+ if (exclusion) {
+ nb_exclusions = exclusion->count;
+ }
+
+ /* Set header fields */
extended_header.filter_len = filter_len;
+ extended_header.nb_exclusions = nb_exclusions;
+
+ /* Copy header */
memcpy(*extended_at, &extended_header, sizeof(extended_header));
*extended_at += sizeof(extended_header);
- memcpy(*extended_at, filter_expression, filter_len);
- *extended_at += filter_len;
+
+ /* Copy filter string */
+ if (filter_expression) {
+ memcpy(*extended_at, filter_expression, filter_len);
+ *extended_at += filter_len;
+ }
+
+ /* Copy exclusion names */
+ if (exclusion) {
+ size_t len = nb_exclusions * LTTNG_SYMBOL_NAME_LEN;
+
+ memcpy(*extended_at, &exclusion->names, len);
+ *extended_at += len;
+ }
}
/*
*/
rcu_read_lock();
cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) {
- increment_extended_len(event->filter_expression, &extended_len);
+ increment_extended_len(event->filter_expression, NULL,
+ &extended_len);
}
rcu_read_unlock();
i++;
/* Append extended info */
- append_extended_info(event->filter_expression, &extended_at);
+ append_extended_info(event->filter_expression, NULL,
+ &extended_at);
}
rcu_read_unlock();
node = lttng_ht_iter_get_node_str(&iter);
if (node == NULL) {
ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
- goto error;
+ goto end;
}
uchan = caa_container_of(&node->node, struct ltt_ust_channel, node.node);
if (nb_event == 0) {
ret = nb_event;
*total_size = 0;
- goto error;
+ goto end;
}
DBG3("Listing UST global %d events", nb_event);
}
increment_extended_len(uevent->filter_expression,
- &extended_len);
+ uevent->exclusion, &extended_len);
+ }
+ if (nb_event == 0) {
+ /* All events are internal, skip. */
+ ret = 0;
+ *total_size = 0;
+ goto end;
}
*total_size = nb_event * sizeof(struct lttng_event) + extended_len;
tmp = zmalloc(*total_size);
if (tmp == NULL) {
- ret = LTTNG_ERR_FATAL;
- goto error;
+ ret = -LTTNG_ERR_FATAL;
+ goto end;
}
extended_at = ((uint8_t *) tmp) + nb_event * sizeof(struct lttng_event);
i++;
/* Append extended info */
- append_extended_info(uevent->filter_expression, &extended_at);
+ append_extended_info(uevent->filter_expression,
+ uevent->exclusion, &extended_at);
}
ret = nb_event;
*events = tmp;
-
-error:
+end:
rcu_read_unlock();
return ret;
}
/* Compute required extended infos size */
cds_list_for_each_entry(event, &kchan->events_list.head, list) {
- increment_extended_len(event->filter_expression, &extended_len);
+ increment_extended_len(event->filter_expression, NULL,
+ &extended_len);
}
*total_size = nb_event * sizeof(struct lttng_event) + extended_len;
i++;
/* Append extended info */
- append_extended_info(event->filter_expression, &extended_at);
+ append_extended_info(event->filter_expression, NULL,
+ &extended_at);
}
syscall:
ssize_t cmd_list_channels(enum lttng_domain_type domain,
struct ltt_session *session, struct lttng_channel **channels)
{
- int ret;
- ssize_t nb_chan = 0;
+ ssize_t nb_chan = 0, payload_size = 0, ret;
switch (domain) {
case LTTNG_DOMAIN_KERNEL:
}
DBG3("Number of kernel channels %zd", nb_chan);
if (nb_chan <= 0) {
- ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
+ ret = -LTTNG_ERR_KERN_CHAN_NOT_FOUND;
+ goto end;
}
break;
case LTTNG_DOMAIN_UST:
}
DBG3("Number of UST global channels %zd", nb_chan);
if (nb_chan < 0) {
- ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
- goto error;
+ ret = -LTTNG_ERR_UST_CHAN_NOT_FOUND;
+ goto end;
}
break;
default:
- ret = LTTNG_ERR_UND;
- goto error;
+ ret = -LTTNG_ERR_UND;
+ goto end;
}
if (nb_chan > 0) {
- *channels = zmalloc(nb_chan * sizeof(struct lttng_channel));
+ const size_t channel_size = sizeof(struct lttng_channel) +
+ sizeof(struct lttcomm_channel_extended);
+ struct lttcomm_channel_extended *channel_exts;
+
+ payload_size = nb_chan * channel_size;
+ *channels = zmalloc(payload_size);
if (*channels == NULL) {
- ret = LTTNG_ERR_FATAL;
- goto error;
+ ret = -LTTNG_ERR_FATAL;
+ goto end;
}
- list_lttng_channels(domain, session, *channels);
+ channel_exts = ((void *) *channels) +
+ (nb_chan * sizeof(struct lttng_channel));
+ list_lttng_channels(domain, session, *channels, channel_exts);
+ } else {
+ *channels = NULL;
}
- return nb_chan;
-
-error:
- /* Return negative value to differentiate return code */
- return -ret;
+ ret = payload_size;
+end:
+ return ret;
}
/*