1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-25 19:15:06 +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;
}
void File::close()
KResult File::close()
{
return KSuccess;
}
int File::ioctl(FileDescription&, unsigned, FlatPtr)

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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()

View file

@ -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;

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) {
#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;
}
}

View file

@ -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; }

View file

@ -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)

View file

@ -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"; }

View file

@ -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;
}
}

View file

@ -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);