+static
+void init_ust_event_from_agent_event(struct ltt_ust_event *ust_event,
+ struct agent_event *agent_event)
+{
+ ust_event->enabled = agent_event->enabled;
+ ust_event->attr.instrumentation = LTTNG_UST_TRACEPOINT;
+ strncpy(ust_event->attr.name, agent_event->name, LTTNG_SYMBOL_NAME_LEN);
+ ust_event->attr.loglevel_type = agent_event->loglevel_type;
+ ust_event->attr.loglevel = agent_event->loglevel;
+ ust_event->filter_expression = agent_event->filter_expression;
+ ust_event->exclusion = agent_event->exclusion;
+}
+
+static
+int save_agent_events(struct config_writer *writer,
+ struct ltt_ust_channel *chan,
+ struct agent *agent)
+{
+ int ret;
+ struct lttng_ht_iter iter;
+ struct lttng_ht_node_str *node;
+
+ ret = config_writer_open_element(writer, config_element_events);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+
+ rcu_read_lock();
+ cds_lfht_for_each_entry(agent->events->ht, &iter.iter, node, node) {
+ int ret;
+ struct agent_event *agent_event;
+ struct ltt_ust_event fake_event;
+
+ memset(&fake_event, 0, sizeof(fake_event));
+ agent_event = caa_container_of(node, struct agent_event, node);
+
+ /*
+ * Initialize a fake ust event to reuse the same serialization
+ * function since UST and agent events contain the same info
+ * (and one could wonder why they don't reuse the same
+ * structures...).
+ */
+ init_ust_event_from_agent_event(&fake_event, agent_event);
+ ret = save_ust_event(writer, &fake_event);
+ if (ret) {
+ rcu_read_unlock();
+ goto end;
+ }
+ }
+ rcu_read_unlock();
+
+ /* /events */
+ ret = config_writer_close_element(writer);
+ if (ret) {
+ ret = LTTNG_ERR_SAVE_IO_FAIL;
+ goto end;
+ }
+end:
+ return ret;
+}
+