blob: 452c3042d6b6ea8f3f68722026edf0650fd12960 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"archive/tar"
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
func extractTarFile(basePath string, reader *tar.Reader) error {
for {
header, err := reader.Next()
if err == io.EOF {
return nil
} else if err != nil {
return err
}
// If it's a directory, ignore it. We use MkdirAll on all files anyway.
if header.FileInfo().IsDir() {
continue
}
fullPath := filepath.Join(basePath, header.Name)
if err := os.MkdirAll(filepath.Dir(fullPath), os.FileMode(0755)); err != nil {
return err
}
f, err := os.OpenFile(fullPath, os.O_CREATE|os.O_WRONLY, os.FileMode(header.Mode))
if err != nil {
return err
}
n, err := io.Copy(f, reader)
if err != nil {
return err
}
if n != header.Size {
return fmt.Errorf("while reading %s from archive, wrote %d bytes but was expecting to write %d", header.Name, header.Size, n)
}
}
}
func extractVDLRootData(destDir string) error {
r := strings.NewReader(builtinVDLRootData)
gzipReader, err := gzip.NewReader(r)
if err != nil {
return err
}
tarReader := tar.NewReader(gzipReader)
return extractTarFile(destDir, tarReader)
}