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  }