summaryrefslogtreecommitdiffstats
path: root/src/xtime.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-05-06 16:04:05 -0400
committerTavian Barnes <tavianator@tavianator.com>2024-05-06 16:04:05 -0400
commitf976c98d334dce9ba30aa7da4427bb530aeea536 (patch)
treeff48eba03fc0ce3a3497118142b87ebaa6865bf7 /src/xtime.c
parentc74947f39063218f3cbd884e4ebaafe8dfc9302c (diff)
downloadbfs-f976c98d334dce9ba30aa7da4427bb530aeea536.tar.xz
xtime: Use the libc's timegm() if present
Diffstat (limited to 'src/xtime.c')
-rw-r--r--src/xtime.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/xtime.c b/src/xtime.c
index 91ed915..c3537e7 100644
--- a/src/xtime.c
+++ b/src/xtime.c
@@ -12,13 +12,13 @@
#include <unistd.h>
int xmktime(struct tm *tm, time_t *timep) {
- *timep = mktime(tm);
+ time_t time = mktime(tm);
- if (*timep == -1) {
+ if (time == -1) {
int error = errno;
struct tm tmp;
- if (!localtime_r(timep, &tmp)) {
+ if (!localtime_r(&time, &tmp)) {
bfs_bug("localtime_r(-1): %s", xstrerror(errno));
return -1;
}
@@ -30,9 +30,37 @@ int xmktime(struct tm *tm, time_t *timep) {
}
}
+ *timep = time;
+ return 0;
+}
+
+#if BFS_HAS_TIMEGM
+
+int xtimegm(struct tm *tm, time_t *timep) {
+ time_t time = timegm(tm);
+
+ if (time == -1) {
+ int error = errno;
+
+ struct tm tmp;
+ if (!gmtime_r(&time, &tmp)) {
+ bfs_bug("gmtime_r(-1): %s", xstrerror(errno));
+ return -1;
+ }
+
+ if (tm->tm_year != tmp.tm_year || tm->tm_yday != tmp.tm_yday
+ || tm->tm_hour != tmp.tm_hour || tm->tm_min != tmp.tm_min || tm->tm_sec != tmp.tm_sec) {
+ errno = error;
+ return -1;
+ }
+ }
+
+ *timep = time;
return 0;
}
+#else
+
static int safe_add(int *value, int delta) {
if (*value >= 0) {
if (delta > INT_MAX - *value) {
@@ -147,6 +175,8 @@ overflow:
return -1;
}
+#endif // !BFS_HAS_TIMEGM
+
/** Parse a decimal digit. */
static int xgetdigit(char c) {
int ret = c - '0';