aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface/linux/linux_api.c
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2021-03-03 00:34:02 +0000
committerMichael Brown <mcb30@ipxe.org>2021-03-03 01:01:58 +0000
commit69ecab2634d3f5a825e0baaa310ba048d5aed3b5 (patch)
treee3a8a0415394c75e0ef679b83b4d7032f7df61fa /src/interface/linux/linux_api.c
parent2a2909cd1f55b2110bf8ef48b65816c9fae4637f (diff)
downloadipxe-69ecab2634d3f5a825e0baaa310ba048d5aed3b5.tar.gz
[linux] Use fstat() rather than statx()
The statx() system call has a clean header file and a consistent layout, but was unfortunately added only in kernel 4.11. Using stat() or fstat() directly is extremely messy since glibc does not necessarily use the kernel native data structures. However, as the only current use case is to obtain the length of an open file, we can merely provide a wrapper that does precisely this. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/linux/linux_api.c')
-rw-r--r--src/interface/linux/linux_api.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/interface/linux/linux_api.c b/src/interface/linux/linux_api.c
index 6fa2b0e76..d1f969aa7 100644
--- a/src/interface/linux/linux_api.c
+++ b/src/interface/linux/linux_api.c
@@ -200,14 +200,15 @@ int __asmcall linux_ioctl ( int fd, unsigned long request, ... ) {
}
/**
- * Wrap statx()
+ * Wrap part of fstat()
*
*/
-int __asmcall linux_statx ( int dirfd, const char *pathname, int flags,
- unsigned int mask, struct statx *statxbuf ) {
+int __asmcall linux_fstat_size ( int fd, size_t *size ) {
+ struct stat stat;
int ret;
- ret = statx ( dirfd, pathname, flags, mask, statxbuf );
+ ret = fstat ( fd, &stat );
+ *size = stat.st_size;
if ( ret == -1 )
linux_errno = errno;
return ret;
@@ -531,7 +532,7 @@ PROVIDE_IPXE_SYM ( linux_read );
PROVIDE_IPXE_SYM ( linux_write );
PROVIDE_IPXE_SYM ( linux_fcntl );
PROVIDE_IPXE_SYM ( linux_ioctl );
-PROVIDE_IPXE_SYM ( linux_statx );
+PROVIDE_IPXE_SYM ( linux_fstat_size );
PROVIDE_IPXE_SYM ( linux_poll );
PROVIDE_IPXE_SYM ( linux_nanosleep );
PROVIDE_IPXE_SYM ( linux_usleep );