123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package main
- import (
- "flag"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
- "github.com/klauspost/reedsolomon"
- )
- var dataShards = flag.Int("data", 4, "Number of shards to split the data into, must be below 257.")
- var parShards = flag.Int("par", 2, "Number of parity shards")
- var outDir = flag.String("out", "", "Alternative output directory")
- func init() {
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
- fmt.Fprintf(os.Stderr, " simple-encoder [-flags] filename.ext\n\n")
- fmt.Fprintf(os.Stderr, "Valid flags:\n")
- flag.PrintDefaults()
- }
- }
- func main() {
-
- flag.Parse()
- args := flag.Args()
- if len(args) != 1 {
- fmt.Fprintf(os.Stderr, "Error: No input filename given\n")
- flag.Usage()
- os.Exit(1)
- }
- if *dataShards > 257 {
- fmt.Fprintf(os.Stderr, "Error: Too many data shards\n")
- os.Exit(1)
- }
- fname := args[0]
-
- enc, err := reedsolomon.New(*dataShards, *parShards)
- checkErr(err)
- fmt.Println("Opening", fname)
- b, err := ioutil.ReadFile(fname)
- checkErr(err)
-
- shards, err := enc.Split(b)
- checkErr(err)
- fmt.Printf("File split into %d data+parity shards with %d bytes/shard.\n", len(shards), len(shards[0]))
-
- err = enc.Encode(shards)
- checkErr(err)
-
- dir, file := filepath.Split(fname)
- if *outDir != "" {
- dir = *outDir
- }
- for i, shard := range shards {
- outfn := fmt.Sprintf("%s.%d", file, i)
- fmt.Println("Writing to", outfn)
- err = ioutil.WriteFile(filepath.Join(dir, outfn), shard, os.ModePerm)
- checkErr(err)
- }
- }
- func checkErr(err error) {
- if err != nil {
- fmt.Fprintf(os.Stderr, "Error: %s", err.Error())
- os.Exit(2)
- }
- }
|