func saveDownload(filenames []string, oid string, r io.Reader) (err error) { var w io.Writer switch { case *dlNoop: w = ioutil.Discard case *dlLink: basefn := filenames[0] f, er := os.Create(basefn) if er != nil { er = os.MkdirAll(filepath.Dir(basefn), 0777) if er != nil { return er } f, er = os.Create(basefn) } defer errutil.AppendCall(&err, f.Close) w = f for _, fn := range filenames[1:] { er := os.Link(basefn, fn) switch { case os.IsExist(er): // Don't care, we've already got it er = nil case er != nil: er = os.MkdirAll(filepath.Dir(fn), 0777) if er != nil { return er } er = os.Link(basefn, fn) default: } if er != nil { return er } cbfstool.Verbose(*dlverbose, "Linked %s -> %v", fn, basefn) } default: ws := []io.Writer{} for _, fn := range filenames { f, er := os.Create(fn) if er != nil { er = os.MkdirAll(filepath.Dir(fn), 0777) if er != nil { return er } f, er = os.Create(fn) } if er != nil { return er } defer errutil.AppendCall(&err, f.Close) ws = append(ws, f) } w = io.MultiWriter(ws...) } n, err := io.Copy(w, r) if err == nil { atomic.AddInt64(&totalBytes, n) cbfstool.Verbose(*dlverbose, "Downloaded %s into %v", humanize.Bytes(uint64(n)), strings.Join(filenames, ", ")) } else { log.Printf("Error downloading %v (for %v): %v", oid, filenames, err) } return err }
func (r *readerClosers) Close() (err error) { for _, c := range r.closers { errutil.AppendCall(&err, c.Close) } return }