Merge pull request #110 from SonOfBytes/memfs-perm-fix - afero - [fork] go afero port for 9front
(HTM) git clone git@git.drkhsh.at/afero.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 2f30b2a92c0e5700bcfe4715891adb1f2a7a406d
(DIR) parent 8a1f1350d877063e2d8271126a7dcd56e260bb90
(HTM) Author: Martin Bertschler <mbertschler@gmail.com>
Date: Thu, 8 Dec 2016 19:21:42 +0100
Merge pull request #110 from SonOfBytes/memfs-perm-fix
Set perm in MemMapFS after OpenFile, MkDir and MkDirAll methods called
Diffstat:
M memmap.go | 6 ++++++
M memmap_test.go | 61 +++++++++++++++++++++++++++++++
2 files changed, 67 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/memmap.go b/memmap.go
@@ -134,6 +134,7 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
m.getData()[name] = item
m.registerWithParent(item)
m.mu.Unlock()
+ m.Chmod(name, perm)
}
return nil
}
@@ -203,9 +204,11 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
}
func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ chmod := false
file, err := m.openWrite(name)
if os.IsNotExist(err) && (flag&os.O_CREATE > 0) {
file, err = m.Create(name)
+ chmod = true
}
if err != nil {
return nil, err
@@ -227,6 +230,9 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro
return nil, err
}
}
+ if chmod {
+ m.Chmod(name, perm)
+ }
return file, nil
}
(DIR) diff --git a/memmap_test.go b/memmap_test.go
@@ -102,6 +102,67 @@ func checkPathError(t *testing.T, err error, op string) {
}
}
+// Ensure Permissions are set on OpenFile/Mkdir/MkdirAll
+func TestPermSet(t *testing.T) {
+ const fileName = "/myFileTest"
+ const dirPath = "/myDirTest"
+ const dirPathAll = "/my/path/to/dir"
+
+ const fileMode = os.FileMode(0765)
+
+ fs := NewMemMapFs()
+
+ // Test Openfile
+ f, err := fs.OpenFile(fileName, os.O_CREATE, fileMode)
+ if err != nil {
+ t.Errorf("OpenFile Create failed: %s", err)
+ return
+ }
+ f.Close()
+
+ s, err := fs.Stat(fileName)
+ if err != nil {
+ t.Errorf("Stat failed: %s", err)
+ return
+ }
+ if s.Mode().String() != fileMode.String() {
+ t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), fileMode.String())
+ return
+ }
+
+ // Test Mkdir
+ err = fs.Mkdir(dirPath, fileMode)
+ if err != nil {
+ t.Errorf("MkDir Create failed: %s", err)
+ return
+ }
+ s, err = fs.Stat(dirPath)
+ if err != nil {
+ t.Errorf("Stat failed: %s", err)
+ return
+ }
+ if s.Mode().String() != fileMode.String() {
+ t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), fileMode.String())
+ return
+ }
+
+ // Test MkdirAll
+ err = fs.MkdirAll(dirPathAll, fileMode)
+ if err != nil {
+ t.Errorf("MkDir Create failed: %s", err)
+ return
+ }
+ s, err = fs.Stat(dirPathAll)
+ if err != nil {
+ t.Errorf("Stat failed: %s", err)
+ return
+ }
+ if s.Mode().String() != fileMode.String() {
+ t.Errorf("Permissions Incorrect: %s != %s", s.Mode().String(), fileMode.String())
+ return
+ }
+}
+
// Fails if multiple file objects use the same file.at counter in MemMapFs
func TestMultipleOpenFiles(t *testing.T) {
defer removeAllTestFiles(t)