mirror of
https://github.com/RGBCube/serenity
synced 2025-05-25 21:05: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:
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;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::close()
|
KResult File::close()
|
||||||
{
|
{
|
||||||
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
int File::ioctl(FileDescription&, unsigned, FlatPtr)
|
int File::ioctl(FileDescription&, unsigned, FlatPtr)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"; }
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue