Browse Source

Kernel: Allow File::close() to fail

And pass the result through to sys$close() return value.

Fixes https://github.com/SerenityOS/serenity/issues/427
Sergey Bugaev 5 năm trước cách đây
mục cha
commit
1b4e88fb59

+ 2 - 1
Kernel/FileSystem/File.cpp

@@ -46,8 +46,9 @@ KResultOr<NonnullRefPtr<FileDescription>> File::open(int options)
     return description;
 }
 
-void File::close()
+KResult File::close()
 {
+    return KSuccess;
 }
 
 int File::ioctl(FileDescription&, unsigned, FlatPtr)

+ 1 - 1
Kernel/FileSystem/File.h

@@ -69,7 +69,7 @@ public:
     virtual ~File();
 
     virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options);
-    virtual void close();
+    virtual KResult close();
 
     virtual bool can_read(const FileDescription&, size_t) const = 0;
     virtual bool can_write(const FileDescription&, size_t) const = 0;

+ 4 - 2
Kernel/FileSystem/FileDescription.cpp

@@ -256,9 +256,11 @@ MasterPTY* FileDescription::master_pty()
     return static_cast<MasterPTY*>(m_file.ptr());
 }
 
-int FileDescription::close()
+KResult FileDescription::close()
 {
-    return 0;
+    if (m_file->ref_count() > 1)
+        return KSuccess;
+    return m_file->close();
 }
 
 String FileDescription::absolute_path() const

+ 1 - 1
Kernel/FileSystem/FileDescription.h

@@ -65,7 +65,7 @@ public:
         set_writable(options & O_WRONLY);
     }
 
-    int close();
+    KResult close();
 
     off_t seek(off_t, int whence);
     ssize_t read(u8*, ssize_t);

+ 3 - 2
Kernel/Net/IPv4Socket.cpp

@@ -564,9 +564,10 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
     return -EINVAL;
 }
 
-void IPv4Socket::close()
+KResult IPv4Socket::close()
 {
-    shutdown(SHUT_RDWR);
+    (void)shutdown(SHUT_RDWR);
+    return KSuccess;
 }
 
 void IPv4Socket::shut_down_for_reading()

+ 1 - 1
Kernel/Net/IPv4Socket.h

@@ -48,7 +48,7 @@ public:
 
     static Lockable<HashTable<IPv4Socket*>>& all_sockets();
 
-    virtual void close() override;
+    virtual KResult close() override;
     virtual KResult bind(const sockaddr*, socklen_t) override;
     virtual KResult connect(FileDescription&, const sockaddr*, socklen_t, ShouldBlock = ShouldBlock::Yes) override;
     virtual KResult listen(size_t) override;

+ 3 - 2
Kernel/Net/TCPSocket.cpp

@@ -440,9 +440,9 @@ void TCPSocket::shut_down_for_writing()
     }
 }
 
-void TCPSocket::close()
+KResult TCPSocket::close()
 {
-    IPv4Socket::close();
+    auto result = IPv4Socket::close();
     if (state() == State::CloseWait) {
 #ifdef TCP_SOCKET_DEBUG
         dbg() << " Sending FIN from CloseWait and moving into LastAck";
@@ -453,6 +453,7 @@ void TCPSocket::close()
 
     LOCKER(closing_sockets().lock());
     closing_sockets().resource().set(tuple(), *this);
+    return result;
 }
 
 }

+ 1 - 1
Kernel/Net/TCPSocket.h

@@ -165,7 +165,7 @@ public:
     void release_to_originator();
     void release_for_accept(RefPtr<TCPSocket>);
 
-    virtual void close() override;
+    virtual KResult close() override;
 
 protected:
     void set_direction(Direction direction) { m_direction = direction; }

+ 3 - 1
Kernel/TTY/MasterPTY.cpp

@@ -112,7 +112,7 @@ bool MasterPTY::can_write_from_slave() const
     return m_buffer.space_for_writing();
 }
 
-void MasterPTY::close()
+KResult MasterPTY::close()
 {
     if (ref_count() == 2) {
         InterruptDisabler disabler;
@@ -122,6 +122,8 @@ void MasterPTY::close()
 
         m_slave->hang_up();
     }
+
+    return KSuccess;
 }
 
 int MasterPTY::ioctl(FileDescription& description, unsigned request, FlatPtr arg)

+ 1 - 1
Kernel/TTY/MasterPTY.h

@@ -54,7 +54,7 @@ private:
     virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override;
     virtual bool can_read(const FileDescription&, size_t) const override;
     virtual bool can_write(const FileDescription&, size_t) const override;
-    virtual void close() override;
+    virtual KResult close() override;
     virtual bool is_master_pty() const override { return true; }
     virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override;
     virtual const char* class_name() const override { return "MasterPTY"; }

+ 2 - 1
Kernel/TTY/SlavePTY.cpp

@@ -95,9 +95,10 @@ ssize_t SlavePTY::read(FileDescription& description, size_t offset, u8* buffer,
     return TTY::read(description, offset, buffer, size);
 }
 
-void SlavePTY::close()
+KResult SlavePTY::close()
 {
     m_master->notify_slave_closed({});
+    return KSuccess;
 }
 
 }

+ 1 - 1
Kernel/TTY/SlavePTY.h

@@ -51,7 +51,7 @@ private:
     virtual ssize_t read(FileDescription&, size_t, u8*, ssize_t) override;
     virtual bool can_write(const FileDescription&, size_t) const override;
     virtual const char* class_name() const override { return "SlavePTY"; }
-    virtual void close() override;
+    virtual KResult close() override;
 
     friend class MasterPTY;
     SlavePTY(MasterPTY&, unsigned index);