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), viper.GetString(cacheWriteFlag),
) )
}, },
true, // FTP needs read permission for `STOR` command even if O_WRONLY is set
logger.PrintHeader, logger.PrintHeader,
) )

View File

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

View File

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

View File

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