github.com/naohirotamura/u-root@v7.0.0+incompatible/cmds/core/md5sum/md5sum.go (about)

     1  // Copyright 2018 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  // md5sum prints an md5 hash generated from file contents.
     6  package main
     7  
     8  import (
     9  	"crypto/md5"
    10  	"fmt"
    11  	"io"
    12  	"io/ioutil"
    13  	"log"
    14  	"os"
    15  
    16  	"github.com/spf13/pflag"
    17  )
    18  
    19  func getInput() (input []byte, err error) {
    20  	return ioutil.ReadAll(os.Stdin)
    21  }
    22  
    23  func helpPrinter() {
    24  	fmt.Printf("Usage:\nmd5sum <File Name>\n")
    25  	pflag.PrintDefaults()
    26  	os.Exit(0)
    27  }
    28  
    29  func versionPrinter() {
    30  	fmt.Println("md5sum utility, URoot Version.")
    31  	os.Exit(0)
    32  }
    33  
    34  func calculateMd5Sum(fileName string, data []byte) string {
    35  	if len(data) > 0 {
    36  		return fmt.Sprintf("%x", md5.Sum(data))
    37  	}
    38  
    39  	fileDesc, err := os.Open(fileName)
    40  	if err != nil {
    41  		log.Fatal(err)
    42  	}
    43  	defer fileDesc.Close()
    44  
    45  	md5Generator := md5.New()
    46  	if _, err := io.Copy(md5Generator, fileDesc); err != nil {
    47  		log.Fatal(err)
    48  	}
    49  
    50  	md5Sum := fmt.Sprintf("%x", md5Generator.Sum(nil))
    51  	return md5Sum
    52  }
    53  
    54  func main() {
    55  	var (
    56  		help    bool
    57  		version bool
    58  		input   []byte
    59  		err     error
    60  	)
    61  	cliArgs := ""
    62  	pflag.BoolVarP(&help, "help", "h", false, "Show this help and exit")
    63  	pflag.BoolVarP(&version, "version", "v", false, "Print Version")
    64  	pflag.Parse()
    65  
    66  	if help {
    67  		helpPrinter()
    68  	}
    69  
    70  	if version {
    71  		versionPrinter()
    72  	}
    73  
    74  	if len(os.Args) >= 2 {
    75  		cliArgs = os.Args[1]
    76  	}
    77  	if cliArgs == "" {
    78  		input, err = getInput()
    79  		if err != nil {
    80  			fmt.Println("Error getting input.")
    81  			os.Exit(-1)
    82  		}
    83  	}
    84  	fmt.Printf("%s ", calculateMd5Sum(cliArgs, input))
    85  	if cliArgs == "" {
    86  		fmt.Printf(" -\n")
    87  	} else {
    88  		fmt.Printf(" %s\n", cliArgs)
    89  	}
    90  	os.Exit(0)
    91  }