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 }