#include "tuple_hash.hpp"
#include "wait_manager.hpp"
#include "dir_backend_regular_dir.hpp"
+#include "dir_backend_fixed_size.hpp"
static constexpr const char * get_dbus_error_mapping (subsession_error_e subsession_error)
{
using namespace std::string_view_literals;
+static bool is_subsession_size_limit_valid (unsigned size_kB)
+{
+ static constexpr int MINIMUM_FOR_EXT2_OVERHEAD = 220; // determined empirically
+ if (size_kB < MINIMUM_FOR_EXT2_OVERHEAD)
+ return false;
+
+ return true;
+}
+
struct introspection_data {
introspection_data(std::string_view xml)
{
g_dbus_method_invocation_return_value(invocation, nullptr);
}
+ void on_add_user_fixed_size(GDBusMethodInvocation *invocation, std::string_view sender, GVariant *parameters)
+ {
+ auto [ session_uid, subsession_id, size_kB ] = tuple_from_g_variant<int, std::string, unsigned>(parameters);
+
+ if (check_parameters_invalid(invocation, session_uid, subsession_id))
+ return;
+ if (!is_subsession_size_limit_valid(size_kB)) {
+ g_dbus_method_invocation_return_dbus_error(invocation,
+ get_dbus_error_mapping(SUBSESSION_ERROR_INVALID_PARAMETER), "Size too small");
+ return;
+ }
+
+ GError *err = nullptr;
+ if (!g_dbus_connection_emit_signal(connection, nullptr, bus_object.data(), bus_iface.data(), "AddUserStarted",
+ vals_to_g_variant(session_uid, subsession_id), &err))
+ g_error_throw(err, "Failed to emit a signal: ");
+
+ add_user_subsession(session_uid, subsession_id, DirBackendAddFixedSize {size_kB});
+
+ wait_add.try_emplace(session_uid, session_uid, connection, "AddUserCompleted");
+ wait_add.at(session_uid).on_start(subsession_id, { });
+
+ g_dbus_method_invocation_return_value(invocation, nullptr);
+ }
+
void on_remove_user(GDBusMethodInvocation *invocation, std::string_view sender, GVariant *parameters)
{
auto [ session_uid, subsession_id ] = tuple_from_g_variant<int, std::string>(parameters);
"<arg name=\"session_uid\" type=\"i\" direction=\"in\"/>"
"<arg name=\"subsession_id\" type=\"s\" direction=\"in\"/>"
"</method>"
+ "<method name=\"AddUserFixedSize\">"
+ "<arg name=\"session_uid\" type=\"i\" direction=\"in\"/>"
+ "<arg name=\"subsession_id\" type=\"s\" direction=\"in\"/>"
+ "<arg name=\"size_kB\" type=\"u\" direction=\"in\"/>"
+ "</method>"
"<method name=\"RemoveUser\">"
"<arg name=\"session_uid\" type=\"i\" direction=\"in\"/>"
"<arg name=\"subsession_id\" type=\"s\" direction=\"in\"/>"
"</node>";
constexpr static std::array methods = {
- std::make_pair( "AddUser"sv, &sessiond_context::on_add_user ),
- std::make_pair( "RemoveUser"sv, &sessiond_context::on_remove_user ),
- std::make_pair( "SwitchUser"sv, &sessiond_context::on_switch_user ),
- std::make_pair( "AddUserWait"sv, &sessiond_context::on_add_user_wait ),
- std::make_pair("RemoveUserWait"sv, &sessiond_context::on_remove_user_wait),
- std::make_pair("SwitchUserWait"sv, &sessiond_context::on_switch_user_wait),
- std::make_pair( "AddUserDone"sv, &sessiond_context::on_add_user_done ),
- std::make_pair("RemoveUserDone"sv, &sessiond_context::on_remove_user_done),
- std::make_pair("SwitchUserDone"sv, &sessiond_context::on_switch_user_done),
- std::make_pair( "GetUserList"sv, &sessiond_context::on_get_user_list ),
- std::make_pair("GetCurrentUser"sv, &sessiond_context::on_get_current_user),
+ std::make_pair( "AddUser"sv, &sessiond_context::on_add_user ),
+ std::make_pair("AddUserFixedSize"sv, &sessiond_context::on_add_user_fixed_size),
+ std::make_pair( "RemoveUser"sv, &sessiond_context::on_remove_user ),
+ std::make_pair( "SwitchUser"sv, &sessiond_context::on_switch_user ),
+ std::make_pair( "AddUserWait"sv, &sessiond_context::on_add_user_wait ),
+ std::make_pair( "RemoveUserWait"sv, &sessiond_context::on_remove_user_wait ),
+ std::make_pair( "SwitchUserWait"sv, &sessiond_context::on_switch_user_wait ),
+ std::make_pair( "AddUserDone"sv, &sessiond_context::on_add_user_done ),
+ std::make_pair( "RemoveUserDone"sv, &sessiond_context::on_remove_user_done ),
+ std::make_pair( "SwitchUserDone"sv, &sessiond_context::on_switch_user_done ),
+ std::make_pair( "GetUserList"sv, &sessiond_context::on_get_user_list ),
+ std::make_pair( "GetCurrentUser"sv, &sessiond_context::on_get_current_user ),
};
// TODO: Currently, the first parameter is always a single-element tuple.