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
 }