aboutsummaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2025-05-19 15:51:14 -0700
committerGopher Robot <gobot@golang.org>2025-05-21 11:59:27 -0700
commit4b7aa542ebc5144b2df7ee455ab137eb90de6f00 (patch)
tree0d664e3664d346e39de085bea22021bbdaf9f71a /src/os
parent3ae95aafb5d656596212c672c6e104e5c8802dbc (diff)
downloadgo-4b7aa542ebc5144b2df7ee455ab137eb90de6f00.tar.xz
os: add Root.ReadFile and Root.WriteFile
For #73126 Change-Id: Ie69cc274e7b59f958c239520318b89ff0141e26b Reviewed-on: https://go-review.googlesource.com/c/go/+/674315 Reviewed-by: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Damien Neil <dneil@google.com>
Diffstat (limited to 'src/os')
-rw-r--r--src/os/root.go25
-rw-r--r--src/os/root_test.go20
2 files changed, 45 insertions, 0 deletions
diff --git a/src/os/root.go b/src/os/root.go
index 02bf0b5a3a..953cd6b9b9 100644
--- a/src/os/root.go
+++ b/src/os/root.go
@@ -248,6 +248,31 @@ func (r *Root) Symlink(oldname, newname string) error {
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,
diff --git a/src/os/root_test.go b/src/os/root_test.go
index 4e09cb9621..effcdeab43 100644
--- a/src/os/root_test.go
+++ b/src/os/root_test.go
@@ -1899,3 +1899,23 @@ func TestRootRemoveDot(t *testing.T) {
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)
+ }
+}