]> Sergey Matveev's repositories - btrtrc.git/commitdiff
cmd/tracker-announce: Rework for better utility in shell scripts
authorMatt Joiner <anacrolix@gmail.com>
Tue, 12 May 2020 01:31:56 +0000 (11:31 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Tue, 12 May 2020 01:31:56 +0000 (11:31 +1000)
cmd/tracker-announce/main.go

index bfe12143e4a2cfe95a91bbf381dd31a600df3a17..6f63b295b583527bbdcf72fef8ab92e878f8f537 100644 (file)
@@ -3,8 +3,10 @@ package main
 import (
        "log"
        "net/url"
+       "os"
        "strings"
        "sync"
+       "sync/atomic"
 
        "github.com/davecgh/go-spew/spew"
 
@@ -36,39 +38,47 @@ func main() {
                Port: 50007,
        }
        tagflag.Parse(&flags)
-       ar := tracker.AnnounceRequest{
-               NumWant: -1,
-               Left:    -1,
-               Port:    flags.Port,
-       }
+       var exitCode int32
        var wg sync.WaitGroup
        for _, arg := range flags.Torrents {
                ts, err := argSpec(arg)
                if err != nil {
                        log.Fatal(err)
                }
-               ar.InfoHash = ts.InfoHash
                for _, tier := range ts.Trackers {
                        for _, tURI := range tier {
+                               ar := tracker.AnnounceRequest{
+                                       NumWant:  -1,
+                                       Left:     -1,
+                                       Port:     flags.Port,
+                                       InfoHash: ts.InfoHash,
+                               }
                                wg.Add(1)
-                               go doTracker(tURI, wg.Done, ar)
+                               go func(tURI string) {
+                                       defer wg.Done()
+                                       if doTracker(tURI, ar) {
+                                               atomic.StoreInt32(&exitCode, 1)
+                                       }
+                               }(tURI)
                        }
                }
        }
        wg.Wait()
+       os.Exit(int(exitCode))
 }
 
-func doTracker(tURI string, done func(), ar tracker.AnnounceRequest) {
-       defer done()
+func doTracker(tURI string, ar tracker.AnnounceRequest) (hadError bool) {
        for _, res := range announces(tURI, ar) {
                err := res.error
                resp := res.AnnounceResponse
                if err != nil {
+                       hadError = true
                        log.Printf("error announcing to %q: %s", tURI, err)
                        continue
                }
-               log.Printf("tracker response from %q: %s", tURI, spew.Sdump(resp))
+               spew.Dump(resp)
        }
+       return
 }
 
 type announceResult struct {