mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 18:27:36 +00:00
tools/nolibc: add support for sys_llseek()
Not all architectures have the old sys_lseek(), notably riscv32. Implement lseek() in terms of sys_llseek() in that case. Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de> Link: https://lore.kernel.org/r/20250209-nolibc-dir-v2-1-57cc1da8558b@weissschuh.net Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
This commit is contained in:
committed by
Thomas Weißschuh
parent
c1f4a7a840
commit
dde5625d4d
@@ -597,10 +597,37 @@ off_t sys_lseek(int fd, off_t offset, int whence)
|
||||
#endif
|
||||
}
|
||||
|
||||
static __attribute__((unused))
|
||||
int sys_llseek(int fd, unsigned long offset_high, unsigned long offset_low,
|
||||
__kernel_loff_t *result, int whence)
|
||||
{
|
||||
#ifdef __NR_llseek
|
||||
return my_syscall5(__NR_llseek, fd, offset_high, offset_low, result, whence);
|
||||
#else
|
||||
return __nolibc_enosys(__func__, fd, offset_high, offset_low, result, whence);
|
||||
#endif
|
||||
}
|
||||
|
||||
static __attribute__((unused))
|
||||
off_t lseek(int fd, off_t offset, int whence)
|
||||
{
|
||||
return __sysret(sys_lseek(fd, offset, whence));
|
||||
__kernel_loff_t loff = 0;
|
||||
off_t result;
|
||||
int ret;
|
||||
|
||||
result = sys_lseek(fd, offset, whence);
|
||||
if (result == -ENOSYS) {
|
||||
/* Only exists on 32bit where nolibc off_t is also 32bit */
|
||||
ret = sys_llseek(fd, 0, offset, &loff, whence);
|
||||
if (ret < 0)
|
||||
result = ret;
|
||||
else if (loff != (off_t)loff)
|
||||
result = -EOVERFLOW;
|
||||
else
|
||||
result = loff;
|
||||
}
|
||||
|
||||
return __sysret(result);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user