DevPtsFS.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <Kernel/DevPtsFS.h>
  2. #include <Kernel/SlavePTY.h>
  3. #include <Kernel/VirtualFileSystem.h>
  4. #include <AK/StringBuilder.h>
  5. static DevPtsFS* s_the;
  6. DevPtsFS& DevPtsFS::the()
  7. {
  8. ASSERT(s_the);
  9. return *s_the;
  10. }
  11. RetainPtr<DevPtsFS> DevPtsFS::create()
  12. {
  13. return adopt(*new DevPtsFS);
  14. }
  15. DevPtsFS::DevPtsFS()
  16. {
  17. s_the = this;
  18. }
  19. DevPtsFS::~DevPtsFS()
  20. {
  21. }
  22. bool DevPtsFS::initialize()
  23. {
  24. SynthFS::initialize();
  25. return true;
  26. }
  27. const char* DevPtsFS::class_name() const
  28. {
  29. return "DevPtsFS";
  30. }
  31. RetainPtr<SynthFSInode> DevPtsFS::create_slave_pty_device_file(unsigned index)
  32. {
  33. auto file = adopt(*new SynthFSInode(*this, generate_inode_index()));
  34. StringBuilder builder;
  35. builder.appendf("%u", index);
  36. file->m_name = builder.build();
  37. auto* device = VFS::the().get_device(11, index);
  38. ASSERT(device);
  39. file->m_metadata.size = 0;
  40. file->m_metadata.uid = device->uid();
  41. file->m_metadata.gid = device->gid();
  42. file->m_metadata.mode = 0020644;
  43. file->m_metadata.majorDevice = device->major();
  44. file->m_metadata.minorDevice = device->minor();
  45. file->m_metadata.mtime = mepoch;
  46. return file;
  47. }
  48. void DevPtsFS::register_slave_pty(SlavePTY& slave_pty)
  49. {
  50. InterruptDisabler disabler;
  51. auto inode_id = add_file(create_slave_pty_device_file(slave_pty.index()));
  52. slave_pty.set_devpts_inode_id(inode_id);
  53. }
  54. void DevPtsFS::unregister_slave_pty(SlavePTY& slave_pty)
  55. {
  56. InterruptDisabler disabler;
  57. remove_file(slave_pty.devpts_inode_id().index());
  58. }