//! /system/services/vfs/vfs-test — a client that proves the VFS round trip end to end: open a //! file through the `runtime.fs` 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"); const fs = runtime.fs; pub fn main(init: runtime.process.Init) void { 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 parked: ?fs.File = null; var tries: u32 = 0; while (parked == null and tries < 200) : (tries += 1) { parked = fs.open("parked", .{ .create = true }); if (parked == null) runtime.system.sleep(20); } if (parked == null) { _ = 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 opened: ?fs.File = null; var tries: u32 = 0; while (opened == null and tries < 200) : (tries += 1) { opened = fs.open("greeting", .{ .create = true }); if (opened == null) runtime.system.sleep(20); } var greeting = opened orelse { _ = runtime.system.write("vfstest: open failed\n"); return; }; if ((greeting.write(payload) orelse 0) != payload.len) { _ = runtime.system.write("vfstest: write failed\n"); return; } greeting.seekTo(0); var buffer: [32]u8 = undefined; const n = greeting.read(&buffer) orelse 0; greeting.close(); if (n == payload.len and std.mem.eql(u8, buffer[0..n], payload)) { while (true) { _ = runtime.system.write("vfstest: ok\n"); runtime.system.sleep(1000); } } _ = runtime.system.write("vfstest: mismatch\n"); }