}
}
+fs::path fs_helpers::get_subsession_dir_by_uid(const int session_uid)
+{
+ std::string home_dir = get_home_dir_by_user_id(session_uid);
+
+ return fs::path {
+ std::move(home_dir) + "/" + main_dir_name.data()
+ };
+}
+
+std::vector<int> fs_helpers::get_user_list(const int session_uid) try
+{
+ auto const subsession_path = get_subsession_dir_by_uid(session_uid);
+ std::vector<int> subsessions;
+
+ /* NB: the `subsession` folder may not exist if no
+ * subsessions have been created before. */
+ if (!fs::exists(subsession_path))
+ return subsessions;
+
+ for (auto const& entry : fs::directory_iterator(subsession_path)) {
+ if (!fs::is_directory(entry.status()))
+ continue;
+
+ std::string_view s_path = entry.path().filename().string();
+
+ /* NB: the std::stoi check below is insufficient,
+ * since you can create folders named +123 or 0x123. */
+ if (s_path.find_first_not_of("0123456789") != std::string::npos)
+ continue;
+
+ try {
+ const int subsession_id { std::stoi(s_path.data()) };
+ if (subsession_id > 0)
+ subsessions.emplace_back(subsession_id);
+ }
+ catch (std::exception const &ex) {
+ continue;
+ }
+ }
+
+ return subsessions;
+} catch (std::exception const &ex) {
+ std::cerr << "Exception " << ex.what() << std::endl
+ << "while enumerating user subsessions [session_uid="
+ << session_uid << "]" << std::endl;
+ throw std::runtime_error("Couldn't enumerate user subsessions");
+}
+
#pragma once
+#include <filesystem>
#include <string>
#include <string_view>
+#include <vector>
+
+namespace fs = std::filesystem;
namespace fs_helpers
{
std::string get_home_dir_by_user_id(const int uid);
int get_gid_from_name(std::string_view group_name);
+ fs::path get_subsession_dir_by_uid(const int session_uid);
+
void create_main_subdirectory(const int session_uid, std::string_view main_dir);
- void copy_smack_attributes(const std::string &src_path, const std::string &dest_path);
- void add_user_subsession(const int session_uid, const int subsession_id);
+ void copy_smack_attributes(const std::string &src_path, const std::string &dest_path);
+ void add_user_subsession(const int session_uid, const int subsession_id);
void remove_user_subsession(const int session_uid, const int subsession_id);
+ std::vector<int> get_user_list(const int session_uid);
constexpr static std::string_view main_dir_name = "subsession";
constexpr static std::string_view main_dir_group = "system_share";