Просмотр исходного кода

Net: Let Socket have read/write wrappers around sendto/recvfrom

The situations in IPv4Socket and LocalSocket were mirrors of each other
where one had implemented read/write as wrappers and the other had
sendto/recvfrom as wrappers.

Instead of this silliness, move read and write up to the Socket base.
Then mark them final, so subclasses have no choice but to implement
sendto and recvfrom.
Andreas Kling 6 лет назад
Родитель
Сommit
6347e3aa51
6 измененных файлов с 37 добавлено и 47 удалено
  1. 0 10
      Kernel/Net/IPv4Socket.cpp
  2. 0 2
      Kernel/Net/IPv4Socket.h
  3. 23 33
      Kernel/Net/LocalSocket.cpp
  4. 1 2
      Kernel/Net/LocalSocket.h
  5. 10 0
      Kernel/Net/Socket.cpp
  6. 3 0
      Kernel/Net/Socket.h

+ 0 - 10
Kernel/Net/IPv4Socket.cpp

@@ -120,16 +120,6 @@ bool IPv4Socket::can_read(FileDescription& description) const
     return m_can_read;
     return m_can_read;
 }
 }
 
 
-ssize_t IPv4Socket::read(FileDescription& description, u8* buffer, ssize_t size)
-{
-    return recvfrom(description, buffer, size, 0, nullptr, 0);
-}
-
-ssize_t IPv4Socket::write(FileDescription& description, const u8* data, ssize_t size)
-{
-    return sendto(description, data, size, 0, nullptr, 0);
-}
-
 bool IPv4Socket::can_write(FileDescription&) const
 bool IPv4Socket::can_write(FileDescription&) const
 {
 {
     return is_connected();
     return is_connected();

+ 0 - 2
Kernel/Net/IPv4Socket.h

@@ -28,8 +28,6 @@ public:
     virtual void attach(FileDescription&) override;
     virtual void attach(FileDescription&) override;
     virtual void detach(FileDescription&) override;
     virtual void detach(FileDescription&) override;
     virtual bool can_read(FileDescription&) const override;
     virtual bool can_read(FileDescription&) const override;
-    virtual ssize_t read(FileDescription&, u8*, ssize_t) override;
-    virtual ssize_t write(FileDescription&, const u8*, ssize_t) override;
     virtual bool can_write(FileDescription&) const override;
     virtual bool can_write(FileDescription&) const override;
     virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
     virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
     virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;
     virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;

+ 23 - 33
Kernel/Net/LocalSocket.cpp

@@ -163,26 +163,6 @@ bool LocalSocket::can_read(FileDescription& description) const
     ASSERT_NOT_REACHED();
     ASSERT_NOT_REACHED();
 }
 }
 
 
-ssize_t LocalSocket::read(FileDescription& description, u8* buffer, ssize_t size)
-{
-    auto role = description.socket_role();
-    if (role == SocketRole::Accepted) {
-        if (!description.is_blocking()) {
-            if (m_for_server.is_empty())
-                return -EAGAIN;
-        }
-        return m_for_server.read(buffer, size);
-    }
-    if (role == SocketRole::Connected) {
-        if (!description.is_blocking()) {
-            if (m_for_client.is_empty())
-                return -EAGAIN;
-        }
-        return m_for_client.read(buffer, size);
-    }
-    ASSERT_NOT_REACHED();
-}
-
 bool LocalSocket::has_attached_peer(const FileDescription& description) const
 bool LocalSocket::has_attached_peer(const FileDescription& description) const
 {
 {
     if (description.socket_role() == SocketRole::Accepted)
     if (description.socket_role() == SocketRole::Accepted)
@@ -192,17 +172,6 @@ bool LocalSocket::has_attached_peer(const FileDescription& description) const
     ASSERT_NOT_REACHED();
     ASSERT_NOT_REACHED();
 }
 }
 
 
