diff --git a/src/gomd5/main.go b/src/gomd5/main.go index 05d948b134d9f47af2762b4cc870599e4fcc7df8..cff7521ff3338d42bceec8cc4d60f76e3ff1f351 100644 --- a/src/gomd5/main.go +++ b/src/gomd5/main.go @@ -9,26 +9,35 @@ import ( func main() { if len(os.Args) < 2 { - fmt.Println("Usage: gomd5 [file ...]") - } - files := os.Args[1:] - for _, file := range files { - if err := processFile(file); err != nil { + //If no file names are given, read from stdin + //Use CRTL-D to signal eof. + hash, err := processInput(os.Stdin) + if err != nil { fmt.Fprintf(os.Stderr, "gomd5: %v", err) + } else { + fmt.Printf("%x\n", hash) + } + } else { + files := os.Args[1:] + for _, file := range files { + f, err := os.Open(file) + if err != nil { + fmt.Fprintf(os.Stderr, "gomd5: %v", err) + } + hash, err := processInput(f) + if err != nil { + fmt.Fprintf(os.Stderr, "gomd5: %v", err) + } + f.Close() + fmt.Printf("%x\n", hash) } } } -func processFile(filename string) error { - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() +func processInput(input io.Reader) (string, error) { h := md5.New() - if _, err := io.Copy(h, f); err != nil { - return err + if _, err := io.Copy(h, input); err != nil { + return "", err } - fmt.Printf("%x\n", h.Sum(nil)) - return nil + return string(h.Sum(nil)), nil }