go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/connection/tar/file.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package tar 5 6 import ( 7 "archive/tar" 8 "bufio" 9 "errors" 10 "os" 11 "path/filepath" 12 "strings" 13 ) 14 15 type File struct { 16 path string 17 header *tar.Header 18 Fs *FS 19 reader *bufio.Reader 20 } 21 22 func (f *File) Name() string { 23 return f.path 24 } 25 26 func (f *File) Close() error { 27 return nil 28 } 29 30 func (f *File) Stat() (os.FileInfo, error) { 31 return f.Fs.stat(f.header) 32 } 33 34 func (f *File) Sync() error { 35 return errors.New("not implemented") 36 } 37 38 func (f *File) Truncate(size int64) error { 39 return errors.New("not implemented") 40 } 41 42 func (f *File) Read(b []byte) (n int, err error) { 43 if f.reader == nil { 44 return 0, errors.New("no tar data available") 45 } 46 return f.reader.Read(b) 47 } 48 49 func (f *File) ReadAt(b []byte, off int64) (n int, err error) { 50 return 0, errors.New("not implemented yet") 51 } 52 53 func (f *File) Readdir(n int) ([]os.FileInfo, error) { 54 fi := []os.FileInfo{} 55 // search all child items 56 for k := range f.Fs.FileMap { 57 entry := f.Fs.FileMap[k].Name 58 if strings.HasPrefix(Abs(entry), f.path) { 59 fi = append(fi, f.Fs.FileMap[k].FileInfo()) 60 } 61 } 62 return fi, nil 63 } 64 65 func (f *File) Readdirnames(n int) ([]string, error) { 66 fi := []string{} 67 // search all child items 68 for k := range f.Fs.FileMap { 69 entry := f.Fs.FileMap[k].Name 70 71 if strings.HasPrefix(Abs(entry), f.path) { 72 // extract file name 73 rel, err := filepath.Rel(f.path, Abs(entry)) 74 if err != nil { 75 return nil, err 76 } 77 78 // skip own path 79 if rel == "." { 80 continue 81 } 82 83 // log.Debug().Str("entry", Abs(entry)).Str("path", f.path).Str("rel", rel).Msg("rel") 84 fi = append(fi, rel) 85 } 86 } 87 return fi, nil 88 } 89 90 func (f *File) Seek(offset int64, whence int) (int64, error) { 91 return 0, errors.New("seek not implemented") 92 } 93 94 func (f *File) Write(b []byte) (n int, err error) { 95 return 0, errors.New("write not implemented") 96 } 97 98 func (f *File) WriteAt(b []byte, off int64) (n int, err error) { 99 return 0, errors.New("writeat not implemented") 100 } 101 102 func (f *File) WriteString(s string) (ret int, err error) { 103 return 0, errors.New("writestring not implemented") 104 }