commit 7b41e12c2f47c56d99b7b5329ebb5224de6c16ab
parent f871dd3d7c6a683ebcbea05c15c86c294ae2940d
Author: Curtis Arthaud <uku82@gmx.fr>
Date: Wed, 29 May 2024 12:25:09 +0200
time: set(): don't abort on EPERM
Signed-off-by: Curtis Arthaud <uku82@gmx.fr>
Diffstat:
16 files changed, 48 insertions(+), 28 deletions(-)
diff --git a/makefiles/freebsd.aarch64.mk b/makefiles/freebsd.aarch64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/strings.td
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+freebsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/freebsd.riscv64.mk b/makefiles/freebsd.riscv64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/strings.td
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+freebsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/freebsd.x86_64.mk b/makefiles/freebsd.x86_64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/strings.td
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+freebsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/linux.aarch64.mk b/makefiles/linux.aarch64.mk
@@ -136,7 +136,7 @@ $(HARECACHE)/linux_vdso.ssa: $(linux_vdso_ha) $(HARECACHE)/format_elf.td $(HAREC
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/linux_vdso.td.tmp -N linux::vdso $(linux_vdso_ha)
time_ha = time/+linux/+aarch64.ha time/+linux/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/linux.riscv64.mk b/makefiles/linux.riscv64.mk
@@ -136,7 +136,7 @@ $(HARECACHE)/linux_vdso.ssa: $(linux_vdso_ha) $(HARECACHE)/format_elf.td $(HAREC
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/linux_vdso.td.tmp -N linux::vdso $(linux_vdso_ha)
time_ha = time/+linux/+riscv64.ha time/+linux/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/linux.x86_64.mk b/makefiles/linux.x86_64.mk
@@ -136,7 +136,7 @@ $(HARECACHE)/linux_vdso.ssa: $(linux_vdso_ha) $(HARECACHE)/format_elf.td $(HAREC
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/linux_vdso.td.tmp -N linux::vdso $(linux_vdso_ha)
time_ha = time/+linux/+x86_64.ha time/+linux/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/linux_vdso.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/netbsd.aarch64.mk b/makefiles/netbsd.aarch64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+netbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/netbsd.riscv64.mk b/makefiles/netbsd.riscv64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+netbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/netbsd.x86_64.mk b/makefiles/netbsd.x86_64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+netbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/openbsd.aarch64.mk b/makefiles/openbsd.aarch64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+openbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/openbsd.riscv64.mk b/makefiles/openbsd.riscv64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+openbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/makefiles/openbsd.x86_64.mk b/makefiles/openbsd.x86_64.mk
@@ -112,7 +112,7 @@ $(HARECACHE)/path.ssa: $(path_ha) $(HARECACHE)/bytes.td $(HARECACHE)/rt.td $(HAR
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/path.td.tmp -N path $(path_ha)
time_ha = time/+openbsd/functions.ha time/arithm.ha time/conv.ha time/types.ha
-$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
+$(HARECACHE)/time.ssa: $(time_ha) $(HARECACHE)/errors.td $(HARECACHE)/math.td $(HARECACHE)/rt.td $(HARECACHE)/types.td
@mkdir -p -- "$(HARECACHE)"
@printf 'HAREC\t%s\n' "$@"
@$(TDENV) $(HAREC) $(HARECFLAGS) -o $@ -t $(HARECACHE)/time.td.tmp -N time $(time_ha)
diff --git a/time/+freebsd/functions.ha b/time/+freebsd/functions.ha
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
+use errors;
use rt;
// Converts a [[duration]] to an [[rt::timespec]]. This function is
@@ -94,11 +95,15 @@ export fn now(clock: clock) instant = {
};
// Sets system clock to given time.
-export fn set(clock: clock, t: instant) void = {
+export fn set(clock: clock, t: instant) (void | errors::noaccess) = {
let tp = instant_to_timespec(t);
- match (rt::clock_settime(clock, &tp)) {
- case void => yield;
+ let err = match (rt::clock_settime(clock, &tp)) {
+ case void => return;
case let err: rt::errno =>
- abort("Unexpected error from clock_settime");
+ yield err;
};
+ if (err == rt::EPERM) {
+ return errors::noaccess;
+ };
+ abort("Unexpected error from clock_settime");
};
diff --git a/time/+linux/functions.ha b/time/+linux/functions.ha
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
+use errors;
use linux::vdso;
use rt;
@@ -130,11 +131,15 @@ export fn now(clock: clock) instant = {
};
// Sets system clock to given time.
-export fn set(clock: clock, t: instant) void = {
+export fn set(clock: clock, t: instant) (void | errors::noaccess) = {
let tp = instant_to_timespec(t);
- match (rt::clock_settime(clock, &tp)) {
- case void => yield;
+ let err = match (rt::clock_settime(clock, &tp)) {
+ case void => return;
case let err: rt::errno =>
- abort("Unexpected error from clock_settime");
+ yield err;
+ };
+ if (err == rt::EPERM) {
+ return errors::noaccess;
};
+ abort("Unexpected error from clock_settime");
};
diff --git a/time/+netbsd/functions.ha b/time/+netbsd/functions.ha
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
+use errors;
use rt;
// Converts a [[duration]] to an [[rt::timespec]]. This function is
@@ -95,11 +96,15 @@ export fn now(clock: clock) instant = {
};
// Sets system clock to given time.
-export fn set(clock: clock, t: instant) void = {
+export fn set(clock: clock, t: instant) (void | errors::noaccess) = {
let tp = instant_to_timespec(t);
- match (rt::clock_settime(clock, &tp)) {
- case void => yield;
+ let err = match (rt::clock_settime(clock, &tp)) {
+ case void => return;
case let err: rt::errno =>
- abort("Unexpected error from clock_settime");
+ yield err;
};
+ if (err == rt::EPERM) {
+ return errors::noaccess;
+ };
+ abort("Unexpected error from clock_settime");
};
diff --git a/time/+openbsd/functions.ha b/time/+openbsd/functions.ha
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>
+use errors;
use rt;
// Converts a [[duration]] to an [[rt::timespec]]. This function is
@@ -96,11 +97,15 @@ export fn now(clock: clock) instant = {
};
// Sets system clock to given time.
-export fn set(clock: clock, t: instant) void = {
+export fn set(clock: clock, t: instant) (void | errors::noaccess) = {
let tp = instant_to_timespec(t);
- match (rt::clock_settime(clock, &tp)) {
- case void => yield;
+ let err = match (rt::clock_settime(clock, &tp)) {
+ case void => return;
case let err: rt::errno =>
- abort("Unexpected error from clock_settime");
+ yield err;
};
+ if (err == rt::EPERM) {
+ return errors::noaccess;
+ };
+ abort("Unexpected error from clock_settime");
};