feat: Add support for O_TRUNC and O_APPEND flags
This commit is contained in:
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user