BooleanVariable.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/FileSystem/SysFS/Subsystems/Kernel/Variables/BooleanVariable.h>
  7. #include <Kernel/Process.h>
  8. #include <Kernel/Sections.h>
  9. namespace Kernel {
  10. ErrorOr<void> SysFSSystemBooleanVariable::try_generate(KBufferBuilder& builder)
  11. {
  12. return builder.appendff("{}\n", static_cast<int>(value()));
  13. }
  14. ErrorOr<size_t> SysFSSystemBooleanVariable::write_bytes(off_t, size_t count, UserOrKernelBuffer const& buffer, OpenFileDescription*)
  15. {
  16. MutexLocker locker(m_refresh_lock);
  17. // Note: We do all of this code before taking the spinlock because then we disable
  18. // interrupts so page faults will not work.
  19. char value = 0;
  20. TRY(buffer.read(&value, 1));
  21. // NOTE: If we are in a jail, don't let the current process to change the variable.
  22. if (Process::current().is_currently_in_jail())
  23. return Error::from_errno(EPERM);
  24. if (count != 1)
  25. return Error::from_errno(EINVAL);
  26. if (value == '0') {
  27. set_value(false);
  28. return 1;
  29. } else if (value == '1') {
  30. set_value(true);
  31. return 1;
  32. }
  33. return Error::from_errno(EINVAL);
  34. }
  35. ErrorOr<void> SysFSSystemBooleanVariable::truncate(u64 size)
  36. {
  37. if (size != 0)
  38. return EPERM;
  39. return {};
  40. }
  41. }