Skip to content

Commit 1524d0a

Browse files
authored
Merge pull request #245 from campoy/master
Add support for os.O_EXCL in afero.MemMapFs
2 parents a7dc6ae + 0b856b1 commit 1524d0a

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

memmap.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,9 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
212212
func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
213213
chmod := false
214214
file, err := m.openWrite(name)
215+
if err == nil && (flag&os.O_EXCL > 0) {
216+
return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists}
217+
}
215218
if os.IsNotExist(err) && (flag&os.O_CREATE > 0) {
216219
file, err = m.Create(name)
217220
chmod = true

memmap_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,29 @@ func checkPathError(t *testing.T, err error, op string) {
104104
}
105105
}
106106

107+
// Ensure os.O_EXCL is correctly handled.
108+
func TestOpenFileExcl(t *testing.T) {
109+
const fileName = "/myFileTest"
110+
const fileMode = os.FileMode(0765)
111+
112+
fs := NewMemMapFs()
113+
114+
// First creation should succeed.
115+
f, err := fs.OpenFile(fileName, os.O_CREATE|os.O_EXCL, fileMode)
116+
if err != nil {
117+
t.Errorf("OpenFile Create Excl failed: %s", err)
118+
return
119+
}
120+
f.Close()
121+
122+
// Second creation should fail.
123+
_, err = fs.OpenFile(fileName, os.O_CREATE|os.O_EXCL, fileMode)
124+
if err == nil {
125+
t.Errorf("OpenFile Create Excl should have failed, but it didn't")
126+
}
127+
checkPathError(t, err, "Open")
128+
}
129+
107130
// Ensure Permissions are set on OpenFile/Mkdir/MkdirAll
108131
func TestPermSet(t *testing.T) {
109132
const fileName = "/myFileTest"

0 commit comments

Comments
 (0)