lttng: list: replace domain headers with the official names
[lttng-tools.git] / src / bin / lttng / commands / list.c
index e05134cbb2d518f6f1dbfcea9ffa0fc151fd71e8..334d4daf1f6bf02d8d77084e10d8ccbdacddfc53 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
  *
- * 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
@@ -24,7 +14,9 @@
 #include <assert.h>
 
 #include <common/mi-lttng.h>
+#include <common/time.h>
 #include <lttng/constant.h>
+#include <lttng/tracker.h>
 
 #include "../command.h"
 
@@ -249,6 +241,82 @@ end:
        return exclusion_msg;
 }
 
+static void print_userspace_probe_location(struct lttng_event *event)
+{
+       const struct lttng_userspace_probe_location *location;
+       const struct lttng_userspace_probe_location_lookup_method *lookup_method;
+       enum lttng_userspace_probe_location_lookup_method_type lookup_type;
+
+       location = lttng_event_get_userspace_probe_location(event);
+       if (!location) {
+               MSG("Event has no userspace probe location");
+               return;
+       }
+
+       lookup_method = lttng_userspace_probe_location_get_lookup_method(location);
+       if (!lookup_method) {
+               MSG("Event has no userspace probe location lookup method");
+               return;
+       }
+
+       MSG("%s%s (type: userspace-probe)%s", indent6, event->name, enabled_string(event->enabled));
+
+       lookup_type = lttng_userspace_probe_location_lookup_method_get_type(lookup_method);
+
+       switch (lttng_userspace_probe_location_get_type(location)) {
+       case LTTNG_USERSPACE_PROBE_LOCATION_TYPE_UNKNOWN:
+               MSG("%sType: Unknown", indent8);
+               break;
+       case LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION:
+       {
+               const char *function_name;
+               const char *binary_path;
+
+               MSG("%sType: Function", indent8);
+               function_name = lttng_userspace_probe_location_function_get_function_name(location);
+               binary_path = realpath(lttng_userspace_probe_location_function_get_binary_path(location), NULL);
+
+               MSG("%sBinary path:   %s", indent8, binary_path ? binary_path : "NULL");
+               MSG("%sFunction:      %s()", indent8, function_name ? function_name : "NULL");
+               switch (lookup_type) {
+               case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF:
+                       MSG("%sLookup method: ELF", indent8);
+                       break;
+               case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_DEFAULT:
+                       MSG("%sLookup method: default", indent8);
+                       break;
+               default:
+                       MSG("%sLookup method: INVALID LOOKUP TYPE ENCOUNTERED", indent8);
+                       break;
+               }
+               break;
+       }
+       case LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT:
+       {
+               const char *probe_name, *provider_name;
+               const char *binary_path;
+
+               MSG("%sType: Tracepoint", indent8);
+               probe_name = lttng_userspace_probe_location_tracepoint_get_probe_name(location);
+               provider_name = lttng_userspace_probe_location_tracepoint_get_provider_name(location);
+               binary_path = realpath(lttng_userspace_probe_location_tracepoint_get_binary_path(location), NULL);
+               MSG("%sBinary path:   %s", indent8, binary_path ? binary_path : "NULL");
+               MSG("%sTracepoint:    %s:%s", indent8, provider_name ? provider_name : "NULL", probe_name ? probe_name : "NULL");
+               switch (lookup_type) {
+               case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
+                       MSG("%sLookup method: SDT", indent8);
+                       break;
+               default:
+                       MSG("%sLookup method: INVALID LOOKUP TYPE ENCOUNTERED", indent8);
+                       break;
+               }
+               break;
+       }
+       default:
+               ERR("Invalid probe type encountered");
+       }
+}
+
 /*
  * Pretty print single event.
  */
@@ -324,6 +392,9 @@ static void print_events(struct lttng_event *event)
                        MSG("%ssymbol: %s", indent8, event->attr.probe.symbol_name);
                }
                break;
