sftpFileUtil.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package sftpfs
  2. import (
  3. "io"
  4. "io/fs"
  5. "os"
  6. "github.com/pkg/sftp"
  7. "imuslab.com/arozos/mod/filesystem/arozfs"
  8. )
  9. /*
  10. SFTP File
  11. Converting the *sftp.File into arozos.File compatible types
  12. */
  13. type sftpFsFile struct {
  14. file *sftp.File
  15. isDir bool
  16. dirEntries []fs.DirEntry
  17. }
  18. func newSftpFsFile(wrappingFile *sftp.File, isDir bool, dirEntries []fs.DirEntry) *sftpFsFile {
  19. return &sftpFsFile{
  20. file: wrappingFile,
  21. isDir: isDir,
  22. dirEntries: dirEntries,
  23. }
  24. }
  25. func (f *sftpFsFile) Chdir() error {
  26. return arozfs.ErrOperationNotSupported
  27. }
  28. func (f *sftpFsFile) Chmod(mode os.FileMode) error {
  29. return arozfs.ErrOperationNotSupported
  30. }
  31. func (f *sftpFsFile) Chown(uid, gid int) error {
  32. return arozfs.ErrOperationNotSupported
  33. }
  34. func (f *sftpFsFile) Close() error {
  35. return f.file.Close()
  36. }
  37. func (f *sftpFsFile) Name() string {
  38. return f.file.Name()
  39. }
  40. func (f *sftpFsFile) Read(b []byte) (n int, err error) {
  41. return f.file.Read(b)
  42. }
  43. func (f *sftpFsFile) ReadAt(b []byte, off int64) (n int, err error) {
  44. return f.file.ReadAt(b, off)
  45. }
  46. func (f *sftpFsFile) Readdirnames(n int) (names []string, err error) {
  47. results := []string{}
  48. for _, entry := range f.dirEntries {
  49. results = append(results, entry.Name())
  50. }
  51. return results, nil
  52. }
  53. func (f *sftpFsFile) ReadDir(n int) ([]fs.DirEntry, error) {
  54. if f.isDir {
  55. return f.dirEntries, nil
  56. }
  57. return []fs.DirEntry{}, nil
  58. }
  59. func (f *sftpFsFile) ReadFrom(r io.Reader) (n int64, err error) {
  60. return f.file.ReadFrom(r)
  61. }
  62. func (f *sftpFsFile) Readdir(n int) ([]fs.FileInfo, error) {
  63. return []fs.FileInfo{}, nil
  64. }
  65. func (f *sftpFsFile) Seek(offset int64, whence int) (ret int64, err error) {
  66. return f.file.Seek(offset, whence)
  67. }
  68. func (f *sftpFsFile) Stat() (fs.FileInfo, error) {
  69. return f.file.Stat()
  70. }
  71. func (f *sftpFsFile) Sync() error {
  72. return f.file.Sync()
  73. }
  74. func (f *sftpFsFile) Truncate(size int64) error {
  75. return f.file.Truncate(size)
  76. }
  77. func (f *sftpFsFile) Write(b []byte) (n int, err error) {
  78. return f.file.Write(b)
  79. }
  80. func (f *sftpFsFile) WriteAt(b []byte, off int64) (n int, err error) {
  81. return f.file.WriteAt(b, off)
  82. }
  83. func (f *sftpFsFile) WriteString(s string) (n int, err error) {
  84. return f.file.Write([]byte(s))
  85. }
  86. /*
  87. SFTP DirEntry
  88. Converting the legacy os.FileInfo into arozos required
  89. fs.DirEntry for sftp client readDir returned values
  90. */
  91. type SftpDirEntry struct {
  92. finfo fs.FileInfo
  93. }
  94. func newDirEntryFromFileInfo(targetFileInfo fs.FileInfo) *SftpDirEntry {
  95. return &SftpDirEntry{
  96. finfo: targetFileInfo,
  97. }
  98. }
  99. func (de SftpDirEntry) Name() string {
  100. return de.finfo.Name()
  101. }
  102. func (de SftpDirEntry) IsDir() bool {
  103. return de.finfo.IsDir()
  104. }
  105. func (de SftpDirEntry) Type() fs.FileMode {
  106. return de.finfo.Mode()
  107. }
  108. func (de SftpDirEntry) Info() (fs.FileInfo, error) {
  109. return de.finfo, nil
  110. }