Add kernel and UST time namespace context
[lttng-tools.git] / src / bin / lttng-sessiond / save.c
index 395c0f65c145e882a5ae44918eed3e645d19f3fd..09194008a834ae2fc0111bee26bf7b89cf3b54ee 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2014 Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _LGPL_SOURCE
@@ -332,6 +322,9 @@ const char *get_kernel_context_type_string(
        case LTTNG_KERNEL_CONTEXT_PID_NS:
                context_type_string = config_event_context_pid_ns;
                break;
+       case LTTNG_KERNEL_CONTEXT_TIME_NS:
+               context_type_string = config_event_context_time_ns;
+               break;
        case LTTNG_KERNEL_CONTEXT_USER_NS:
                context_type_string = config_event_context_user_ns;
                break;
@@ -418,6 +411,9 @@ const char *get_ust_context_type_string(
        case LTTNG_UST_CONTEXT_NET_NS:
                context_type_string = config_event_context_net_ns;
                break;
+       case LTTNG_UST_CONTEXT_TIME_NS:
+               context_type_string = config_event_context_time_ns;
+               break;
        case LTTNG_UST_CONTEXT_PID_NS:
                context_type_string = config_event_context_pid_ns;
                break;
@@ -1830,50 +1826,47 @@ const char *get_config_domain_str(enum lttng_domain_type domain)
 }
 
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
-static int save_id_tracker(struct config_writer *writer,
+static int save_process_attr_tracker(struct config_writer *writer,
                struct ltt_session *sess,
                int domain,
-               enum lttng_tracker_type tracker_type)
+               enum lttng_process_attr process_attr)
 {
        int ret = LTTNG_OK;
-       unsigned int nr_ids, i;
-       struct lttng_tracker_ids *ids = NULL;
        const char *element_id_tracker, *element_target_id, *element_id;
-       const struct lttng_tracker_id *id;
-       enum lttng_tracker_id_status status;
-       int value;
-       const char *string;
-
-       switch (tracker_type) {
-       case LTTNG_TRACKER_PID:
-               element_id_tracker = config_element_pid_tracker;
-               element_target_id = config_element_target_pid;
-               element_id = config_element_pid;
-               break;
-       case LTTNG_TRACKER_VPID:
-               element_id_tracker = config_element_vpid_tracker;
-               element_target_id = config_element_target_vpid;
-               element_id = config_element_id;
-               break;
-       case LTTNG_TRACKER_UID:
-               element_id_tracker = config_element_uid_tracker;
-               element_target_id = config_element_target_uid;
-               element_id = config_element_id;
-               break;
-       case LTTNG_TRACKER_VUID:
-               element_id_tracker = config_element_vuid_tracker;
-               element_target_id = config_element_target_vuid;
-               element_id = config_element_id;
-               break;
-       case LTTNG_TRACKER_GID:
-               element_id_tracker = config_element_gid_tracker;
-               element_target_id = config_element_target_gid;
-               element_id = config_element_id;
-               break;
-       case LTTNG_TRACKER_VGID:
-               element_id_tracker = config_element_vgid_tracker;
-               element_target_id = config_element_target_vgid;
-               element_id = config_element_id;
+       const struct process_attr_tracker *tracker;
+       enum lttng_tracking_policy tracking_policy;
+       struct lttng_process_attr_values *values = NULL;
+
+       switch (process_attr) {
+       case LTTNG_PROCESS_ATTR_PROCESS_ID:
+               element_id_tracker = config_element_process_attr_tracker_pid;
+               element_target_id = config_element_process_attr_pid_value;
+               element_id = config_element_process_attr_id;
+               break;
+       case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
+               element_id_tracker = config_element_process_attr_tracker_vpid;
+               element_target_id = config_element_process_attr_vpid_value;
+               element_id = config_element_process_attr_id;
+               break;
+       case LTTNG_PROCESS_ATTR_USER_ID:
+               element_id_tracker = config_element_process_attr_tracker_uid;
+               element_target_id = config_element_process_attr_uid_value;
+               element_id = config_element_process_attr_id;
+               break;
+       case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
+               element_id_tracker = config_element_process_attr_tracker_vuid;
+               element_target_id = config_element_process_attr_vuid_value;
+               element_id = config_element_process_attr_id;
+               break;
+       case LTTNG_PROCESS_ATTR_GROUP_ID:
+               element_id_tracker = config_element_process_attr_tracker_gid;
+               element_target_id = config_element_process_attr_gid_value;
+               element_id = config_element_process_attr_id;
+               break;
+       case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
+               element_id_tracker = config_element_process_attr_tracker_vgid;
+               element_target_id = config_element_process_attr_vgid_value;
+               element_id = config_element_process_attr_id;
                break;
        default:
                ret = LTTNG_ERR_SAVE_IO_FAIL;
@@ -1883,115 +1876,109 @@ static int save_id_tracker(struct config_writer *writer,
        switch (domain) {
        case LTTNG_DOMAIN_KERNEL:
        {
-               ret = kernel_list_tracker_ids(
-                               tracker_type, sess->kernel_session, &ids);
-               if (ret != LTTNG_OK) {
-                       ret = LTTNG_ERR_KERN_LIST_FAIL;
-                       goto end;
-               }
+               tracker = kernel_get_process_attr_tracker(
+                               sess->kernel_session, process_attr);
+               assert(tracker);
                break;
        }
        case LTTNG_DOMAIN_UST:
        {
-               ret = trace_ust_list_tracker_ids(
-                               tracker_type, sess->ust_session, &ids);
-               if (ret != LTTNG_OK) {
-                       ret = LTTNG_ERR_UST_LIST_FAIL;
-                       goto end;
-               }
+               tracker = trace_ust_get_process_attr_tracker(
+                               sess->ust_session, process_attr);
+               assert(tracker);
                break;
        }
        case LTTNG_DOMAIN_JUL:
        case LTTNG_DOMAIN_LOG4J:
        case LTTNG_DOMAIN_PYTHON:
        default:
-               ret = LTTNG_ERR_UNKNOWN_DOMAIN;
+               ret = LTTNG_ERR_UNSUPPORTED_DOMAIN;
                goto end;
        }
 
-       status = lttng_tracker_ids_get_count(ids, &nr_ids);
-       if (status != LTTNG_TRACKER_ID_STATUS_OK) {
-               ret = LTTNG_ERR_INVALID;
+       tracking_policy = process_attr_tracker_get_tracking_policy(tracker);
+       if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_ALL) {
+               /* Tracking all, nothing to output. */
+               ret = LTTNG_OK;
                goto end;
        }
 
-       if (nr_ids == 1) {
-               id = lttng_tracker_ids_get_at_index(ids, 0);
-               if (id && lttng_tracker_id_get_type(id) == LTTNG_ID_ALL) {
-                       /* Tracking all, nothing to output. */
-                       ret = LTTNG_OK;
-                       goto end;
-               }
-       }
-
        ret = config_writer_open_element(writer, element_id_tracker);
        if (ret) {
                ret = LTTNG_ERR_SAVE_IO_FAIL;
                goto end;
        }
 
-       ret = config_writer_open_element(writer, config_element_targets);
+       ret = config_writer_open_element(
+                       writer, config_element_process_attr_values);
        if (ret) {
                ret = LTTNG_ERR_SAVE_IO_FAIL;
                goto end;
        }
 
-       if (nr_ids == 0) {
-               /* Tracking none: empty list. */
-               ret = config_writer_open_element(writer, element_target_id);
-               if (ret) {
-                       ret = LTTNG_ERR_SAVE_IO_FAIL;
-                       goto end;
-               }
+       if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_SET) {
+               unsigned int i, count;
+               enum process_attr_tracker_status status =
+                               process_attr_tracker_get_inclusion_set(
+                                               tracker, &values);
 
-               /* /$element_target_id */
-               ret = config_writer_close_element(writer);
-               if (ret) {
-                       ret = LTTNG_ERR_SAVE_IO_FAIL;
+               if (status != PROCESS_ATTR_TRACKER_STATUS_OK) {
+                       ret = LTTNG_ERR_NOMEM;
                        goto end;
                }
-       } else {
-               /* Tracking list. */
-               for (i = 0; i < nr_ids; i++) {
-                       id = lttng_tracker_ids_get_at_index(ids, i);
-                       if (!id) {
+
+               count = _lttng_process_attr_values_get_count(values);
+
+               for (i = 0; i < count; i++) {
+                       unsigned int integral_value = UINT_MAX;
+                       const char *name = NULL;
+                       const struct process_attr_value *value =
+                                       lttng_process_attr_tracker_values_get_at_index(
+                                                       values, i);
+
+                       assert(value);
+                       ret = config_writer_open_element(
+                                       writer, element_target_id);
+                       if (ret) {
                                ret = LTTNG_ERR_SAVE_IO_FAIL;
                                goto end;
                        }
-                       switch (lttng_tracker_id_get_type(id)) {
-                       case LTTNG_ID_VALUE:
-                               ret = config_writer_open_element(
-                                               writer, element_target_id);
-                               if (ret) {
-                                       ret = LTTNG_ERR_SAVE_IO_FAIL;
-                                       goto end;
-                               }
-                               status = lttng_tracker_id_get_value(id, &value);
-                               ret = config_writer_write_element_unsigned_int(
-                                               writer, element_id, value);
+
+                       switch (value->type) {
+                       case LTTNG_PROCESS_ATTR_VALUE_TYPE_PID:
+                               integral_value =
+                                               (unsigned int) value->value.pid;
                                break;
-                       case LTTNG_ID_STRING:
-                               ret = config_writer_open_element(
-                                               writer, element_target_id);
-                               if (ret) {
-                                       ret = LTTNG_ERR_SAVE_IO_FAIL;
-                                       goto end;
-                               }
-                               status = lttng_tracker_id_get_string(
-                                               id, &string);
-                               ret = config_writer_write_element_string(writer,
-                                               config_element_name, string);
+                       case LTTNG_PROCESS_ATTR_VALUE_TYPE_UID:
+                               integral_value =
+                                               (unsigned int) value->value.uid;
+                               break;
+                       case LTTNG_PROCESS_ATTR_VALUE_TYPE_GID:
+                               integral_value =
+                                               (unsigned int) value->value.gid;
+                               break;
+                       case LTTNG_PROCESS_ATTR_VALUE_TYPE_USER_NAME:
+                               name = value->value.user_name;
+                               assert(name);
+                               break;
+                       case LTTNG_PROCESS_ATTR_VALUE_TYPE_GROUP_NAME:
+                               name = value->value.group_name;
+                               assert(name);
                                break;
                        default:
-                               /* Unexpected. */
-                               ret = LTTNG_ERR_SAVE_IO_FAIL;
-                               goto end;
+                               abort();
                        }
-                       if (ret) {
-                               ret = LTTNG_ERR_SAVE_IO_FAIL;
-                               goto end;
+
+                       if (name) {
+                               ret = config_writer_write_element_string(writer,
+                                               config_element_name, name);
+                       } else {
+                               ret = config_writer_write_element_unsigned_int(
+                                               writer, element_id,
+                                               integral_value);
                        }
-                       if (status != LTTNG_TRACKER_ID_STATUS_OK) {
+
+                       if (ret) {
                                ret = LTTNG_ERR_SAVE_IO_FAIL;
                                goto end;
                        }
@@ -2005,7 +1992,7 @@ static int save_id_tracker(struct config_writer *writer,
                }
        }
 
-       /* /targets */
+       /* /values */
        ret = config_writer_close_element(writer);
        if (ret) {
                ret = LTTNG_ERR_SAVE_IO_FAIL;
@@ -2021,12 +2008,12 @@ static int save_id_tracker(struct config_writer *writer,
 
        ret = LTTNG_OK;
 end:
-       lttng_tracker_ids_destroy(ids);
+       lttng_process_attr_values_destroy(values);
        return ret;
 }
 
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
-static int save_id_trackers(struct config_writer *writer,
+static int save_process_attr_trackers(struct config_writer *writer,
                struct ltt_session *sess,
                int domain)
 {
@@ -2034,40 +2021,61 @@ static int save_id_trackers(struct config_writer *writer,
 
        switch (domain) {
        case LTTNG_DOMAIN_KERNEL:
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_PID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VPID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_UID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VUID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_GID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VGID);
-               if (ret != LTTNG_OK)
-                       return ret;
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_PROCESS_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_USER_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_GROUP_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
                break;
        case LTTNG_DOMAIN_UST:
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VPID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VUID);
-               if (ret != LTTNG_OK)
-                       return ret;
-               ret = save_id_tracker(writer, sess, domain, LTTNG_TRACKER_VGID);
-               if (ret != LTTNG_OK)
-                       return ret;
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+               ret = save_process_attr_tracker(writer, sess, domain,
+                               LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
                break;
        default:
-               return LTTNG_ERR_INVALID;
+               ret = LTTNG_ERR_INVALID;
+               goto end;
        }
-       return LTTNG_OK;
+       ret = LTTNG_OK;
+end:
+       return ret;
 }
 
 /* Return LTTNG_OK on success else a LTTNG_ERR* code. */
@@ -2148,14 +2156,15 @@ int save_ust_domain(struct config_writer *writer,
        }
 
        if (domain == LTTNG_DOMAIN_UST) {
-               ret = config_writer_open_element(writer,
-                               config_element_trackers);
+               ret = config_writer_open_element(
+                               writer, config_element_process_attr_trackers);
                if (ret) {
                        ret = LTTNG_ERR_SAVE_IO_FAIL;
                        goto end;
                }
 
-               ret = save_id_trackers(writer, session, LTTNG_DOMAIN_UST);
+               ret = save_process_attr_trackers(
+                               writer, session, LTTNG_DOMAIN_UST);
                if (ret != LTTNG_OK) {
                        goto end;
                }
@@ -2212,14 +2221,15 @@ int save_domains(struct config_writer *writer, struct ltt_session *session)
                        goto end;
                }
 
-               ret = config_writer_open_element(writer,
-                       config_element_trackers);
+               ret = config_writer_open_element(
+                               writer, config_element_process_attr_trackers);
                if (ret) {
                        ret = LTTNG_ERR_SAVE_IO_FAIL;
                        goto end;
                }
 
-               ret = save_id_trackers(writer, session, LTTNG_DOMAIN_KERNEL);
+               ret = save_process_attr_trackers(
+                               writer, session, LTTNG_DOMAIN_KERNEL);
                if (ret != LTTNG_OK) {
                        goto end;
                }
This page took 0.028565 seconds and 4 git commands to generate.