diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index 50ba1c9..05475b0 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -193,6 +193,7 @@ var serveFTPCmd = &cobra.Command{ ) }, viper.GetBool(readOnlyFlag), + true, // FTP requires read permission even if `O_WRONLY` is set if cache is enabled func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index ae96b2d..64610f2 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -128,9 +128,10 @@ var serveHTTPCmd = &cobra.Command{ Metadata: metadataPersister, }, - "", // We never write - nil, // We never write - true, // We never write + "", // We never write + nil, // We never write + true, // We never write + false, // We never write func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) diff --git a/examples/full/main.go b/examples/full/main.go index e372356..be0b1bf 100644 --- a/examples/full/main.go +++ b/examples/full/main.go @@ -172,6 +172,7 @@ func createFs( ) }, readOnly, + false, func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) diff --git a/examples/simple/main.go b/examples/simple/main.go index 427dea8..59a57e5 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -99,6 +99,7 @@ func main() { ) }, false, + false, func(hdr *config.Header) { l.Trace("Header transform", hdr) diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 6029d6d..6efb8cc 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -34,6 +34,7 @@ type STFS struct { compressionLevel string getFileBuffer func() (cache.WriteCache, func() error, error) readOnly bool + writeImpliesRead bool ioLock sync.Mutex @@ -50,6 +51,7 @@ func NewSTFS( compressionLevel string, getFileBuffer func() (cache.WriteCache, func() error, error), readOnly bool, + writeImpliesRead bool, onHeader func(hdr *config.Header), log logging.StructuredLogger, @@ -63,6 +65,7 @@ func NewSTFS( compressionLevel: compressionLevel, getFileBuffer: getFileBuffer, readOnly: readOnly, + writeImpliesRead: writeImpliesRead, onHeader: onHeader, log: log, @@ -373,6 +376,10 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er if (flag & O_ACCMODE) == os.O_RDONLY { flags.Read = true } else if (flag & O_ACCMODE) == os.O_WRONLY { + if f.writeImpliesRead { + flags.Read = true + } + flags.Write = true } else if (flag & O_ACCMODE) == os.O_RDWR { flags.Read = true diff --git a/pkg/fs/filesystem_test.go b/pkg/fs/filesystem_test.go index 10432d0..8d3457a 100644 --- a/pkg/fs/filesystem_test.go +++ b/pkg/fs/filesystem_test.go @@ -407,6 +407,7 @@ func createSTFS( ) }, readOnly, + false, func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr)