1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 05:48:12 +00:00

Kernel: Port stat() to KResult/KResultOr<T>.

This commit is contained in:
Andreas Kling 2019-03-02 00:11:08 +01:00
parent f75eb9af16
commit 37f6844c6c
5 changed files with 31 additions and 40 deletions

View file

@ -112,30 +112,30 @@ bool addition_would_overflow(off_t a, off_t b)
return (ua + b) > maxFileOffset; return (ua + b) > maxFileOffset;
} }
int FileDescriptor::fstat(stat* buffer) KResult FileDescriptor::fstat(stat& buffer)
{ {
ASSERT(!is_fifo()); ASSERT(!is_fifo());
if (!m_inode && !m_device) if (!m_inode && !m_device)
return -EBADF; return KResult(-EBADF);
auto metadata = this->metadata(); auto metadata = this->metadata();
if (!metadata.is_valid()) if (!metadata.is_valid())
return -EIO; return KResult(-EIO);
buffer->st_rdev = encoded_device(metadata.major_device, metadata.minor_device); buffer.st_rdev = encoded_device(metadata.major_device, metadata.minor_device);
buffer->st_ino = metadata.inode.index(); buffer.st_ino = metadata.inode.index();
buffer->st_mode = metadata.mode; buffer.st_mode = metadata.mode;
buffer->st_nlink = metadata.link_count; buffer.st_nlink = metadata.link_count;
buffer->st_uid = metadata.uid; buffer.st_uid = metadata.uid;
buffer->st_gid = metadata.gid; buffer.st_gid = metadata.gid;
buffer->st_dev = 0; // FIXME buffer.st_dev = 0; // FIXME
buffer->st_size = metadata.size; buffer.st_size = metadata.size;
buffer->st_blksize = metadata.block_size; buffer.st_blksize = metadata.block_size;
buffer->st_blocks = metadata.block_count; buffer.st_blocks = metadata.block_count;
buffer->st_atime = metadata.atime; buffer.st_atime = metadata.atime;
buffer->st_mtime = metadata.mtime; buffer.st_mtime = metadata.mtime;
buffer->st_ctime = metadata.ctime; buffer.st_ctime = metadata.ctime;
return 0; return KSuccess;
} }
KResult FileDescriptor::fchmod(mode_t mode) KResult FileDescriptor::fchmod(mode_t mode)

View file

@ -32,7 +32,7 @@ public:
off_t seek(off_t, int whence); off_t seek(off_t, int whence);
ssize_t read(Process&, byte*, ssize_t); ssize_t read(Process&, byte*, ssize_t);
ssize_t write(Process&, const byte* data, ssize_t); ssize_t write(Process&, const byte* data, ssize_t);
int fstat(stat*); KResult fstat(stat&);
KResult fchmod(mode_t); KResult fchmod(mode_t);

View file

@ -1219,27 +1219,21 @@ int Process::sys$fstat(int fd, stat* statbuf)
auto* descriptor = file_descriptor(fd); auto* descriptor = file_descriptor(fd);
if (!descriptor) if (!descriptor)
return -EBADF; return -EBADF;
return descriptor->fstat(statbuf); return descriptor->fstat(*statbuf);
} }
int Process::sys$lstat(const char* path, stat* statbuf) int Process::sys$lstat(const char* path, stat* statbuf)
{ {
if (!validate_write_typed(statbuf)) if (!validate_write_typed(statbuf))
return -EFAULT; return -EFAULT;
int error; return VFS::the().stat(String(path), O_NOFOLLOW_NOERROR, cwd_inode(), *statbuf);
if (!VFS::the().stat(move(path), error, O_NOFOLLOW_NOERROR, cwd_inode(), *statbuf))
return error;
return 0;
} }
int Process::sys$stat(const char* path, stat* statbuf) int Process::sys$stat(const char* path, stat* statbuf)
{ {
if (!validate_write_typed(statbuf)) if (!validate_write_typed(statbuf))
return -EFAULT; return -EFAULT;
int error; return VFS::the().stat(String(path), O_NOFOLLOW_NOERROR, cwd_inode(), *statbuf);
if (!VFS::the().stat(move(path), error, 0, cwd_inode(), *statbuf))
return error;
return 0;
} }
int Process::sys$readlink(const char* path, char* buffer, ssize_t size) int Process::sys$readlink(const char* path, char* buffer, ssize_t size)

View file

