mirror of
https://github.com/RGBCube/serenity
synced 2025-05-25 16:05: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:
parent
d4ddb0013c
commit
1b4e88fb59
12 changed files with 23 additions and 15 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"; }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue