package ffiwrapper import ( "io" "os" "sync" "golang.org/x/xerrors" ) func ToReadableFile(r io.Reader, n int64) (*os.File, func() error, error) { f, ok := r.(*os.File) if ok { return f, func() error { return nil }, nil } var w *os.File f, w, err := os.Pipe() if err != nil { return nil, nil, err } var wait sync.Mutex var werr error wait.Lock() go func() { defer wait.Unlock() var copied int64 copied, werr = io.CopyN(w, r, n) if werr != nil { log.Warnf("toReadableFile: copy error: %+v", werr) } err := w.Close() if werr == nil && err != nil { werr = err log.Warnf("toReadableFile: close error: %+v", err) return } if copied != n { log.Warnf("copied different amount than expected: %d != %d", copied, n) werr = xerrors.Errorf("copied different amount than expected: %d != %d", copied, n) } }() return f, func() error { wait.Lock() return werr }, nil }