func maybeDecompress(rs io.ReadSeeker) (io.Reader, error) { // TODO(jonboulle): this is a bit redundant with detectValType typ, err := aci.DetectFileType(rs) if err != nil { return nil, err } if _, err := rs.Seek(0, 0); err != nil { return nil, err } var r io.Reader switch typ { case aci.TypeGzip: r, err = gzip.NewReader(rs) if err != nil { return nil, fmt.Errorf("error reading gzip: %v", err) } case aci.TypeBzip2: r = bzip2.NewReader(rs) case aci.TypeXz: r = aci.XzReader(rs) case aci.TypeTar: r = rs case aci.TypeUnknown: return nil, errors.New("unknown filetype") default: // should never happen panic(fmt.Sprintf("bad type returned from DetectFileType: %v", typ)) } return r, nil }
// unpackRootfs unpacks a stage1 rootfs (compressed file, pointed to by rfs) // into dir, returning any error encountered func unpackRootfs(rfs string, dir string) error { fh, err := os.Open(rfs) if err != nil { return fmt.Errorf("error opening stage1 rootfs: %v", err) } typ, err := aci.DetectFileType(fh) if err != nil { return fmt.Errorf("error detecting image type: %v", err) } if _, err := fh.Seek(0, 0); err != nil { return fmt.Errorf("error seeking image: %v", err) } var r io.Reader switch typ { case aci.TypeGzip: r, err = gzip.NewReader(fh) if err != nil { return fmt.Errorf("error reading gzip: %v", err) } case aci.TypeBzip2: r = bzip2.NewReader(fh) case aci.TypeXz: r = aci.XzReader(fh) case aci.TypeTar: r = fh case aci.TypeUnknown: return fmt.Errorf("error: unknown image filetype") default: // should never happen panic("no type returned from DetectFileType?") } return untarRootfs(r, dir) }