summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2024-06-04 12:52:39 -0400
committerTavian Barnes <tavianator@tavianator.com>2024-06-04 12:52:39 -0400
commitc6bb003b8882e9a16941f5803d072ec1cb728318 (patch)
tree273d7b3de70212b75bf6c841c70142a00fec5d3c
parent3da7fe8b4f5d6a41152d81bbfbd30b0ab3a9da1c (diff)
downloadbfs-c6bb003b8882e9a16941f5803d072ec1cb728318.tar.xz
xtime: Add support for @epochseconds timestamps
-rw-r--r--src/xtime.c18
-rw-r--r--tests/gnu/used.sh31
-rw-r--r--tests/run.sh6
3 files changed, 30 insertions, 25 deletions
diff --git a/src/xtime.c b/src/xtime.c
index 2808455..186651b 100644
--- a/src/xtime.c
+++ b/src/xtime.c
@@ -206,6 +206,23 @@ static int xgetpart(const char **str, size_t n, int *result) {
}
int xgetdate(const char *str, struct timespec *result) {
+ // Handle @epochseconds
+ if (str[0] == '@') {
+ long long value;
+ if (xstrtoll(str + 1, NULL, 10, &value) != 0) {
+ goto error;
+ }
+
+ time_t time = (time_t)value;
+ if ((long long)time != value) {
+ errno = ERANGE;
+ goto error;
+ }
+
+ result->tv_sec = time;
+ goto done;
+ }
+
struct tm tm = {
.tm_isdst = -1,
};
@@ -324,6 +341,7 @@ end:
}
}
+done:
result->tv_nsec = 0;
return 0;
diff --git a/tests/gnu/used.sh b/tests/gnu/used.sh
index 5e5d4e9..fe0a778 100644
--- a/tests/gnu/used.sh
+++ b/tests/gnu/used.sh
@@ -1,37 +1,18 @@
-iso8601() {
- printf '%04d-%02d-%02dT%02d:%02d:%02d\n' "$@"
-}
-
cd "$TEST"
-now=$(date '+%Y-%m-%dT%H:%M:%S')
-
-# Parse the current date
-[[ "$now" =~ ^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})$ ]] || fail
-# Treat leading zeros as decimal, not octal
-YYYY=$((10#${BASH_REMATCH[1]}))
-MM=$((10#${BASH_REMATCH[2]}))
-DD=$((10#${BASH_REMATCH[3]}))
-hh=$((10#${BASH_REMATCH[4]}))
-mm=$((10#${BASH_REMATCH[5]}))
-ss=$((10#${BASH_REMATCH[6]}))
+now=$(epoch_time)
# -used is always false if atime < ctime
-yesterday=$(iso8601 $YYYY $MM $((DD - 1)) $hh $mm $ss)
-"$XTOUCH" -at "$yesterday" yesterday
+"$XTOUCH" -at "@$((now - 60 * 60 * 24))" yesterday
# -used rounds up
-tomorrow=$(iso8601 $YYYY $MM $DD $((hh + 1)) $mm $ss)
-"$XTOUCH" -at "$tomorrow" tomorrow
+"$XTOUCH" -at "@$((now + 60 * 60))" tomorrow
-dayafter=$(iso8601 $YYYY $MM $((DD + 1)) $((hh + 1)) $mm $ss)
-"$XTOUCH" -at "$dayafter" dayafter
+"$XTOUCH" -at "@$((now + 60 * 60 * 25))" dayafter
-nextweek=$(iso8601 $YYYY $MM $((DD + 6)) $((hh + 1)) $mm $ss)
-"$XTOUCH" -at "$nextweek" nextweek
+"$XTOUCH" -at "@$((now + 60 * 60 * (24 * 6 + 1)))" nextweek
-nextyear=$(iso8601 $((YYYY + 1)) $MM $DD $hh $mm $ss)
-"$XTOUCH" -at "$nextyear" nextyear
+"$XTOUCH" -at "@$((now + 60 * 60 * 24 * 365))" nextyear
bfs_diff -mindepth 1 \
-a -used 1 -printf '-used 1: %p\n' \
diff --git a/tests/run.sh b/tests/run.sh
index 8c1402d..115a036 100644
--- a/tests/run.sh
+++ b/tests/run.sh
@@ -410,6 +410,12 @@ make_xattrs() {
esac
}
+# Get the Unix epoch time in seconds
+epoch_time() {
+ # https://stackoverflow.com/a/12746260/502399
+ awk 'BEGIN { srand(); print srand(); }'
+}
+
## Snapshot testing
# Return value when a difference is detected