123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- From e7711de591aed7e3a182880c3c8f5b527c0c67e8 Mon Sep 17 00:00:00 2001
- From: Stefan O'Rear <sorear@fastmail.com>
- Date: Thu, 3 Sep 2020 03:59:59 -0400
- Subject: [PATCH 06/16] Only call fstatat if defined
- riscv32 and future architectures lack it.
- ---
- src/stat/fchmodat.c | 23 ++++++++++++++++++++---
- src/stat/fstatat.c | 6 ++++++
- src/stdio/tempnam.c | 9 +++++++--
- src/stdio/tmpnam.c | 9 +++++++--
- src/time/__map_file.c | 19 +++++++++++++++----
- 5 files changed, 55 insertions(+), 11 deletions(-)
- diff --git a/src/stat/fchmodat.c b/src/stat/fchmodat.c
- index 4ee00b0a..857e84e5 100644
- --- a/src/stat/fchmodat.c
- +++ b/src/stat/fchmodat.c
- @@ -1,8 +1,10 @@
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- +#include <stdint.h>
- #include "syscall.h"
- #include "kstat.h"
- +#include "statx.h"
-
- int fchmodat(int fd, const char *path, mode_t mode, int flag)
- {
- @@ -11,13 +13,22 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
- if (flag != AT_SYMLINK_NOFOLLOW)
- return __syscall_ret(-EINVAL);
-
- - struct kstat st;
- int ret, fd2;
- char proc[15+3*sizeof(int)];
-
- +#ifdef SYS_fstatat
- + struct kstat st;
- if ((ret = __syscall(SYS_fstatat, fd, path, &st, flag)))
- return __syscall_ret(ret);
- - if (S_ISLNK(st.st_mode))
- + mode_t get_mode = st.st_mode;
- +#else
- + struct statx st;
- + if ((ret = __syscall(SYS_statx, fd, path, flag, STATX_TYPE, &st)))
- + return __syscall_ret(ret);
- + mode_t get_mode = st.stx_mode;
- +#endif
- +
- + if (S_ISLNK(get_mode))
- return __syscall_ret(-EOPNOTSUPP);
-
- if ((fd2 = __syscall(SYS_openat, fd, path, O_RDONLY|O_PATH|O_NOFOLLOW|O_NOCTTY|O_CLOEXEC)) < 0) {
- @@ -27,9 +38,15 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
- }
-
- __procfdname(proc, fd2);
- +#ifdef SYS_fstatat
- ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
- + get_mode = st.st_mode;
- +#else
- + ret = __syscall(SYS_statx, AT_FDCWD, proc, 0, STATX_TYPE, &st);
- + get_mode = st.stx_mode;
- +#endif
- if (!ret) {
- - if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
- + if (S_ISLNK(get_mode)) ret = -EOPNOTSUPP;
- else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
- }
-
- diff --git a/src/stat/fstatat.c b/src/stat/fstatat.c
- index 230a83fc..0486f21a 100644
- --- a/src/stat/fstatat.c
- +++ b/src/stat/fstatat.c
- @@ -45,6 +45,7 @@ static int fstatat_statx(int fd, const char *restrict path, struct stat *restric
- return 0;
- }
-
- +#ifdef SYS_fstatat
- static int fstatat_kstat(int fd, const char *restrict path, struct stat *restrict st, int flag)
- {
- int ret;
- @@ -106,15 +107,20 @@ static int fstatat_kstat(int fd, const char *restrict path, struct stat *restric
-
- return 0;
- }
- +#endif
-
- int fstatat(int fd, const char *restrict path, struct stat *restrict st, int flag)
- {
- int ret;
- +#ifdef SYS_fstatat
- if (sizeof((struct kstat){0}.st_atime_sec) < sizeof(time_t)) {
- ret = fstatat_statx(fd, path, st, flag);
- if (ret!=-ENOSYS) return __syscall_ret(ret);
- }
- ret = fstatat_kstat(fd, path, st, flag);
- +#else
- + ret = fstatat_statx(fd, path, st, flag);
- +#endif
- return __syscall_ret(ret);
- }
-
- diff --git a/src/stdio/tempnam.c b/src/stdio/tempnam.c
- index 565df6b6..9469923b 100644
- --- a/src/stdio/tempnam.c
- +++ b/src/stdio/tempnam.c
- @@ -5,8 +5,10 @@
- #include <limits.h>
- #include <string.h>
- #include <stdlib.h>
- +#include <stdint.h>
- #include "syscall.h"
- #include "kstat.h"
- +#include "statx.h"
-
- #define MAXTRIES 100
-
- @@ -37,11 +39,14 @@ char *tempnam(const char *dir, const char *pfx)
-
- for (try=0; try<MAXTRIES; try++) {
- __randname(s+l-6);
- -#ifdef SYS_lstat
- +#if defined(SYS_lstat)
- r = __syscall(SYS_lstat, s, &(struct kstat){0});
- -#else
- +#elif defined(SYS_fstatat)
- r = __syscall(SYS_fstatat, AT_FDCWD, s,
- &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
- +#else
- + r = __syscall(SYS_statx, AT_FDCWD, s, AT_SYMLINK_NOFOLLOW, 0,
- + &(struct statx){0});
- #endif
- if (r == -ENOENT) return strdup(s);
- }
- diff --git a/src/stdio/tmpnam.c b/src/stdio/tmpnam.c
- index d667a836..9576241b 100644
- --- a/src/stdio/tmpnam.c
- +++ b/src/stdio/tmpnam.c
- @@ -4,8 +4,10 @@
- #include <sys/stat.h>
- #include <string.h>
- #include <stdlib.h>
- +#include <stdint.h>
- #include "syscall.h"
- #include "kstat.h"
- +#include "statx.h"
-
- #define MAXTRIES 100
-
- @@ -17,11 +19,14 @@ char *tmpnam(char *buf)
- int r;
- for (try=0; try<MAXTRIES; try++) {
- __randname(s+12);
- -#ifdef SYS_lstat
- +#if defined(SYS_lstat)
- r = __syscall(SYS_lstat, s, &(struct kstat){0});
- -#else
- +#elif defined(SYS_fstatat)
- r = __syscall(SYS_fstatat, AT_FDCWD, s,
- &(struct kstat){0}, AT_SYMLINK_NOFOLLOW);
- +#else
- + r = __syscall(SYS_statx, AT_FDCWD, s, AT_SYMLINK_NOFOLLOW, 0,
- + &(struct statx){0});
- #endif
- if (r == -ENOENT) return strcpy(buf ? buf : internal, s);
- }
- diff --git a/src/time/__map_file.c b/src/time/__map_file.c
- index d3cefa82..542c8ce4 100644
- --- a/src/time/__map_file.c
- +++ b/src/time/__map_file.c
- @@ -1,18 +1,29 @@
- +#define _BSD_SOURCE
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- +#include <stdint.h>
- #include "syscall.h"
- #include "kstat.h"
- +#include "statx.h"
-
- const char unsigned *__map_file(const char *pathname, size_t *size)
- {
- - struct kstat st;
- const unsigned char *map = MAP_FAILED;
- int fd = sys_open(pathname, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
- if (fd < 0) return 0;
- - if (!syscall(SYS_fstat, fd, &st)) {
- - map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
- - *size = st.st_size;
- +#ifdef SYS_fstat
- + struct kstat st;
- + int r = syscall(SYS_fstat, fd, &st);
- + size_t fsize = st.st_size;
- +#else
- + struct statx st;
- + int r = syscall(SYS_statx, fd, "", AT_EMPTY_PATH, STATX_SIZE, &st);
- + size_t fsize = st.stx_size;
- +#endif
- + if (!r) {
- + map = __mmap(0, fsize, PROT_READ, MAP_SHARED, fd, 0);
- + *size = fsize;
- }
- __syscall(SYS_close, fd);
- return map == MAP_FAILED ? 0 : map;
- --
- 2.29.2
|