From d93e356b51b16863c34331ebf7a5fc4792a9ea69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 10 May 2004 14:36:05 +0000 Subject: [PATCH] Changed the "stat" related syscalls to have an additional parameter that specified the size of the stat structure to allow extensions of that structure. Renamed those syscalls to the new naming scheme. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7496 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/libroot/os/fs_attr.c | 2 +- src/kernel/libroot/os/syscalls.S | 8 +-- src/kernel/libroot/posix/sys/chmod.c | 6 +- src/kernel/libroot/posix/sys/stat.c | 64 +++++++++++++++++----- src/kernel/libroot/posix/unistd/chown.c | 11 ++-- src/kernel/libroot/posix/unistd/truncate.c | 6 +- src/kernel/libroot/posix/utime.c | 5 +- 7 files changed, 71 insertions(+), 31 deletions(-) diff --git a/src/kernel/libroot/os/fs_attr.c b/src/kernel/libroot/os/fs_attr.c index e71edc3145..944b1ea55e 100644 --- a/src/kernel/libroot/os/fs_attr.c +++ b/src/kernel/libroot/os/fs_attr.c @@ -80,7 +80,7 @@ fs_stat_attr(int fd, const char *attribute, struct attr_info *attrInfo) if (attr < 0) RETURN_AND_SET_ERRNO(attr); - status = sys_read_stat(attr, &stat); + status = _kern_read_stat(attr, &stat, sizeof(struct stat)); if (status == B_OK) { attrInfo->type = stat.st_type; attrInfo->size = stat.st_size; diff --git a/src/kernel/libroot/os/syscalls.S b/src/kernel/libroot/os/syscalls.S index e0ab690d57..3b5b5b2977 100644 --- a/src/kernel/libroot/os/syscalls.S +++ b/src/kernel/libroot/os/syscalls.S @@ -56,10 +56,10 @@ SYSCALL6(sys_create_entry_ref, 84) SYSCALL1(sys_unlink, 12) SYSCALL2(sys_rename, 13) SYSCALL2(sys_access, 73); -SYSCALL2(sys_read_stat, 74) -SYSCALL3(sys_write_stat, 100) -SYSCALL3(sys_read_path_stat, 14) -SYSCALL4(sys_write_path_stat, 15) +SYSCALL3(_kern_read_stat, 74) +SYSCALL4(_kern_write_stat, 100) +SYSCALL4(_kern_read_path_stat, 14) +SYSCALL5(_kern_write_path_stat, 15) SYSCALL2(sys_getcwd, 41) SYSCALL2(sys_setcwd, 42) SYSCALL1(sys_dup, 61) diff --git a/src/kernel/libroot/posix/sys/chmod.c b/src/kernel/libroot/posix/sys/chmod.c index e15b918b96..282fab4d27 100644 --- a/src/kernel/libroot/posix/sys/chmod.c +++ b/src/kernel/libroot/posix/sys/chmod.c @@ -1,5 +1,5 @@ /* -** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. ** Distributed under the terms of the OpenBeOS License. */ @@ -24,7 +24,7 @@ chmod(const char *path, mode_t mode) status_t status; stat.st_mode = mode; - status = sys_write_path_stat(path, true, &stat, FS_WRITE_STAT_MODE); + status = _kern_write_path_stat(path, true, &stat, sizeof(struct stat), FS_WRITE_STAT_MODE); RETURN_AND_SET_ERRNO(status); } @@ -37,7 +37,7 @@ fchmod(int fd, mode_t mode) status_t status; stat.st_mode = mode; - status = sys_write_stat(fd, &stat, FS_WRITE_STAT_MODE); + status = _kern_write_stat(fd, &stat, sizeof(struct stat), FS_WRITE_STAT_MODE); RETURN_AND_SET_ERRNO(status); } diff --git a/src/kernel/libroot/posix/sys/stat.c b/src/kernel/libroot/posix/sys/stat.c index 773d3f9a2a..47ea57faa9 100644 --- a/src/kernel/libroot/posix/sys/stat.c +++ b/src/kernel/libroot/posix/sys/stat.c @@ -1,5 +1,5 @@ /* -** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. ** Distributed under the terms of the OpenBeOS License. */ @@ -17,28 +17,64 @@ return err; +// R5 compatibility + +#define R5_STAT_SIZE 60 +#undef stat +#undef fstat +#undef lstat + +extern int stat(const char *path, struct stat *stat); +extern int fstat(int fd, struct stat *stat); +extern int lstat(const char *path, struct stat *stat); + + int stat(const char *path, struct stat *stat) { - int status = sys_read_path_stat(path, true, stat); - - RETURN_AND_SET_ERRNO(status); -} - - -int -lstat(const char *path, struct stat *stat) -{ - int status = sys_read_path_stat(path, false, stat); - - RETURN_AND_SET_ERRNO(status); + return _stat(path, stat, R5_STAT_SIZE); } int fstat(int fd, struct stat *stat) { - int status = sys_read_stat(fd, stat); + return _fstat(fd, stat, R5_STAT_SIZE); +} + + +int +lstat(const char *path, struct stat *stat) +{ + return _lstat(path, stat, R5_STAT_SIZE); +} + + +// #pragma mark - + + +int +_stat(const char *path, struct stat *stat, size_t statSize) +{ + int status = _kern_read_path_stat(path, true, stat, statSize); + + RETURN_AND_SET_ERRNO(status); +} + + +int +_lstat(const char *path, struct stat *stat, size_t statSize) +{ + int status = _kern_read_path_stat(path, false, stat, statSize); + + RETURN_AND_SET_ERRNO(status); +} + + +int +_fstat(int fd, struct stat *stat, size_t statSize) +{ + int status = _kern_read_stat(fd, stat, statSize); RETURN_AND_SET_ERRNO(status); } diff --git a/src/kernel/libroot/posix/unistd/chown.c b/src/kernel/libroot/posix/unistd/chown.c index d612095711..84681ed12c 100644 --- a/src/kernel/libroot/posix/unistd/chown.c +++ b/src/kernel/libroot/posix/unistd/chown.c @@ -1,5 +1,5 @@ /* -** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. ** Distributed under the terms of the OpenBeOS License. */ @@ -25,7 +25,8 @@ chown(const char *path, uid_t owner, gid_t group) stat.st_uid = owner; stat.st_gid = group; - status = sys_write_path_stat(path, true, &stat, FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); + status = _kern_write_path_stat(path, true, &stat, sizeof(struct stat), + FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); RETURN_AND_SET_ERRNO(status); } @@ -39,7 +40,8 @@ lchown(const char *path, uid_t owner, gid_t group) stat.st_uid = owner; stat.st_gid = group; - status = sys_write_path_stat(path, false, &stat, FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); + status = _kern_write_path_stat(path, false, &stat, sizeof(struct stat), + FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); RETURN_AND_SET_ERRNO(status); } @@ -53,7 +55,8 @@ fchown(int fd, uid_t owner, gid_t group) stat.st_uid = owner; stat.st_gid = group; - status = sys_write_stat(fd, &stat, FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); + status = _kern_write_stat(fd, &stat, sizeof(struct stat), + FS_WRITE_STAT_UID | FS_WRITE_STAT_GID); RETURN_AND_SET_ERRNO(status); } diff --git a/src/kernel/libroot/posix/unistd/truncate.c b/src/kernel/libroot/posix/unistd/truncate.c index 9442affb61..fd2b1ad25e 100644 --- a/src/kernel/libroot/posix/unistd/truncate.c +++ b/src/kernel/libroot/posix/unistd/truncate.c @@ -1,5 +1,5 @@ /* -** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. ** Distributed under the terms of the OpenBeOS License. */ @@ -24,7 +24,7 @@ truncate(const char *path, off_t newSize) status_t status; stat.st_size = newSize; - status = sys_write_path_stat(path, true, &stat, FS_WRITE_STAT_SIZE); + status = _kern_write_path_stat(path, true, &stat, sizeof(struct stat), FS_WRITE_STAT_SIZE); RETURN_AND_SET_ERRNO(status); } @@ -37,7 +37,7 @@ ftruncate(int fd, off_t newSize) status_t status; stat.st_size = newSize; - status = sys_write_stat(fd, &stat, FS_WRITE_STAT_SIZE); + status = _kern_write_stat(fd, &stat, sizeof(struct stat), FS_WRITE_STAT_SIZE); RETURN_AND_SET_ERRNO(status); } diff --git a/src/kernel/libroot/posix/utime.c b/src/kernel/libroot/posix/utime.c index 1e5f2d3941..daf4c6c8a9 100644 --- a/src/kernel/libroot/posix/utime.c +++ b/src/kernel/libroot/posix/utime.c @@ -1,5 +1,5 @@ /* -** Copyright 2002, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Copyright 2002-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. ** Distributed under the terms of the OpenBeOS License. */ @@ -30,7 +30,8 @@ utime(const char *path, const struct utimbuf *times) } else stat.st_atime = stat.st_mtime = time(NULL); - status = sys_write_path_stat(path, true, &stat, FS_WRITE_STAT_MTIME | FS_WRITE_STAT_ATIME); + status = _kern_write_path_stat(path, true, &stat, sizeof(struct stat), + FS_WRITE_STAT_MTIME | FS_WRITE_STAT_ATIME); RETURN_AND_SET_ERRNO(status); }