Eigenstate: myrddin-dev mailing list

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[patch] implement std.unveil


This implements std.unveil, to call openbsd's unveil(2) to complement
std.pledge. It's a noop everywhere except on OpenBSD 6.4+

Not sure about the best way to do the locking call in myrddin, and went
with it being a separate function, std.veil, so

	std.unveil("/tmp/foo", "r")
	std.unveil("/tmp/bar", "w")
	std.veil()

is equivalent to

	unveil("/tmp/foo", "r");
	unveil("/tmp/bar", "w");
	unveil(NULL, NULL);

There might be a better way to do it, or a better name than veil?

-- 
Carlin


diff --git a/lib/std/bld.sub b/lib/std/bld.sub
index 093e2429..1b3d0942 100644
--- a/lib/std/bld.sub
+++ b/lib/std/bld.sub
@@ -89,6 +89,9 @@ lib std =
 	pledge.myr
 	pledge+openbsd.myr
 
+	unveil.myr
+	unveil+openbsd:6.4.myr
+
 	# asm optimizations
 	memops.myr
 	memops-impl.myr
diff --git a/lib/std/unveil+openbsd:6.4.myr b/lib/std/unveil+openbsd:6.4.myr
new file mode 100644
index 00000000..e01e02be
--- /dev/null
+++ b/lib/std/unveil+openbsd:6.4.myr
@@ -0,0 +1,23 @@
+use sys
+use "errno"
+use "result"
+
+pkg std =
+	const unveil	: (path : byte[:], permissions : byte[:] -> result(void, errno))
+	const veil	: (-> result(void, errno))
+;;
+
+const unveil = {path, permissions
+	match sys.unveil(sys.cstring(path), sys.cstring(permissions))
+	| 0:	-> `std.Ok void
+	| e:	-> `std.Err (e : errno)
+	;;
+}
+
+/* emulates unveil(NULL, NULL); making further std.unveil calls fail */
+const veil = {
+	match sys.unveil((0 : byte#), (0 : byte#))
+	| 0:	-> `std.Ok void
+	| e:	-> `std.Err (e : errno)
+	;;
+}
diff --git a/lib/std/unveil.myr b/lib/std/unveil.myr
new file mode 100644
index 00000000..d4ca113c
--- /dev/null
+++ b/lib/std/unveil.myr
@@ -0,0 +1,16 @@
+use sys
+use "errno"
+use "result"
+
+pkg std =
+	const unveil	: (path : byte[:], permissions : byte[:] -> result(void, errno))
+	const veil	: (-> result(void, errno))
+;;
+
+const unveil = {path, permissions
+	-> `std.Ok void
+}
+
+const veil = {
+	-> `std.Ok void
+}