DevPtsFS.cpp 1.3 KB

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