blob: d8f9ffe99bb3adaee274d1c7d276ecc336587990 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// installblob takes a file by path or by stdin and writes it to blobfs.
package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"fuchsia.googlesource.com/merkle"
)
var (
from = flag.String("from", "", "Path of file to read from")
blob = flag.String("blob", "/blob", "Blobfs mount to write to")
merkleroot = flag.String("merkleroot", "", "optional: merkle root, if known")
size = flag.Int64("size", -1, "Size, if known")
)
func getSize(path string) int64 {
fi, err := os.Stat(path)
if err != nil {
log.Fatal(err)
}
return fi.Size()
}
func getMerkleroot(path string) (int64, string) {
f, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
var t merkle.Tree
sz, err := t.ReadFrom(f)
if err != nil {
log.Fatal(err)
}
return sz, fmt.Sprintf("%x", t.Root())
}
func main() {
flag.Parse()
// TODO(TO-583) remove once Go on fuchsia returns to logging to stdio
log.SetOutput(os.Stdout)
var input io.Reader = os.Stdin
// If *from is empty, the user might be trying to stream via stdin, in which
// case, we need a merkleroot and size.
if *from == "" {
if len(*merkleroot) != 64 {
log.Fatal("if flag -from is not given, flag -merkleroot of lenght 64 is required")
}
if *size < 0 {
log.Fatal("if flag -from is not given, flag -size is required")
}
} else {
if *merkleroot == "" {
*size, *merkleroot = getMerkleroot(*from)
}
if *size < 0 {
*size = getSize(*from)
}
var err error
input, err = os.Open(*from)
if err != nil {
log.Fatal(err)
}
}
output, err := os.Create(filepath.Join(*blob, *merkleroot))
if err != nil {
log.Fatal(err)
}
if err := output.Truncate(*size); err != nil {
log.Fatal(err)
}
if _, err := io.Copy(output, input); err != nil {
log.Fatal(err)
}
if err := output.Close(); err != nil {
log.Fatal(err)
}
}