From 04a4a4fa7eb1c8d1044d717a657606ee58b2778f Mon Sep 17 00:00:00 2001 From: Felicitas Pojtinger Date: Mon, 27 Dec 2021 17:12:19 +0100 Subject: [PATCH] feat: Add support for `O_TRUNC` and `O_APPEND` flags --- cmd/stfs/cmd/serve_ftp.go | 1 + cmd/stfs/cmd/serve_http.go | 5 +++-- internal/fs/file.go | 15 ++++++++------- internal/fs/filesystem.go | 16 ++++++++++++---- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index 5dc5d8a..30508a6 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -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, ) diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index 0feeebd..0cc1953 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -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, ) diff --git a/internal/fs/file.go b/internal/fs/file.go index 5dc8228..5a7db3d 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -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 + } } } diff --git a/internal/fs/filesystem.go b/internal/fs/filesystem.go index 473b784..b73ddbe 100644 --- a/internal/fs/filesystem.go +++ b/internal/fs/filesystem.go @@ -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 }