summaryrefslogtreecommitdiffstats
path: root/crypto/time.c
diff options
context:
space:
mode:
authorPauli <pauli@openssl.org>2022-08-29 14:52:44 +1000
committerPauli <pauli@openssl.org>2022-09-13 21:13:22 +1000
commit02d0f87a8ba143eaeaee3334a2f63543b10148a9 (patch)
treec6ca88a3790d90db7dcf13c65032e0fe4f54cfb2 /crypto/time.c
parent4fc04c71acf180dad0b4418d12b3ed31ba46179a (diff)
time: move OSSL_TIME to libcrypto
Keep building it for libssl without exposing any symbols. Reviewed-by: Todd Short <todd.short@me.com> Reviewed-by: Richard Levitte <levitte@openssl.org> Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from https://github.com/openssl/openssl/pull/19082)
Diffstat (limited to 'crypto/time.c')
-rw-r--r--crypto/time.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/crypto/time.c b/crypto/time.c
new file mode 100644
index 0000000000..a90aa76788
--- /dev/null
+++ b/crypto/time.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include <errno.h>
+#include <openssl/err.h>
+#include "internal/time.h"
+
+OSSL_TIME ossl_time_now(void)
+{
+ OSSL_TIME r;
+
+#if defined(_WIN32)
+ SYSTEMTIME st;
+ union {
+ unsigned __int64 ul;
+ FILETIME ft;
+ } now;
+
+ GetSystemTime(&st);
+ SystemTimeToFileTime(&st, &now.ft);
+ /* re-bias to 1/1/1970 */
+# ifdef __MINGW32__
+ now.ul -= 116444736000000000ULL;
+# else
+ now.ul -= 116444736000000000UI64;
+# endif
+ r.t = ((uint64_t)now.ul) * (OSSL_TIME_SECOND / 10000000);
+#else /* defined(_WIN32) */
+ struct timeval t;
+
+ if (gettimeofday(&t, NULL) < 0) {
+ ERR_raise_data(ERR_LIB_SYS, get_last_sys_error(),
+ "calling gettimeofday()");
+ return ossl_time_zero();
+ }
+ if (t.tv_sec <= 0)
+ r.t = t.tv_usec <= 0 ? 0 : t.tv_usec * OSSL_TIME_US;
+ else
+ r.t = ((uint64_t)t.tv_sec * 1000000 + t.tv_usec) * OSSL_TIME_US;
+#endif /* defined(_WIN32) */
+ return r;
+}