Beispiel #1
0
func (r *readerClosers) Close() (err error) {
	for _, c := range r.closers {
		errutil.AppendCall(&err, c.Close)
	}
	return
}
Beispiel #2
0
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
}