]> Sergey Matveev's repositories - meta4ra.git/blobdiff - cmd/meta4ra/hash.go
*-hashes-detect, *-hash, *-check -stdin/-all-hashes, optional builtins
[meta4ra.git] / cmd / meta4ra / hash.go
diff --git a/cmd/meta4ra/hash.go b/cmd/meta4ra/hash.go
new file mode 100644 (file)
index 0000000..266aa61
--- /dev/null
@@ -0,0 +1,63 @@
+// meta4ra -- Metalink 4.0 utilities
+// Copyright (C) 2021-2024 Sergey Matveev <stargrave@stargrave.org>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, version 3 of the License.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+package main
+
+import (
+       "bufio"
+       "flag"
+       "fmt"
+       "io"
+       "log"
+       "os"
+       "strings"
+
+       meta4ra "go.stargrave.org/meta4ra/internal"
+)
+
+func runHash() {
+       hashes := flag.String("hashes", meta4ra.HashesDefault,
+               "hash-name:commandline[,...]")
+       flag.Usage = func() {
+               fmt.Fprintf(flag.CommandLine.Output(),
+                       "Usage: %s [-hashes ...] < data | read hash name\n", os.Args[0])
+               flag.PrintDefaults()
+               fmt.Fprint(flag.CommandLine.Output(), `
+Only the first hash from -hashes will be used.
+`)
+       }
+       flag.Parse()
+
+       hsh := *hashes
+       if i := strings.Index(hsh, ","); i != -1 {
+               hsh = hsh[:i]
+       }
+       hasher, err := meta4ra.NewHasher(hsh)
+       if err != nil {
+               log.Fatalln(err)
+       }
+       if err = hasher.Start(); err != nil {
+               log.Fatalln(err)
+       }
+       if _, err = io.Copy(hasher, bufio.NewReaderSize(
+               os.Stdin, meta4ra.BufLen)); err != nil {
+               log.Fatalln(err)
+       }
+       sums, err := hasher.Sums()
+       if err != nil {
+               log.Fatalln(err)
+       }
+       fmt.Println(sums[0].Hash, sums[0].Type)
+}