feat: Support O_CREATE and O_EXCL flags

This commit is contained in:
Felicitas Pojtinger
2021-12-27 17:18:41 +01:00
parent 04a4a4fa7e
commit cd07daf2b5
2 changed files with 20 additions and 30 deletions

View File

@@ -37,11 +37,8 @@ type FileFlags struct {
read bool
write bool
append bool
createIfNotExists bool
mostNotExist bool // If `create` is set, abort if file already exists
sync bool // Sync after each operation
truncate bool
append bool
truncate bool
}
type File struct {

View File

@@ -208,18 +208,6 @@ func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.Fi
flags.append = true
}
if flag&os.O_CREATE != 0 {
flags.createIfNotExists = true
}
if flag&os.O_EXCL != 0 {
flags.mostNotExist = true
}
if flag&os.O_SYNC != 0 {
flags.sync = true
}
if flag&os.O_TRUNC != 0 {
flags.truncate = true
}
@@ -232,21 +220,26 @@ func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.Fi
f.onHeader,
)
if err != nil {
if err == sql.ErrNoRows && flags.createIfNotExists {
if err := f.mknode(false, name, perm); err != nil {
return nil, err
if err == sql.ErrNoRows {
if flag&os.O_CREATE != 0 && flag&os.O_EXCL == 0 {
if err := f.mknode(false, name, perm); err != nil {
return nil, err
}
hdr, err = inventory.Stat(
f.metadata,
name,
f.onHeader,
)
if err != nil {
return nil, err
}
} else {
return nil, os.ErrNotExist
}
hdr, err = inventory.Stat(
f.metadata,
name,
f.onHeader,
)
if err != nil {
return nil, err
}
} else {
return nil, err
}