소스 검색

Kernel: More work on sockets. Getting there..

Andreas Kling 6 년 전
부모
커밋
b12ab1270a
3개의 변경된 파일22개의 추가작업 그리고 7개의 파일을 삭제
  1. 4 3
      Kernel/FileDescriptor.cpp
  2. 6 2
      Kernel/FileDescriptor.h
  3. 12 2
      Kernel/Process.cpp

+ 4 - 3
Kernel/FileDescriptor.cpp

@@ -19,9 +19,9 @@ RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<CharacterDevice>&& de
     return adopt(*new FileDescriptor(move(device)));
 }
 
-RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<Socket>&& socket)
+RetainPtr<FileDescriptor> FileDescriptor::create(RetainPtr<Socket>&& socket, SocketRole role)
 {
-    return adopt(*new FileDescriptor(move(socket)));
+    return adopt(*new FileDescriptor(move(socket), role));
 }
 
 RetainPtr<FileDescriptor> FileDescriptor::create_pipe_writer(FIFO& fifo)
@@ -44,8 +44,9 @@ FileDescriptor::FileDescriptor(RetainPtr<CharacterDevice>&& device)
 {
 }
 
-FileDescriptor::FileDescriptor(RetainPtr<Socket>&& socket)
+FileDescriptor::FileDescriptor(RetainPtr<Socket>&& socket, SocketRole role)
     : m_socket(move(socket))
+    , m_socket_role(role)
 {
 }
 

+ 6 - 2
Kernel/FileDescriptor.h

@@ -13,9 +13,12 @@ class MasterPTY;
 class Process;
 class Socket;
 
+enum class SocketRole { None, Accepted, Connected };
+
 class FileDescriptor : public Retainable<FileDescriptor> {
 public:
-    static RetainPtr<FileDescriptor> create(RetainPtr<Socket>&&);
+
+    static RetainPtr<FileDescriptor> create(RetainPtr<Socket>&&, SocketRole = SocketRole::None);
     static RetainPtr<FileDescriptor> create(RetainPtr<Inode>&&);
     static RetainPtr<FileDescriptor> create(RetainPtr<CharacterDevice>&&);
     static RetainPtr<FileDescriptor> create_pipe_writer(FIFO&);
@@ -79,7 +82,7 @@ public:
 
 private:
     friend class VFS;
-    explicit FileDescriptor(RetainPtr<Socket>&&);
+    FileDescriptor(RetainPtr<Socket>&&, SocketRole);
     explicit FileDescriptor(RetainPtr<Inode>&&);
     explicit FileDescriptor(RetainPtr<CharacterDevice>&&);
     FileDescriptor(FIFO&, FIFO::Direction);
@@ -95,6 +98,7 @@ private:
     dword m_file_flags { 0 };
 
     RetainPtr<Socket> m_socket;
+    SocketRole m_socket_role { SocketRole::None };
 
     RetainPtr<FIFO> m_fifo;
     FIFO::Direction m_fifo_direction { FIFO::Neither };

+ 12 - 2
Kernel/Process.cpp

@@ -2303,6 +2303,13 @@ int Process::sys$accept(int sockfd, sockaddr* address, socklen_t* address_size)
         return -EFAULT;
     if (!validate_write(address, *address_size))
         return -EFAULT;
+    if (number_of_open_file_descriptors() >= m_max_open_file_descriptors)
+        return -EMFILE;
+    int fd = 0;
+    for (; fd < (int)m_max_open_file_descriptors; ++fd) {
+        if (!m_fds[fd])
+            break;
+    }
     auto* descriptor = file_descriptor(sockfd);
     if (!descriptor)
         return -EBADF;
@@ -2315,8 +2322,11 @@ int Process::sys$accept(int sockfd, sockaddr* address, socklen_t* address_size)
     }
     auto client = socket.accept();
     ASSERT(client);
-    client->get_address(address, address_size);
-    return 0;
+    bool success = client->get_address(address, address_size);
+    ASSERT(success);
+    auto client_descriptor = FileDescriptor::create(move(client), SocketRole::Accepted);
+    m_fds[fd].set(move(client_descriptor));
+    return fd;
 }
 
 int Process::sys$connect(int sockfd, const sockaddr*, socklen_t)