SessionManagement.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. #ifdef AK_OS_SERENITY
  10. # include <LibSystem/syscall.h>
  11. #endif
  12. namespace Core::SessionManagement {
  13. ErrorOr<pid_t> root_session_id([[maybe_unused]] Optional<pid_t> force_sid)
  14. {
  15. #ifdef AK_OS_SERENITY
  16. int rc = syscall(SC_get_root_session_id, force_sid.value_or(-1));
  17. if (rc < 0) {
  18. return Error::from_syscall("get_root_session_id"sv, rc);
  19. }
  20. return static_cast<pid_t>(rc);
  21. #else
  22. return 0;
  23. #endif
  24. }
  25. ErrorOr<void> logout(Optional<pid_t> force_sid)
  26. {
  27. pid_t sid = TRY(root_session_id(force_sid));
  28. TRY(System::kill(-sid, SIGTERM));
  29. return {};
  30. }
  31. ErrorOr<ByteString> parse_path_with_sid(StringView general_path, Optional<pid_t> force_sid)
  32. {
  33. if (general_path.contains("%sid"sv)) {
  34. pid_t sid = TRY(root_session_id(force_sid));
  35. return general_path.replace("%sid"sv, ByteString::number(sid), ReplaceMode::All);
  36. }
  37. return ByteString(general_path);
  38. }
  39. ErrorOr<void> create_session_temporary_directory_if_needed(uid_t uid, gid_t gid, Optional<pid_t> force_sid)
  40. {
  41. pid_t sid = TRY(root_session_id(force_sid));
  42. auto const temporary_directory = ByteString::formatted("/tmp/session/{}", sid);
  43. auto directory = TRY(Core::Directory::create(temporary_directory, Core::Directory::CreateDirectories::Yes));
  44. TRY(directory.chown(uid, gid));
  45. return {};
  46. }
  47. }