/* Copyright (c) 2022, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ // Time conversion to/from POSIX time_t and struct tm, with no support // for time zones other than UTC #include <openssl/posix_time.h> #include <assert.h> #include <inttypes.h> #include <limits.h> #include <string.h> #include <time.h> #include "internal.h" #define SECS_PER_HOUR … #define SECS_PER_DAY … // Is a year/month/day combination valid, in the range from year 0000 // to 9999? static int is_valid_date(int64_t year, int64_t month, int64_t day) { … } // Is a time valid? Leap seconds of 60 are not considered valid, as // the POSIX time in seconds does not include them. static int is_valid_time(int64_t hours, int64_t minutes, int64_t seconds) { … } // 0000-01-01 00:00:00 UTC #define MIN_POSIX_TIME … // 9999-12-31 23:59:59 UTC #define MAX_POSIX_TIME … // Is an int64 time within our expected range? static int is_valid_posix_time(int64_t time) { … } // Inspired by algorithms presented in // https://howardhinnant.github.io/date_algorithms.html // (Public Domain) static int posix_time_from_utc(int64_t year, int64_t month, int64_t day, int64_t hours, int64_t minutes, int64_t seconds, int64_t *out_time) { … } // Inspired by algorithms presented in // https://howardhinnant.github.io/date_algorithms.html // (Public Domain) static int utc_from_posix_time(int64_t time, int *out_year, int *out_month, int *out_day, int *out_hours, int *out_minutes, int *out_seconds) { … } int OPENSSL_tm_to_posix(const struct tm *tm, int64_t *out) { … } int OPENSSL_posix_to_tm(int64_t time, struct tm *out_tm) { … } int OPENSSL_timegm(const struct tm *tm, time_t *out) { … } struct tm *OPENSSL_gmtime(const time_t *time, struct tm *out_tm) { … } int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, int64_t offset_sec) { … } int OPENSSL_gmtime_diff(int *out_days, int *out_secs, const struct tm *from, const struct tm *to) { … }