feat: Add support for O_TRUNC and O_APPEND flags

This commit is contained in:
Felicitas Pojtinger
2021-12-27 17:12:19 +01:00
parent 77060795e6
commit 04a4a4fa7e
4 changed files with 24 additions and 13 deletions

View File

@@ -203,6 +203,7 @@ var serveFTPCmd = &cobra.Command{
viper.GetString(cacheWriteFlag),
)
},
true, // FTP needs read permission for `STOR` command even if O_WRONLY is set
logger.PrintHeader,
)

View File

@@ -125,8 +125,9 @@ var serveHTTPCmd = &cobra.Command{
Metadata: metadataPersister,
},
"", // We never write
nil, // We never write
"", // We never write
nil, // We never write
false, // We never write
logger.PrintHeader,
)

View File

@@ -199,8 +199,6 @@ func (f *File) closeWithoutLocking() error {
}
func (f *File) enterWriteMode() error {
log.Println("File.enterWriteMode")
if f.readOpReader != nil || f.readOpWriter != nil {
if err := f.closeWithoutLocking(); err != nil {
return err
@@ -253,13 +251,16 @@ func (f *File) enterWriteMode() error {
}
}
// TODO: Don't do this if O_APPEND is set
if err := f.writeBuf.Truncate(0); err != nil {
return err
if f.flags.truncate {
if err := f.writeBuf.Truncate(0); err != nil {
return err
}
}
if _, err := f.writeBuf.Seek(0, io.SeekStart); err != nil {
return err
if !f.flags.append {
if _, err := f.writeBuf.Seek(0, io.SeekStart); err != nil {
return err
}
}
}

View File

@@ -30,8 +30,9 @@ type FileSystem struct {
metadata config.MetadataConfig
compressionLevel string
getFileBuffer func() (WriteCache, func() error, error)
compressionLevel string
getFileBuffer func() (WriteCache, func() error, error)
relaxedReadPermissions bool
onHeader func(hdr *models.Header)
}
@@ -44,6 +45,7 @@ func NewFileSystem(
compressionLevel string,
getFileBuffer func() (WriteCache, func() error, error),
ignorePermissionFlags bool,
onHeader func(hdr *models.Header),
) afero.Fs {
@@ -53,8 +55,9 @@ func NewFileSystem(
metadata: metadata,
compressionLevel: compressionLevel,
getFileBuffer: getFileBuffer,
compressionLevel: compressionLevel,
getFileBuffer: getFileBuffer,
relaxedReadPermissions: ignorePermissionFlags,
onHeader: onHeader,
}
@@ -196,6 +199,11 @@ func (f *FileSystem) OpenFile(name string, flag int, perm os.FileMode) (afero.Fi
flags.write = true
}
if flags.write && !flags.read && f.relaxedReadPermissions {
flags.read = true
flags.write = true
}
if flag&os.O_APPEND != 0 {
flags.append = true
}