-ssize_t LocalSocket::write(FileDescription& description, const u8* data, ssize_t size)
-{
-    if (!has_attached_peer(description))
-        return -EPIPE;
-    if (description.socket_role() == SocketRole::Accepted)
-        return m_for_client.write(data, size);
-    if (description.socket_role() == SocketRole::Connected)
-        return m_for_server.write(data, size);
-    ASSERT_NOT_REACHED();
-}
-
 bool LocalSocket::can_write(FileDescription& description) const
 bool LocalSocket::can_write(FileDescription& description) const
 {
 {
     if (description.socket_role() == SocketRole::Accepted)
     if (description.socket_role() == SocketRole::Accepted)
@@ -214,10 +183,31 @@ bool LocalSocket::can_write(FileDescription& description) const
 
 
 ssize_t LocalSocket::sendto(FileDescription& description, const void* data, size_t data_size, int, const sockaddr*, socklen_t)
 ssize_t LocalSocket::sendto(FileDescription& description, const void* data, size_t data_size, int, const sockaddr*, socklen_t)
 {
 {
-    return write(description, (const u8*)data, data_size);
+    if (!has_attached_peer(description))
+        return -EPIPE;
+    if (description.socket_role() == SocketRole::Accepted)
+        return m_for_client.write((const u8*)data, data_size);
+    if (description.socket_role() == SocketRole::Connected)
+        return m_for_server.write((const u8*)data, data_size);
+    ASSERT_NOT_REACHED();
 }
 }
 
 
 ssize_t LocalSocket::recvfrom(FileDescription& description, void* buffer, size_t buffer_size, int, sockaddr*, socklen_t*)
 ssize_t LocalSocket::recvfrom(FileDescription& description, void* buffer, size_t buffer_size, int, sockaddr*, socklen_t*)
 {
 {
-    return read(description, (u8*)buffer, buffer_size);
+    auto role = description.socket_role();
+    if (role == SocketRole::Accepted) {
+        if (!description.is_blocking()) {
+            if (m_for_server.is_empty())
+                return -EAGAIN;
+        }
+        return m_for_server.read((u8*)buffer, buffer_size);
+    }
+    if (role == SocketRole::Connected) {
+        if (!description.is_blocking()) {
+            if (m_for_client.is_empty())
+                return -EAGAIN;
+        }
+        return m_for_client.read((u8*)buffer, buffer_size);
+    }
+    ASSERT_NOT_REACHED();
 }
 }

+ 1 - 2
Kernel/Net/LocalSocket.h

@@ -10,6 +10,7 @@ public:
     static NonnullRefPtr<LocalSocket> create(int type);
     static NonnullRefPtr<LocalSocket> create(int type);
     virtual ~LocalSocket() override;
     virtual ~LocalSocket() override;
 
 
+    // ^Socket
     virtual KResult bind(const sockaddr*, socklen_t) override;
     virtual KResult bind(const sockaddr*, socklen_t) override;
     virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
     virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
     virtual bool get_local_address(sockaddr*, socklen_t*) override;
     virtual bool get_local_address(sockaddr*, socklen_t*) override;
@@ -17,8 +18,6 @@ public:
     virtual void attach(FileDescription&) override;
     virtual void attach(FileDescription&) override;
     virtual void detach(FileDescription&) override;
     virtual void detach(FileDescription&) override;
     virtual bool can_read(FileDescription&) const override;
     virtual bool can_read(FileDescription&) const override;
-    virtual ssize_t read(FileDescription&, u8*, ssize_t) override;
-    virtual ssize_t write(FileDescription&, const u8*, ssize_t) override;
     virtual bool can_write(FileDescription&) const override;
     virtual bool can_write(FileDescription&) const override;
     virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
     virtual ssize_t sendto(FileDescription&, const void*, size_t, int, const sockaddr*, socklen_t) override;
     virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;
     virtual ssize_t recvfrom(FileDescription&, void*, size_t, int flags, sockaddr*, socklen_t*) override;

+ 10 - 0
Kernel/Net/Socket.cpp

@@ -146,3 +146,13 @@ String Socket::absolute_path(const FileDescription& description) const
 {
 {
     return String::format("socket:%x (role: %s)", this, to_string(description.socket_role()));
     return String::format("socket:%x (role: %s)", this, to_string(description.socket_role()));
 }
 }
+
+ssize_t Socket::read(FileDescription& description, u8* buffer, ssize_t size)
+{
+    return recvfrom(description, buffer, size, 0, nullptr, 0);
+}
+
+ssize_t Socket::write(FileDescription& description, const u8* data, ssize_t size)
+{
+    return sendto(description, data, size, 0, nullptr, 0);
+}

+ 3 - 0
Kernel/Net/Socket.h

@@ -60,6 +60,9 @@ public:
 
 
     Lock& lock() { return m_lock; }
     Lock& lock() { return m_lock; }
 
 
+    // ^File
+    virtual ssize_t read(FileDescription&, u8*, ssize_t) override final;
+    virtual ssize_t write(FileDescription&, const u8*, ssize_t) override final;
     virtual String absolute_path(const FileDescription&) const override;
     virtual String absolute_path(const FileDescription&) const override;
 
 
 protected:
 protected: