1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-25 21:35:07 +00:00

Kernel: Allow File::close() to fail

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

Fixes https://github.com/SerenityOS/serenity/issues/427
This commit is contained in:
Sergey Bugaev 2020-06-02 19:20:05 +03:00 committed by Andreas Kling
parent d4ddb0013c
commit 1b4e88fb59
12 changed files with 23 additions and 15 deletions

View file

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

View file

@ -69,7 +69,7 @@ public:
virtual ~File(); virtual ~File();
virtual KResultOr<NonnullRefPtr<FileDescription>> open(int options); 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_read(const FileDescription&, size_t) const = 0;
virtual bool can_write(const FileDescription&, size_t) const = 0; virtual bool can_write(const FileDescription&, size_t) const = 0;

View file

@ -256,9 +256,11 @@ MasterPTY* FileDescription::master_pty()
return static_cast<MasterPTY*>(m_file.ptr()); 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 String FileDescription::absolute_path() const

View file

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

View file

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

View file

@ -48,7 +48,7 @@ public:
static Lockable<HashTable<IPv4Socket*>>& all_sockets(); static Lockable<HashTable<IPv4Socket*>>& all_sockets();
virtual void close() override; virtual KResult close() override;
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 KResult listen(size_t) override; virtual KResult listen(size_t) override;

View file

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

View file

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

View file

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

View file

@ -54,7 +54,7 @@ private:
virtual ssize_t write(FileDescription&, size_t, const u8*, ssize_t) override; 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_read(const FileDescription&, size_t) const override;
virtual bool can_write(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 bool is_master_pty() const override { return true; }
virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override; virtual int ioctl(FileDescription&, unsigned request, FlatPtr arg) override;
virtual const char* class_name() const override { return "MasterPTY"; } virtual const char* class_name() const override { return "MasterPTY"; }

View file

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

View file

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