package layer import "io" type mountedLayer struct { name string mountID string initID string parent *roLayer path string layerStore *layerStore activityCount int } func (ml *mountedLayer) cacheParent() string { if ml.initID != "" { return ml.initID } if ml.parent != nil { return ml.parent.cacheID } return "" } func (ml *mountedLayer) TarStream() (io.Reader, error) { archiver, err := ml.layerStore.driver.Diff(ml.mountID, ml.cacheParent()) if err != nil { return nil, err } return autoClosingReader{archiver}, nil } func (ml *mountedLayer) Path() (string, error) { if ml.path == "" { return "", ErrNotMounted } return ml.path, nil } func (ml *mountedLayer) Parent() Layer { if ml.parent != nil { return ml.parent } // Return a nil interface instead of an interface wrapping a nil // pointer. return nil } func (ml *mountedLayer) Size() (int64, error) { return ml.layerStore.driver.DiffSize(ml.mountID, ml.cacheParent()) } type autoClosingReader struct { source io.ReadCloser } func (r autoClosingReader) Read(p []byte) (n int, err error) { n, err = r.source.Read(p) if err != nil { r.source.Close() } return }