gitlab.com/SkynetLabs/skyd@v1.6.9/skymodules/renter/filesystem/siadir/dirreader.go (about)

     1  package siadir
     2  
     3  import (
     4  	"os"
     5  )
     6  
     7  // DirReader is a helper type that allows reading a raw .siadir from disk while
     8  // keeping the file in memory locked.
     9  type DirReader struct {
    10  	f  *os.File
    11  	sd *SiaDir
    12  }
    13  
    14  // Close closes the underlying file.
    15  func (sdr *DirReader) Close() error {
    16  	defer sdr.sd.mu.Unlock()
    17  	return sdr.f.Close()
    18  }
    19  
    20  // Read calls Read on the underlying file.
    21  func (sdr *DirReader) Read(b []byte) (int, error) {
    22  	return sdr.f.Read(b)
    23  }
    24  
    25  // Stat returns the FileInfo of the underlying file.
    26  func (sdr *DirReader) Stat() (os.FileInfo, error) {
    27  	return sdr.f.Stat()
    28  }
    29  
    30  // DirReader creates a io.ReadCloser that can be used to read the raw SiaDir
    31  // from disk.
    32  func (sd *SiaDir) DirReader() (*DirReader, error) {
    33  	sd.mu.Lock()
    34  	if sd.deleted {
    35  		sd.mu.Unlock()
    36  		return nil, ErrDeleted
    37  	}
    38  	// Open file.
    39  	f, err := os.Open(sd.mdPath())
    40  	if err != nil {
    41  		sd.mu.Unlock()
    42  		return nil, err
    43  	}
    44  	return &DirReader{
    45  		sd: sd,
    46  		f:  f,
    47  	}, nil
    48  }