about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/time/clock_gettime.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/time/clock_gettime.c b/src/time/clock_gettime.c
index 8fd1b8f5..46083759 100644
--- a/src/time/clock_gettime.c
+++ b/src/time/clock_gettime.c
@@ -40,6 +40,24 @@ int __clock_gettime(clockid_t clk, struct timespec *ts)
 	}
 #endif
 
+#ifdef SYS_clock_gettime64
+	if (sizeof(time_t) > 4)
+		r = __syscall(SYS_clock_gettime64, clk, ts);
+	if (SYS_clock_gettime == SYS_clock_gettime64 || r!=-ENOSYS)
+		return __syscall_ret(r);
+	long ts32[2];
+	r = __syscall(SYS_clock_gettime, clk, ts32);
+	if (r==-ENOSYS && clk==CLOCK_REALTIME) {
+		r = __syscall(SYS_gettimeofday, ts32, 0);
+		ts32[1] *= 1000;
+	}
+	if (!r) {
+		ts->tv_sec = ts32[0];
+		ts->tv_nsec = ts32[1];
+		return r;
+	}
+	return __syscall_ret(r);
+#else
 	r = __syscall(SYS_clock_gettime, clk, ts);
 	if (r == -ENOSYS) {
 		if (clk == CLOCK_REALTIME) {
@@ -50,6 +68,7 @@ int __clock_gettime(clockid_t clk, struct timespec *ts)
 		r = -EINVAL;
 	}
 	return __syscall_ret(r);
+#endif
 }
 
 weak_alias(__clock_gettime, clock_gettime);