diff --git a/Kernel/core/driver/daemon.cpp b/Kernel/core/driver/daemon.cpp index 1f662843..d8813515 100644 --- a/Kernel/core/driver/daemon.cpp +++ b/Kernel/core/driver/daemon.cpp @@ -747,6 +747,43 @@ namespace Driver ReturnLogError(-1, "No available slots for device %d", DriverID); } + dev_t Manager::CreateDeviceFile(dev_t DriverID, const char *name, mode_t mode, const InodeOperations *Operations) + { + std::unordered_map &drivers = DriverManager->GetDrivers(); + const auto it = drivers.find(DriverID); + if (it == drivers.end()) + ReturnLogError(-EINVAL, "Driver %d not found", DriverID); + const Driver::DriverObject *drv = &it->second; + + auto dop = drv->DeviceOperations; + for (size_t i = 0; i < 128; i++) + { + const auto dOps = dop->find(i); + if (dOps != dop->end()) + continue; + + FileNode *node = fs->GetByPath(name, devNode); + if (node) + ReturnLogError(-EEXIST, "Device file %s already exists", name); + + node = fs->Create(devNode, name, mode); + if (node == nullptr) + ReturnLogError(-ENOMEM, "Failed to create device file %s", name); + + node->Node->SetDevice(DriverID, i); + + DriverHandlers dh{}; + dh.Ops = Operations; + dh.Node = node->Node; + dh.InputReports = new RingBuffer(16); + dop->insert({i, std::move(dh)}); + return i; + } + + ReturnLogError(-1, "No available slots for device %d", DriverID); + return -1; /* -Werror=return-type */ + } + int Manager::UnregisterDevice(dev_t DriverID, dev_t Device) { std::unordered_map &drivers = diff --git a/Kernel/include/driver.hpp b/Kernel/include/driver.hpp index 8a4d1c74..6bb77f8a 100644 --- a/Kernel/include/driver.hpp +++ b/Kernel/include/driver.hpp @@ -149,6 +149,8 @@ namespace Driver */ dev_t CreateIncrementalDevice(dev_t DriverID, const std::string &Prefix, mode_t Mode, InodeOperations *Ops); + dev_t CreateDeviceFile(dev_t DriverID, const char *name, mode_t mode, const InodeOperations *Operations); + dev_t RegisterDevice(dev_t DriverID, DeviceType Type, const InodeOperations *Operations); int ReportInputEvent(dev_t DriverID, InputReport *Report);