diff options
| author | Damien Neil <dneil@google.com> | 2025-05-19 15:51:14 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-05-21 11:59:27 -0700 |
| commit | 4b7aa542ebc5144b2df7ee455ab137eb90de6f00 (patch) | |
| tree | 0d664e3664d346e39de085bea22021bbdaf9f71a /src/os | |
| parent | 3ae95aafb5d656596212c672c6e104e5c8802dbc (diff) | |
| download | go-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.go | 25 | ||||
| -rw-r--r-- | src/os/root_test.go | 20 |
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) + } +} |
