diff --git a/memmap.go b/memmap.go index 943bad0b..b7b1474b 100644 --- a/memmap.go +++ b/memmap.go @@ -212,6 +212,9 @@ 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 err == nil && (flag&os.O_EXCL > 0) { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists} + } if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { file, err = m.Create(name) chmod = true diff --git a/memmap_test.go b/memmap_test.go index 47414ab1..a88ea30b 100644 --- a/memmap_test.go +++ b/memmap_test.go @@ -104,6 +104,29 @@ func checkPathError(t *testing.T, err error, op string) { } } +// Ensure os.O_EXCL is correctly handled. +func TestOpenFileExcl(t *testing.T) { + const fileName = "/myFileTest" + const fileMode = os.FileMode(0765) + + fs := NewMemMapFs() + + // First creation should succeed. + f, err := fs.OpenFile(fileName, os.O_CREATE|os.O_EXCL, fileMode) + if err != nil { + t.Errorf("OpenFile Create Excl failed: %s", err) + return + } + f.Close() + + // Second creation should fail. + _, err = fs.OpenFile(fileName, os.O_CREATE|os.O_EXCL, fileMode) + if err == nil { + t.Errorf("OpenFile Create Excl should have failed, but it didn't") + } + checkPathError(t, err, "Open") +} + // Ensure Permissions are set on OpenFile/Mkdir/MkdirAll func TestPermSet(t *testing.T) { const fileName = "/myFileTest"