forked from Bananymous/banan-os
				
			Kernel: Implement SYS_FSTAT
This commit is contained in:
		
							parent
							
								
									24f0d26fce
								
							
						
					
					
						commit
						52c4eebd77
					
				|  | @ -128,9 +128,9 @@ namespace Kernel | ||||||
| 		return ret.value(); | 		return ret.value(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	long sys_stat(const char* path, struct stat* buf, int flags) | 	long sys_fstat(int fd, struct stat* buf) | ||||||
| 	{ | 	{ | ||||||
| 		auto ret = Process::current().stat(path, buf, flags); | 		auto ret = Process::current().fstat(fd, buf); | ||||||
| 		if (ret.is_error()) | 		if (ret.is_error()) | ||||||
| 			return -ret.error().get_error_code(); | 			return -ret.error().get_error_code(); | ||||||
| 		return 0; | 		return 0; | ||||||
|  | @ -217,8 +217,8 @@ namespace Kernel | ||||||
| 		case SYS_WAIT: | 		case SYS_WAIT: | ||||||
| 			ret = sys_wait((pid_t)arg1, (int*)arg2, (int)arg3); | 			ret = sys_wait((pid_t)arg1, (int*)arg2, (int)arg3); | ||||||
| 			break; | 			break; | ||||||
| 		case SYS_STAT: | 		case SYS_FSTAT: | ||||||
| 			ret = sys_stat((const char*)arg1, (struct stat*)arg2, (int)arg3); | 			ret = sys_fstat((int)arg1, (struct stat*)arg2); | ||||||
| 			break; | 			break; | ||||||
| 		case SYS_SETENVP: | 		case SYS_SETENVP: | ||||||
| 			ret = sys_setenvp((char**)arg1); | 			ret = sys_setenvp((char**)arg1); | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ __BEGIN_DECLS | ||||||
| #define SYS_EXEC 15 | #define SYS_EXEC 15 | ||||||
| #define SYS_REALLOC 16 | #define SYS_REALLOC 16 | ||||||
| #define SYS_WAIT 17 | #define SYS_WAIT 17 | ||||||
| #define SYS_STAT 18 | #define SYS_FSTAT 18 | ||||||
| #define SYS_SETENVP 19 | #define SYS_SETENVP 19 | ||||||
| #define SYS_READ_DIR_ENTRIES 20 | #define SYS_READ_DIR_ENTRIES 20 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,14 +1,46 @@ | ||||||
|  | #include <errno.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <sys/stat.h> | #include <sys/stat.h> | ||||||
| #include <sys/syscall.h> | #include <sys/syscall.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| 
 | 
 | ||||||
|  | int fstat(int fildes, struct stat* buf) | ||||||
|  | { | ||||||
|  | 	return syscall(SYS_FSTAT, fildes, buf); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int fstatat(int fd, const char* __restrict path, struct stat* __restrict buf, int flag) | ||||||
|  | { | ||||||
|  | 	if (flag & ~AT_SYMLINK_NOFOLLOW) | ||||||
|  | 	{ | ||||||
|  | 		errno = EINVAL; | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int target = openat(fd, path, (flag & AT_SYMLINK_NOFOLLOW) ? O_NOFOLLOW : 0); | ||||||
|  | 	if (target == -1) | ||||||
|  | 		return -1; | ||||||
|  | 	int ret = fstat(target, buf); | ||||||
|  | 	close(target); | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int lstat(const char* __restrict path, struct stat* __restrict buf) | int lstat(const char* __restrict path, struct stat* __restrict buf) | ||||||
| { | { | ||||||
|     return syscall(SYS_STAT, path, buf, O_RDONLY | O_NOFOLLOW); | 	int fd = open(path, O_SEARCH | O_NOFOLLOW); | ||||||
|  | 	if (fd == -1) | ||||||
|  | 		return -1; | ||||||
|  | 	int ret = fstat(fd, buf); | ||||||
|  | 	close(fd); | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int stat(const char* __restrict path, struct stat* __restrict buf) | int stat(const char* __restrict path, struct stat* __restrict buf) | ||||||
| { | { | ||||||
|     return syscall(SYS_STAT, path, buf, O_RDONLY); | 	int fd = open(path, O_SEARCH); | ||||||
|  | 	if (fd == -1) | ||||||
|  | 		return -1; | ||||||
|  | 	int ret = fstat(fd, buf); | ||||||
|  | 	close(fd); | ||||||
|  | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -149,12 +149,11 @@ long syscall(long syscall, ...) | ||||||
| 			ret = Kernel::syscall(SYS_WAIT, pid, (uintptr_t)stat_loc, options); | 			ret = Kernel::syscall(SYS_WAIT, pid, (uintptr_t)stat_loc, options); | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		case SYS_STAT: | 		case SYS_FSTAT: | ||||||
| 		{ | 		{ | ||||||
| 			const char* path = va_arg(args, const char*); | 			int fd = va_arg(args, int); | ||||||
| 			struct stat* buf = va_arg(args, struct stat*); | 			struct stat* buf = va_arg(args, struct stat*); | ||||||
| 			int flags = va_arg(args, int); | 			ret = Kernel::syscall(SYS_FSTAT, (uintptr_t)fd, (uintptr_t)buf); | ||||||
| 			ret = Kernel::syscall(SYS_STAT, (uintptr_t)path, (uintptr_t)buf, flags); |  | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		case SYS_SETENVP: | 		case SYS_SETENVP: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue