--- /dev/null
+pkg os, method (*Root) ReadFile(string) ([]uint8, error) #73126
+pkg os, method (*Root) WriteFile(string, []uint8, fs.FileMode) error #73126
return rootSymlink(r, oldname, newname)
}
+// ReadFile reads the named file in the root and returns its contents.
+// See [ReadFile] for more details.
+func (r *Root) ReadFile(name string) ([]byte, error) {
+ f, err := r.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ return readFileContents(statOrZero(f), f.Read)
+}
+
+// WriteFile writes data to the named file in the root, creating it if necessary.
+// See [WriteFile] for more details.
+func (r *Root) WriteFile(name string, data []byte, perm FileMode) error {
+ f, err := r.OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm)
+ if err != nil {
+ return err
+ }
+ _, err = f.Write(data)
+ if err1 := f.Close(); err == nil {
+ err = err1
+ }
+ return err
+}
+
func (r *Root) logOpen(name string) {
if log := testlog.Logger(); log != nil {
// This won't be right if r's name has changed since it was opened,
t.Error(`root.Remove(All)?(".") removed the root`)
}
}
+
+func TestRootWriteReadFile(t *testing.T) {
+ dir := t.TempDir()
+ root, err := os.OpenRoot(dir)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer root.Close()
+
+ name := "filename"
+ want := []byte("file contents")
+ if err := root.WriteFile(name, want, 0o666); err != nil {
+ t.Fatalf("root.WriteFile(%q, %q, 0o666) = %v; want nil", name, want, err)
+ }
+
+ got, err := root.ReadFile(name)
+ if err != nil {
+ t.Fatalf("root.ReadFile(%q) = %q, %v; want %q, nil", name, got, err, want)
+ }
+}