// BuildSquashfsSnap the given sourceDirectory and return the generated // snap file func BuildSquashfsSnap(sourceDir, targetDir string) (string, error) { // create build dir buildDir, err := ioutil.TempDir("", "snappy-build-") if err != nil { return "", err } defer os.RemoveAll(buildDir) snapName, err := prepare(sourceDir, targetDir, buildDir) if err != nil { return "", err } d := squashfs.New(snapName) if err = d.Build(buildDir); err != nil { return "", err } return snapName, nil }
// Open opens a given snap file with the right backend func Open(path string) (File, error) { f, err := os.Open(path) if err != nil { return nil, fmt.Errorf("cannot open snap: %v", err) } defer f.Close() // look, libmagic! header := make([]byte, 20) if _, err := f.ReadAt(header, 0); err != nil { return nil, fmt.Errorf("cannot read snap: %v", err) } // Note that we only support little endian squashfs. There // is nothing else with squashfs 4.0. if bytes.HasPrefix(header, []byte{'h', 's', 'q', 's'}) { return squashfs.New(path), nil } if strings.HasPrefix(string(header), "!<arch>\ndebian") { return clickdeb.Open(path) } return nil, fmt.Errorf("cannot open snap: unknown header: %q", header) }