Index: fusl/src/stat/utimensat.c |
diff --git a/fusl/src/stat/utimensat.c b/fusl/src/stat/utimensat.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..159c8be3b3c71109f2b72c36cc2c4027683a8cf6 |
--- /dev/null |
+++ b/fusl/src/stat/utimensat.c |
@@ -0,0 +1,37 @@ |
+#include <sys/stat.h> |
+#include <sys/time.h> |
+#include <fcntl.h> |
+#include <errno.h> |
+#include "syscall.h" |
+ |
+int utimensat(int fd, const char *path, const struct timespec times[2], int flags) |
+{ |
+ int r = __syscall(SYS_utimensat, fd, path, times, flags); |
+#ifdef SYS_futimesat |
+ if (r != -ENOSYS || flags) return __syscall_ret(r); |
+ struct timeval *tv = 0, tmp[2]; |
+ if (times) { |
+ int i; |
+ tv = tmp; |
+ for (i=0; i<2; i++) { |
+ if (times[i].tv_nsec >= 1000000000ULL) { |
+ if (times[i].tv_nsec == UTIME_NOW && |
+ times[1-i].tv_nsec == UTIME_NOW) { |
+ tv = 0; |
+ break; |
+ } |
+ if (times[i].tv_nsec == UTIME_OMIT) |
+ return __syscall_ret(-ENOSYS); |
+ return __syscall_ret(-EINVAL); |
+ } |
+ tmp[i].tv_sec = times[i].tv_sec; |
+ tmp[i].tv_usec = times[i].tv_nsec / 1000; |
+ } |
+ } |
+ |
+ r = __syscall(SYS_futimesat, fd, path, tv); |
+ if (r != -ENOSYS || fd != AT_FDCWD) return __syscall_ret(r); |
+ r = __syscall(SYS_utimes, path, tv); |
+#endif |
+ return __syscall_ret(r); |
+} |