//! /system/services/vfs/vfs-test — a client that proves the VFS round trip end to end: open a //! file through the `runtime` file API, write to it, seek back, read it, and compare. //! On success it heartbeats "vfstest: ok" so the kernel test can observe it; //! on failure it reports what went wrong. Shipped in the initial_ramdisk alongside vfs. const std = @import("std"); const runtime = @import("runtime"); pub fn main(init: runtime.process.Init) void { const u = @import("posix").unistd; const payload = "hello-vfs"; // The "park" role (the vfs-client-death test): open a file, then hold the // handle forever without closing — the kill and the VFS's release-on-death // are the point. if (init.arguments.count > 1) { var fd: i32 = -1; var tries: u32 = 0; while (fd < 0 and tries < 200) : (tries += 1) { fd = u.open("parked", u.O_CREAT); if (fd < 0) runtime.system.sleep(20); } if (fd < 0) { _ = runtime.system.write("vfstest: park open failed\n"); return; } while (true) { _ = runtime.system.write("vfstest: parked\n"); runtime.system.sleep(500); } } // The VFS server may not have registered yet — retry open until it's up. var fd: i32 = -1; var tries: u32 = 0; while (fd < 0 and tries < 200) : (tries += 1) { fd = u.open("greeting", u.O_CREAT); if (fd < 0) runtime.system.sleep(20); } if (fd < 0) { _ = runtime.system.write("vfstest: open failed\n"); return; } if (u.write(fd, payload) != @as(isize, payload.len)) { _ = runtime.system.write("vfstest: write failed\n"); return; } _ = u.lseek(fd, 0, u.SEEK_SET); var buffer: [32]u8 = undefined; const n = u.read(fd, &buffer); u.close(fd); if (n == @as(isize, payload.len) and std.mem.eql(u8, buffer[0..@intCast(n)], payload)) { while (true) { _ = runtime.system.write("vfstest: ok\n"); runtime.system.sleep(1000); } } _ = runtime.system.write("vfstest: mismatch\n"); } pub const panic = runtime.panic; comptime { _ = &runtime.start._start; }