SessionManagement.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2022, Peter Elliott <pelliott@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/Directory.h>
  7. #include <LibCore/SessionManagement.h>
  8. #include <LibCore/System.h>
  9. namespace Core::SessionManagement {
  10. ErrorOr<pid_t> root_session_id([[maybe_unused]] Optional<pid_t> force_sid)
  11. {
  12. return 0;
  13. }
  14. ErrorOr<void> logout(Optional<pid_t> force_sid)
  15. {
  16. pid_t sid = TRY(root_session_id(force_sid));
  17. TRY(System::kill(-sid, SIGTERM));
  18. return {};
  19. }
  20. ErrorOr<ByteString> parse_path_with_sid(StringView general_path, Optional<pid_t> force_sid)
  21. {
  22. if (general_path.contains("%sid"sv)) {
  23. pid_t sid = TRY(root_session_id(force_sid));
  24. return general_path.replace("%sid"sv, ByteString::number(sid), ReplaceMode::All);
  25. }
  26. return ByteString(general_path);
  27. }
  28. ErrorOr<void> create_session_temporary_directory_if_needed(uid_t uid, gid_t gid, Optional<pid_t> force_sid)
  29. {
  30. pid_t sid = TRY(root_session_id(force_sid));
  31. auto const temporary_directory = ByteString::formatted("/tmp/session/{}", sid);
  32. auto directory = TRY(Core::Directory::create(temporary_directory, Core::Directory::CreateDirectories::Yes));
  33. TRY(directory.chown(uid, gid));
  34. return {};
  35. }
  36. }