+       case LTTNG_EVENT_USERSPACE_PROBE:
+               print_userspace_probe_location(event);
+               break;
        case LTTNG_EVENT_FUNCTION_ENTRY:
                MSG("%s%s (type: function)%s%s", indent6,
                                event->name, enabled_string(event->enabled),
@@ -343,6 +414,8 @@ static void print_events(struct lttng_event *event)
                                safe_string(filter_msg));
                break;
        case LTTNG_EVENT_ALL:
+               /* Fall-through. */
+       default:
                /* We should never have "all" events in list. */
                assert(0);
                break;
@@ -727,7 +800,7 @@ static int mi_list_ust_event_fields(struct lttng_event_field *fields, int count,
                }
        }
 
-       /* Close pid, domain, domains */
+       /* Close pids, domain, domains */
        ret = mi_lttng_close_multi_element(writer, 3);
 end:
        return ret;
@@ -1180,7 +1253,7 @@ void print_timer(const char *timer_name, uint32_t space_count, int64_t value)
        }
 
        if (value) {
-               MSG("%" PRId64 " µs", value);
+               MSG("%" PRId64 " %s", value, USEC_UNIT);
        } else {
                MSG("inactive");
        }
@@ -1237,7 +1310,8 @@ static void print_channel(struct lttng_channel *channel)
                if (blocking_timeout == -1) {
                        MSG("%sBlocking timeout: infinite", indent6);
                } else {
-                       MSG("%sBlocking timeout: %" PRId64 " µs", indent6, blocking_timeout);
+                       MSG("%sBlocking timeout: %" PRId64 " %s", indent6,
+                                       blocking_timeout, USEC_UNIT);
                }
        }
 
@@ -1429,43 +1503,123 @@ error_channels:
        return ret;
 }
 
+static const char *get_tracker_str(enum lttng_tracker_type tracker_type)
+{
+       switch (tracker_type) {
+       case LTTNG_TRACKER_PID:
+               return "PID";
+       case LTTNG_TRACKER_VPID:
+               return "VPID";
+       case LTTNG_TRACKER_UID:
+               return "UID";
+       case LTTNG_TRACKER_VUID:
+               return "VUID";
+       case LTTNG_TRACKER_GID:
+               return "GID";
+       case LTTNG_TRACKER_VGID:
+               return "VGID";
+       }
+       return NULL;
+}
+
 /*
- * List tracker PID(s) of session and domain.
+ * List tracker ID(s) of session and domain.
  */
