X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Futils.cpp;h=df03b1127ed96be5b96614d57389d3c60dc719d8;hb=d93bbc2a50cd24ea2837d8710c99b71b5d1a5f11;hp=90ca90fdeb3a4892424e62827d01e920d7951ef5;hpb=cd9adb8b829564212158943a0d279bb35322ab30;p=lttng-tools.git diff --git a/src/bin/lttng/utils.cpp b/src/bin/lttng/utils.cpp index 90ca90fde..df03b1127 100644 --- a/src/bin/lttng/utils.cpp +++ b/src/bin/lttng/utils.cpp @@ -12,10 +12,13 @@ #include #include +#include +#include #include #include #include +#include #include #include #include @@ -659,3 +662,80 @@ end: } return ret; } + +namespace { +template +lttng::cli::session_list get_sessions(const FilterFunctionType& filter, + bool return_first_match_only = false) +{ + lttng::cli::session_list list = []() { + int list_ret; + struct lttng_session *psessions; + + list_ret = lttng_list_sessions(&psessions); + + if (list_ret < 0) { + LTTNG_THROW_CTL("Failed to list sessions", + static_cast(list_ret)); + } + + return lttng::cli::session_list(psessions, list_ret); + }(); + + std::size_t write_to = 0; + for (std::size_t read_from = 0; read_from < list.size(); ++read_from) { + if (!filter(list[read_from])) { + continue; + } + + if (read_from != write_to) { + list[write_to] = list[read_from]; + } + + ++write_to; + + if (return_first_match_only) { + return lttng::cli::session_list(std::move(list), 1); + } + } + + list.resize(write_to); + + return list; +} +} /* namespace */ + +lttng::cli::session_list lttng::cli::list_sessions(const struct session_spec& spec) +{ + switch (spec.type_) { + case lttng::cli::session_spec::type::NAME: + if (spec.value == nullptr) { + const auto configured_name = + lttng::make_unique_wrapper(get_session_name()); + + if (configured_name) { + const struct lttng::cli::session_spec new_spec( + lttng::cli::session_spec::type::NAME, + configured_name.get()); + + return list_sessions(new_spec); + } + + return lttng::cli::session_list(); + } + + return get_sessions( + [&spec](const lttng_session& session) { + return strcmp(session.name, spec.value) == 0; + }, + true); + case lttng::cli::session_spec::type::GLOB_PATTERN: + return get_sessions([&spec](const lttng_session& session) { + return fnmatch(spec.value, session.name, 0) == 0; + }); + case lttng::cli::session_spec::type::ALL: + return get_sessions([](const lttng_session&) { return true; }); + } + + return lttng::cli::session_list(); +}