diff --git a/kernel/include/fs/sysfs.hpp b/kernel/include/fs/sysfs.hpp index 51da6597..c1a55838 100644 --- a/kernel/include/fs/sysfs.hpp +++ b/kernel/include/fs/sysfs.hpp @@ -38,9 +38,11 @@ public: }; typedef std::string (*dynamic_fun_t)(); +typedef std::string (*dynamic_fun_data_t)(void* data); void set_constant_value(const path& mount_point, const path& file_path, const std::string& value); void set_dynamic_value(const path& mount_point, const path& file_path, dynamic_fun_t fun); +void set_dynamic_value_data(const path& mount_point, const path& file_path, dynamic_fun_data_t fun, void* data); void delete_value(const path& mount_point, const path& file_path); void delete_folder(const path& mount_point, const path& file_path); diff --git a/kernel/src/fs/sysfs.cpp b/kernel/src/fs/sysfs.cpp index 1cf3127b..fb691dc6 100644 --- a/kernel/src/fs/sysfs.cpp +++ b/kernel/src/fs/sysfs.cpp @@ -21,7 +21,9 @@ namespace { struct sys_value { std::string name; std::string _value; - sysfs::dynamic_fun_t fun = nullptr; + sysfs::dynamic_fun_t fun = nullptr; + sysfs::dynamic_fun_data_t fun_data = nullptr; + void* data = nullptr; sys_value() {} sys_value(std::string name, std::string value) @@ -34,8 +36,15 @@ struct sys_value { //Nothing else to init } + sys_value(std::string name, sysfs::dynamic_fun_data_t fun_data, void* data) + : name(name), fun_data(fun_data), data(data) { + //Nothing else to init + } + std::string value() const { - if (fun) { + if (fun_data){ + return fun_data(data); + } else if (fun) { return fun(); } else { return _value; @@ -195,6 +204,18 @@ void set_value(sys_folder& folder, const std::string& name, sysfs::dynamic_fun_t folder.values.emplace_back(name, fun); } +void set_value(sys_folder& folder, const std::string& name, sysfs::dynamic_fun_data_t fun, void* data) { + for (auto& v : folder.values) { + if (v.name == name) { + v.fun_data = fun; + v.data = data; + return; + } + } + + folder.values.emplace_back(name, fun, data); +} + void delete_value(sys_folder& folder, const std::string& name) { folder.values.erase(std::remove_if(folder.values.begin(), folder.values.end(), [&name](const sys_value& value){ return value.name == name; @@ -333,6 +354,17 @@ void sysfs::set_dynamic_value(const path& mount_point, const path& file_path, dy } } +void sysfs::set_dynamic_value_data(const path& mount_point, const path& file_path, dynamic_fun_data_t fun, void* data) { + auto& root_folder = find_root_folder(mount_point); + + if (file_path.size() == 2) { + ::set_value(root_folder, file_path.base_name(), fun, data); + } else { + auto& folder = find_folder(root_folder, file_path, 1, file_path.size() - 1); + ::set_value(folder, file_path.base_name(), fun, data); + } +} + void sysfs::delete_value(const path& mount_point, const path& file_path) { auto& root_folder = find_root_folder(mount_point);