-static int list_tracker_pids(void)
+static int list_tracker_ids(enum lttng_tracker_type tracker_type)
 {
        int ret = 0;
-       int enabled;
-       int *pids = NULL;
-       size_t nr_pids;
+       int enabled = 1;
+       struct lttng_tracker_ids *ids = NULL;
+       unsigned int nr_ids, i;
+       const struct lttng_tracker_id *id;
+       enum lttng_tracker_id_status status;
 
-       ret = lttng_list_tracker_pids(handle,
-               &enabled, &pids, &nr_pids);
+       ret = lttng_list_tracker_ids(handle, tracker_type, &ids);
        if (ret) {
                return ret;
        }
+
+       status = lttng_tracker_ids_get_count(ids, &nr_ids);
+       if (status != LTTNG_TRACKER_ID_STATUS_OK) {
+               ret = CMD_ERROR;
+               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) {
+                       enabled = 0;
+               }
+       }
+
        if (enabled) {
-               int i;
-               _MSG("PID tracker: [");
+               _MSG("%s tracker: [", get_tracker_str(tracker_type));
 
-               /* Mi tracker_pid element*/
+               /* Mi tracker_id element */
                if (writer) {
-                       /* Open tracker_pid and targets elements */
-                       ret = mi_lttng_pid_tracker_open(writer);
+                       /* Open tracker_id and targets elements */
+                       ret = mi_lttng_id_tracker_open(writer, tracker_type);
                        if (ret) {
                                goto end;
                        }
                }
 
-               for (i = 0; i < nr_pids; i++) {
+               for (i = 0; i < nr_ids; i++) {
+                       enum lttng_tracker_id_status status =
+                                       LTTNG_TRACKER_ID_STATUS_OK;
+                       int value;
+                       const char *value_string;
+
+                       id = lttng_tracker_ids_get_at_index(ids, i);
+                       if (!id) {
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
+
+                       switch (lttng_tracker_id_get_type(id)) {
+                       case LTTNG_ID_ALL:
+                               break;
+                       case LTTNG_ID_VALUE:
+                               status = lttng_tracker_id_get_value(id, &value);
+                               break;
+                       case LTTNG_ID_STRING:
+                               status = lttng_tracker_id_get_string(
+                                               id, &value_string);
+                               break;
+                       case LTTNG_ID_UNKNOWN:
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
+
+                       if (status != LTTNG_TRACKER_ID_STATUS_OK) {
+                               ERR("Invalid state for tracker id");
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
+
                        if (i) {
                                _MSG(",");
                        }
-                       _MSG(" %d", pids[i]);
+                       switch (lttng_tracker_id_get_type(id)) {
+                       case LTTNG_ID_ALL:
+                               _MSG(" *");
+                               break;
+                       case LTTNG_ID_VALUE:
+                               _MSG(" %d", value);
+                               break;
+                       case LTTNG_ID_STRING:
+                               _MSG(" %s", value_string);
+                               break;
+                       case LTTNG_ID_UNKNOWN:
+                               ERR("Invalid state for tracker id");
+                               ret = CMD_ERROR;
+                               goto end;
+                       }
 
                        /* Mi */
                        if (writer) {
-                               ret = mi_lttng_pid_target(writer, pids[i], 0);
+                               ret = mi_lttng_id_target(
+                                               writer, tracker_type, id, 0);
                                if (ret) {
                                        goto end;
                                }
@@ -1473,26 +1627,25 @@ static int list_tracker_pids(void)
                }
                _MSG(" ]\n\n");
 
-               /* Mi close tracker_pid and targets */
+               /* Mi close tracker_id and targets */
                if (writer) {
-                       ret = mi_lttng_close_multi_element(writer,2);
+                       ret = mi_lttng_close_multi_element(writer, 2);
                        if (ret) {
                                goto end;
                        }
                }
        }
 end:
-       free(pids);
+       lttng_tracker_ids_destroy(ids);
        return ret;
-
 }
 
 /*
- * List all tracker of a domain
+ * List all trackers of a domain
  */
-static int list_trackers(void)
+static int list_trackers(const struct lttng_domain *domain)
 {
-       int ret;
+       int ret = 0;
 
        /* Trackers listing */
        if (lttng_opt_mi) {
@@ -1502,12 +1655,59 @@ static int list_trackers(void)
                }
        }
 
-       /* pid tracker */
-       ret = list_tracker_pids();
-       if (ret) {
-               goto end;
+       switch (domain->type) {
+       case LTTNG_DOMAIN_KERNEL:
+               /* pid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_PID);
+               if (ret) {
+                       goto end;
+               }
+               /* vpid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VPID);
+               if (ret) {
+                       goto end;
+               }
+               /* uid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_UID);
+               if (ret) {
+                       goto end;
+               }
+               /* vuid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VUID);
+               if (ret) {
+                       goto end;
+               }
+               /* gid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_GID);
+               if (ret) {
+                       goto end;
+               }
+               /* vgid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VGID);
+               if (ret) {
+                       goto end;
+               }
+               break;
+       case LTTNG_DOMAIN_UST:
+               /* vpid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VPID);
+               if (ret) {
+                       goto end;
+               }
+               /* vuid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VUID);
+               if (ret) {
+                       goto end;
+               }
+               /* vgid tracker */
+               ret = list_tracker_ids(LTTNG_TRACKER_VGID);
+               if (ret) {
+                       goto end;
+               }
+               break;
+       default:
+               break;
        }
-
        if (lttng_opt_mi) {
                /* Close trackers element */
                ret = mi_lttng_writer_close_element(writer);
@@ -1520,55 +1720,145 @@ end:
        return ret;
 }
 
+static enum cmd_error_code print_periodic_rotation_schedule(
+               const struct lttng_rotation_schedule *schedule)
+{
+       enum cmd_error_code ret;
+       enum lttng_rotation_status status;
+       uint64_t value;
+
+       status = lttng_rotation_schedule_periodic_get_period(schedule,
+                       &value);
+       if (status != LTTNG_ROTATION_STATUS_OK) {
+               ERR("Failed to retrieve period parameter from periodic rotation schedule.");
+               ret = CMD_ERROR;
+               goto end;
+       }
+
+       MSG("    timer period: %" PRIu64" %s", value, USEC_UNIT);
+       ret = CMD_SUCCESS;
+end:
+       return ret;
+}
+
+static enum cmd_error_code print_size_threshold_rotation_schedule(
+               const struct lttng_rotation_schedule *schedule)
+{
+       enum cmd_error_code ret;
+       enum lttng_rotation_status status;
+       uint64_t value;
+
+       status = lttng_rotation_schedule_size_threshold_get_threshold(schedule,
+                       &value);
+       if (status != LTTNG_ROTATION_STATUS_OK) {
+               ERR("Failed to retrieve size parameter from size-based rotation schedule.");
+               ret = CMD_ERROR;
+               goto end;
+       }
+
+       MSG("    size threshold: %" PRIu64" bytes", value);
+       ret = CMD_SUCCESS;
+end:
+       return ret;
+}
+
+static enum cmd_error_code print_rotation_schedule(
+               const struct lttng_rotation_schedule *schedule)
+{
+       enum cmd_error_code ret;
+
+       switch (lttng_rotation_schedule_get_type(schedule)) {
+       case LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD:
+               ret = print_size_threshold_rotation_schedule(schedule);
+               break;
+       case LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC:
+               ret = print_periodic_rotation_schedule(schedule);
+               break;
+       default:
+               ret = CMD_ERROR;
+       }
+       return ret;
+}
+
 /*
- * List the rotate settings (timer/size if any).
+ * List the automatic rotation settings.
  */
-static int list_rotate_settings(const char *session_name)
+static enum cmd_error_code list_rotate_settings(const char *session_name)
 {
        int ret;
-       uint64_t size, timer;
-
-       ret = lttng_rotation_schedule_get_timer_period(session_name, &timer);
-       if (ret) {
+       enum cmd_error_code cmd_ret = CMD_SUCCESS;
+       unsigned int count, i;
+       struct lttng_rotation_schedules *schedules = NULL;
+       enum lttng_rotation_status status;
+
+       ret = lttng_session_list_rotation_schedules(session_name, &schedules);
+       if (ret != LTTNG_OK) {
+               ERR("Failed to list session rotation schedules: %s", lttng_strerror(ret));
+               cmd_ret = CMD_ERROR;
                goto end;
        }
 
-       ret = lttng_rotation_schedule_get_size(session_name, &size);
-       if (ret) {
+       status = lttng_rotation_schedules_get_count(schedules, &count);
+       if (status != LTTNG_ROTATION_STATUS_OK) {
+               ERR("Failed to retrieve the number of session rotation schedules.");
+               cmd_ret = CMD_ERROR;
                goto end;
        }
 
-       if (!timer && !size) {
-               ret = 0;
+       if (count == 0) {
+               cmd_ret = CMD_SUCCESS;
                goto end;
        }
 
-       _MSG("Automatic rotation schedule settings:\n");
-
-       if (timer) {
-               _MSG("    timer period: %" PRIu64" µs\n", timer);
-               if (lttng_opt_mi) {
-                       ret = mi_lttng_writer_write_element_unsigned_int(writer,
-                                       config_element_rotation_timer_interval, timer);
-                       if (ret) {
-                               goto end;
-                       }
+       MSG("Automatic rotation schedules:");
+       if (lttng_opt_mi) {
+               ret = mi_lttng_writer_open_element(writer,
+                               mi_lttng_element_rotation_schedules);
+               if (ret) {
+                       cmd_ret = CMD_ERROR;
+                       goto end;
                }
        }
-       if (size) {
-               _MSG("    size threshold:  %" PRIu64" bytes\n", size);
+
+       for (i = 0; i < count; i++) {
+               enum cmd_error_code tmp_ret = CMD_SUCCESS;
+               const struct lttng_rotation_schedule *schedule;
+
+               schedule = lttng_rotation_schedules_get_at_index(schedules, i);
+               if (!schedule) {
+                       ERR("Failed to retrieve session rotation schedule.");
+                       cmd_ret = CMD_ERROR;
+                       goto end;
+               }
+
                if (lttng_opt_mi) {
-                       ret = mi_lttng_writer_write_element_unsigned_int(writer,
-                                       config_element_rotation_size, size);
+                       ret = mi_lttng_rotation_schedule(writer, schedule);
                        if (ret) {
-                               goto end;
+                               tmp_ret = CMD_ERROR;
                        }
+               } else {
+                       tmp_ret = print_rotation_schedule(schedule);
                }
+
+               /*
+                * Report an error if the serialization of any of the
+                * descriptors failed.
+                */
+               cmd_ret = cmd_ret ? cmd_ret : tmp_ret;
        }
-       _MSG("\n");
 
+       _MSG("\n");
+       if (lttng_opt_mi) {
+               /* Close the rotation_schedules element. */
+               ret = mi_lttng_writer_close_element(writer);
+               if (ret) {
+                       cmd_ret = CMD_ERROR;
+                       goto end;
+               }
+       }
 end:
-       return ret;
+       lttng_rotation_schedules_destroy(schedules);
+       return cmd_ret;
 }
 
 /*
@@ -1652,7 +1942,7 @@ static int list_sessions(const char *session_name)
        int ret = CMD_SUCCESS;
        int count, i;
        unsigned int session_found = 0;
-       struct lttng_session *sessions;
+       struct lttng_session *sessions = NULL;
 
        count = lttng_list_sessions(&sessions);
        DBG("Session count %d", count);
@@ -1665,7 +1955,7 @@ static int list_sessions(const char *session_name)
        if (lttng_opt_mi) {
                /* Mi */
                if (session_name == NULL) {
-                       /* List all session */
+                       /* List all sessions */
                        ret = mi_list_sessions(sessions, count);
                } else {
                        /* Note : this return an open session element */
@@ -1673,7 +1963,7 @@ static int list_sessions(const char *session_name)
                }
                if (ret) {
                        ret = CMD_ERROR;
-                       goto error;
+                       goto end;
                }
        } else {
                /* Pretty print */
@@ -1686,7 +1976,6 @@ static int list_sessions(const char *session_name)
                        MSG("Available tracing sessions:");
                }
 
-
                for (i = 0; i < count; i++) {
                        if (session_name != NULL) {
                                if (strncmp(sessions[i].name, session_name, NAME_MAX) == 0) {
@@ -1694,20 +1983,25 @@ static int list_sessions(const char *session_name)
                                        MSG("Tracing session %s: [%s%s]", session_name,
                                                        active_string(sessions[i].enabled),
                                                        snapshot_string(sessions[i].snapshot_mode));
-                                       MSG("%sTrace path: %s\n", indent4, sessions[i].path);
+                                       if (*sessions[i].path) {
+                                               MSG("%sTrace output: %s\n", indent4, sessions[i].path);
+                                       }
                                        memcpy(&listed_session, &sessions[i],
                                                        sizeof(listed_session));
                                        break;
                                }
                        } else {
-                               MSG("  %d) %s (%s) [%s%s]", i + 1,
-                                               sessions[i].name, sessions[i].path,
+                               MSG("  %d) %s [%s%s]", i + 1,
+                                               sessions[i].name,
                                                active_string(sessions[i].enabled),
                                                snapshot_string(sessions[i].snapshot_mode));
-                               MSG("%sTrace path: %s", indent4, sessions[i].path);
+                               if (*sessions[i].path) {
+                                       MSG("%sTrace output: %s", indent4, sessions[i].path);
+                               }
                                if (sessions[i].live_timer_interval != 0) {
-                                       MSG("%sLive timer interval: %u µs", indent4,
-                                                       sessions[i].live_timer_interval);
+                                       MSG("%sLive timer interval: %u %s", indent4,
+                                                       sessions[i].live_timer_interval,
+                                                       USEC_UNIT);
                                }
                                MSG("");
                        }
@@ -1716,7 +2010,7 @@ static int list_sessions(const char *session_name)
                if (!session_found && session_name != NULL) {
                        ERR("Session '%s' not found", session_name);
                        ret = CMD_ERROR;
-                       goto error;
+                       goto end;
                }
 
                if (session_name == NULL) {
@@ -1724,9 +2018,8 @@ static int list_sessions(const char *session_name)
                }
        }
 
-error:
-       free(sessions);
 end:
+       free(sessions);
        return ret;
 }
 
@@ -2009,7 +2302,7 @@ int cmd_list(int argc, const char **argv)
 
 
                        /* Trackers */
-                       ret = list_trackers();
+                       ret = list_trackers(&domain);
                        if (ret) {
                                goto end;
                        }
@@ -2051,22 +2344,22 @@ int cmd_list(int argc, const char **argv)
                        for (i = 0; i < nb_domain; i++) {
                                switch (domains[i].type) {
                                case LTTNG_DOMAIN_KERNEL:
-                                       MSG("=== Domain: Kernel ===\n");
+                                       MSG("=== Domain: Linux kernel ===\n");
                                        break;
                                case LTTNG_DOMAIN_UST:
-                                       MSG("=== Domain: UST global ===\n");
-                                       MSG("Buffer type: %s\n",
+                                       MSG("=== Domain: User space ===\n");
+                                       MSG("Buffering scheme: %s\n",
                                                        domains[i].buf_type ==
-                                                       LTTNG_BUFFER_PER_PID ? "per PID" : "per UID");
+                                                       LTTNG_BUFFER_PER_PID ? "per-process" : "per-user");
                                        break;
                                case LTTNG_DOMAIN_JUL:
-                                       MSG("=== Domain: JUL (Java Util Logging) ===\n");
+                                       MSG("=== Domain: java.util.logging (JUL) ===\n");
                                        break;
                                case LTTNG_DOMAIN_LOG4J:
-                                       MSG("=== Domain: LOG4j (Logging for Java) ===\n");
+                                       MSG("=== Domain: log4j ===\n");
                                        break;
                                case LTTNG_DOMAIN_PYTHON:
-                                       MSG("=== Domain: Python (logging) ===\n");
+                                       MSG("=== Domain: Python logging ===\n");
                                        break;
                                default:
                                        MSG("=== Domain: Unimplemented ===\n");
@@ -2106,7 +2399,7 @@ int cmd_list(int argc, const char **argv)
                                switch (domains[i].type) {
                                case LTTNG_DOMAIN_KERNEL:
                                case LTTNG_DOMAIN_UST:
-                                       ret = list_trackers();
+                                       ret = list_trackers(&domains[i]);
                                        if (ret) {
                                                goto end;
                                        }
This page took 0.032513 seconds and 4 git commands to generate.