DevPtsFS.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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.to_string();
  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.major_device = device->major();
  44. file->m_metadata.minor_device = device->minor();
  45. file->m_metadata.mtime = mepoch;
  46. return file;
  47. }
  48. void DevPtsFS::register_slave_pty(SlavePTY& slave_pty)
  49. {
  50. auto inode_id = add_file(create_slave_pty_device_file(slave_pty.index()));
  51. slave_pty.set_devpts_inode_id(inode_id);
  52. }
  53. void DevPtsFS::unregister_slave_pty(SlavePTY& slave_pty)
  54. {
  55. remove_file(slave_pty.devpts_inode_id().index());
  56. }