@ -151,15 +151,12 @@ KResult VFS::utime(const String& path, Inode& base, time_t atime, time_t mtime)
return KSuccess; return KSuccess;
} }
bool VFS::stat(const String& path, int& error, int options, Inode& base, struct stat& statbuf) KResult VFS::stat(const String& path, int options, Inode& base, struct stat& statbuf)
{ {
auto inode_id = old_resolve_path(path, base.identifier(), error, options); auto inode_or_error = resolve_path_to_inode(path, base, nullptr, options);
if (!inode_id.is_valid()) if (inode_or_error.is_error())
return false; return inode_or_error.error();
error = FileDescriptor::create(get_inode(inode_id))->fstat(&statbuf); return FileDescriptor::create(inode_or_error.value().ptr())->fstat(statbuf);
if (error)
return false;
return true;
} }
RetainPtr<FileDescriptor> VFS::open(const String& path, int& error, int options, mode_t mode, Inode& base) RetainPtr<FileDescriptor> VFS::open(const String& path, int& error, int options, mode_t mode, Inode& base)
@ -356,19 +353,19 @@ KResult VFS::chown(const String& path, uid_t a_uid, gid_t a_gid, Inode& base)
return inode->chown(new_uid, new_gid); return inode->chown(new_uid, new_gid);
} }
KResultOr<RetainPtr<Inode>> VFS::resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_inode) KResultOr<Retained<Inode>> VFS::resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_inode, int options)
{ {
// FIXME: This won't work nicely across mount boundaries. // FIXME: This won't work nicely across mount boundaries.
FileSystemPath p(path); FileSystemPath p(path);
if (!p.is_valid()) if (!p.is_valid())
return KResult(-EINVAL); return KResult(-EINVAL);
InodeIdentifier parent_id; InodeIdentifier parent_id;
auto result = resolve_path(path, base.identifier(), 0, &parent_id); auto result = resolve_path(path, base.identifier(), options, &parent_id);
if (parent_inode && parent_id.is_valid()) if (parent_inode && parent_id.is_valid())
*parent_inode = get_inode(parent_id); *parent_inode = get_inode(parent_id);
if (result.is_error()) if (result.is_error())
return result.error(); return result.error();
return get_inode(result.value()); return Retained<Inode>(*get_inode(result.value()));
} }
RetainPtr<Inode> VFS::resolve_path_to_inode(const String& path, Inode& base, int& error, RetainPtr<Inode>* parent_inode) RetainPtr<Inode> VFS::resolve_path_to_inode(const String& path, Inode& base, int& error, RetainPtr<Inode>* parent_inode)

View file

@ -73,7 +73,7 @@ public:
KResult chmod(Inode&, mode_t); KResult chmod(Inode&, mode_t);
KResult chown(const String& path, uid_t, gid_t, Inode& base); KResult chown(const String& path, uid_t, gid_t, Inode& base);
KResult access(const String& path, int mode, Inode& base); KResult access(const String& path, int mode, Inode& base);
bool stat(const String& path, int& error, int options, Inode& base, struct stat&); KResult stat(const String& path, int options, Inode& base, struct stat&);
KResult utime(const String& path, Inode& base, time_t atime, time_t mtime); KResult utime(const String& path, Inode& base, time_t atime, time_t mtime);
KResultOr<Retained<Inode>> open_directory(const String& path, Inode& base); KResultOr<Retained<Inode>> open_directory(const String& path, Inode& base);
@ -105,7 +105,7 @@ private:
InodeIdentifier old_resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr); InodeIdentifier old_resolve_path(const String& path, InodeIdentifier base, int& error, int options = 0, InodeIdentifier* parent_id = nullptr);
KResultOr<InodeIdentifier> resolve_path(const String& path, InodeIdentifier base, int options = 0, InodeIdentifier* parent_id = nullptr); KResultOr<InodeIdentifier> resolve_path(const String& path, InodeIdentifier base, int options = 0, InodeIdentifier* parent_id = nullptr);
RetainPtr<Inode> resolve_path_to_inode(const String& path, Inode& base, int& error, RetainPtr<Inode>* parent_id = nullptr); RetainPtr<Inode> resolve_path_to_inode(const String& path, Inode& base, int& error, RetainPtr<Inode>* parent_id = nullptr);
KResultOr<RetainPtr<Inode>> resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_id = nullptr); KResultOr<Retained<Inode>> resolve_path_to_inode(const String& path, Inode& base, RetainPtr<Inode>* parent_id = nullptr, int options = 0);
KResultOr<InodeIdentifier> resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode); KResultOr<InodeIdentifier> resolve_symbolic_link(InodeIdentifier base, Inode& symlink_inode);
Mount* find_mount_for_host(InodeIdentifier); Mount* find_mount_for_host(InodeIdentifier);