mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 08:05:07 +00:00

Normally, trying to truncate a SysFSInode should result in EPERM error. However, as suggested by Ali (@alimpfard), we can allow the PowerState node to be "truncated" so one can open that file with O_TRUNC option. Likewise, we also need to provide a way to set modified time on SysFS inodes. For most inodes, we should return ENOTIMPL error, but for the power state switch, we ignore the modified time setting and just return KSuccess. These fixes allow to do "echo -n 1 > /sys/firmware/power_state" in Shell after gaining root permissions, to switch the power state.
38 lines
1 KiB
C++
38 lines
1 KiB
C++
/*
|
|
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/RefPtr.h>
|
|
#include <AK/Types.h>
|
|
#include <AK/Vector.h>
|
|
#include <Kernel/FileSystem/SysFS.h>
|
|
#include <Kernel/Firmware/SysFSFirmware.h>
|
|
#include <Kernel/KBuffer.h>
|
|
#include <Kernel/Memory/MappedROM.h>
|
|
#include <Kernel/Memory/Region.h>
|
|
#include <Kernel/PhysicalAddress.h>
|
|
#include <Kernel/VirtualAddress.h>
|
|
|
|
namespace Kernel {
|
|
|
|
class PowerStateSwitchNode final : public SysFSComponent {
|
|
public:
|
|
static NonnullRefPtr<PowerStateSwitchNode> must_create(FirmwareSysFSDirectory&);
|
|
virtual mode_t permissions() const override;
|
|
virtual KResultOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override;
|
|
virtual KResult truncate(u64) override;
|
|
virtual KResult set_mtime(time_t) { return KSuccess; }
|
|
|
|
private:
|
|
PowerStateSwitchNode(FirmwareSysFSDirectory&);
|
|
|
|
void reboot();
|
|
void poweroff();
|
|
};
|
|
|
|
}
|