github.com/rck/u-root@v0.0.0-20180106144920-7eb602e381bb/cmds/gpt/gpt.go (about)

     1  // Copyright 2016-2017 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // gpt reads and writes GPT headers.
     6  //
     7  // Synopsis:
     8  //     gpt [-w] file
     9  //
    10  // Description:
    11  //     For -w, it reads a JSON formatted GPT from stdin, and writes 'file'
    12  //     which is usually a device. It writes both primary and secondary headers.
    13  //
    14  //     Otherwise it just writes the headers to stdout in JSON format.
    15  package main
    16  
    17  import (
    18  	"encoding/json"
    19  	"flag"
    20  	"fmt"
    21  	"log"
    22  	"os"
    23  
    24  	"github.com/u-root/u-root/pkg/gpt"
    25  )
    26  
    27  const cmd = "gpt [options] file"
    28  
    29  var (
    30  	write = flag.Bool("w", false, "Write GPT to file")
    31  )
    32  
    33  func init() {
    34  	defUsage := flag.Usage
    35  	flag.Usage = func() {
    36  		os.Args[0] = cmd
    37  		defUsage()
    38  		os.Exit(1)
    39  	}
    40  }
    41  
    42  func main() {
    43  	flag.Parse()
    44  	if flag.NArg() != 1 {
    45  		flag.Usage()
    46  	}
    47  
    48  	m := os.O_RDONLY
    49  	if *write {
    50  		m = os.O_RDWR
    51  	}
    52  
    53  	n := flag.Args()[0]
    54  	f, err := os.OpenFile(n, m, 0)
    55  	if err != nil {
    56  		log.Fatal(err)
    57  	}
    58  
    59  	switch *write {
    60  	case true:
    61  		var g = make([]gpt.GPT, 2)
    62  		if err := json.NewDecoder(os.Stdin).Decode(&g); err != nil {
    63  			log.Fatalf("Reading in JSON: %v", err)
    64  		}
    65  		if err := gpt.Write(f, &g[0]); err != nil {
    66  			log.Fatalf("Writing %v: %v", n, err)
    67  		}
    68  		if err := gpt.Write(f, &g[1]); err != nil {
    69  			log.Fatalf("Writing %v: %v", n, err)
    70  		}
    71  	default:
    72  		// We might get one back, we might get both.
    73  		// In the event of an error, we show what we can
    74  		// so you can at least see what went wrong.
    75  		g, b, err := gpt.New(f)
    76  		if g == nil {
    77  			log.Fatal(err)
    78  		}
    79  		if b == nil {
    80  			log.Fatalf("Primary found: %s\nBut no backup GPT found: %v", g, err)
    81  		}
    82  		// Emit this as a JSON array. Suggestions welcome on better ways to do this.
    83  		fmt.Printf("[\n%s,\n", g.String())
    84  		fmt.Printf("%s\n]\n", b.String())
    85  		if err != nil {
    86  			log.Fatal(err)
    87  		}
    88  
    89  	}
    90  }