]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cmd/nncp-daemon/main.go
Remove huge usage headers, -warranty exists anyway
[nncp.git] / src / cmd / nncp-daemon / main.go
index 88f7e20fec9dfa1c5692dfb04235ccf1171f3ba4..1ae9e94ead91954911041ee82c45742d17a84bf7 100644 (file)
@@ -1,6 +1,6 @@
 /*
 NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2022 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2023 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
@@ -24,6 +24,7 @@ import (
        "log"
        "net"
        "os"
+       "regexp"
        "strconv"
        "strings"
        "time"
@@ -35,8 +36,7 @@ import (
 )
 
 func usage() {
-       fmt.Fprintf(os.Stderr, nncp.UsageHeader())
-       fmt.Fprintf(os.Stderr, "nncp-daemon -- TCP daemon\n\n")
+       fmt.Fprint(os.Stderr, "nncp-daemon -- TCP daemon\n\n")
        fmt.Fprintf(os.Stderr, "Usage: %s [options]\nOptions:\n", os.Args[0])
        flag.PrintDefaults()
 }
@@ -105,6 +105,31 @@ func performSP(
        close(nodeIdC)
 }
 
+func startMCDTx(ctx *nncp.Ctx, port int, zeroInterval bool) error {
+       ifis, err := net.Interfaces()
+       if err != nil {
+               return err
+       }
+       for ifiReString, secs := range ctx.MCDTxIfis {
+               ifiRe, err := regexp.CompilePOSIX(ifiReString)
+               if err != nil {
+                       return err
+               }
+               var interval time.Duration
+               if !zeroInterval {
+                       interval = time.Duration(secs) * time.Second
+               }
+               for _, ifi := range ifis {
+                       if ifiRe.MatchString(ifi.Name) {
+                               if err = ctx.MCDTx(ifi.Name, port, interval); err != nil {
+                                       return err
+                               }
+                       }
+               }
+       }
+       return nil
+}
+
 func main() {
        var (
                cfgPath   = flag.String("cfg", nncp.DefaultCfgPath, "Path to configuration file")
@@ -132,6 +157,7 @@ func main() {
                autoTossNoExec = flag.Bool("autotoss-noexec", false, "Do not process \"exec\" packets during tossing")
                autoTossNoTrns = flag.Bool("autotoss-notrns", false, "Do not process \"trns\" packets during tossing")
                autoTossNoArea = flag.Bool("autotoss-noarea", false, "Do not process \"area\" packets during tossing")
+               autoTossNoACK  = flag.Bool("autotoss-noack", false, "Do not process \"ack\" packets during tossing")
        )
        log.SetFlags(log.Lshortfile)
        flag.Usage = usage
@@ -184,17 +210,20 @@ func main() {
                if *autoToss && nodeId != nil {
                        autoTossFinish, autoTossBadCode = ctx.AutoToss(
                                nodeId,
-                               nice,
-                               *autoTossDoSeen,
-                               *autoTossNoFile,
-                               *autoTossNoFreq,
-                               *autoTossNoExec,
-                               *autoTossNoTrns,
-                               *autoTossNoArea,
+                               &nncp.TossOpts{
+                                       Nice:   nice,
+                                       DoSeen: *autoTossDoSeen,
+                                       NoFile: *autoTossNoFile,
+                                       NoFreq: *autoTossNoFreq,
+                                       NoExec: *autoTossNoExec,
+                                       NoTrns: *autoTossNoTrns,
+                                       NoArea: *autoTossNoArea,
+                                       NoACK:  *autoTossNoACK,
+                               },
                        )
                }
                <-nodeIdC // call completion
-               if *autoToss {
+               if *autoToss && nodeId != nil {
                        close(autoTossFinish)
                        <-autoTossBadCode
                }
@@ -211,10 +240,8 @@ func main() {
                }
 
                if *mcdOnce {
-                       for ifiName := range ctx.MCDTxIfis {
-                               if err = ctx.MCDTx(ifiName, port, 0); err != nil {
-                                       log.Fatalln("Can not do MCD transmission:", err)
-                               }
+                       if err = startMCDTx(ctx, port, true); err != nil {
+                               log.Fatalln("Can not do MCD transmission:", err)
                        }
                        return
                }
@@ -223,13 +250,9 @@ func main() {
                if err != nil {
                        log.Fatalln("Can not listen:", err)
                }
-
-               for ifiName, secs := range ctx.MCDTxIfis {
-                       if err = ctx.MCDTx(ifiName, port, time.Duration(secs)*time.Second); err != nil {
-                               log.Fatalln("Can not run MCD transmission:", err)
-                       }
+               if err = startMCDTx(ctx, port, false); err != nil {
+                       log.Fatalln("Can not do MCD transmission:", err)
                }
-
                ln = netutil.LimitListener(ln, *maxConn)
                go func() {
                        for {
@@ -276,17 +299,20 @@ func main() {
                        if *autoToss && nodeId != nil {
                                autoTossFinish, autoTossBadCode = ctx.AutoToss(
                                        nodeId,
-                                       nice,
-                                       *autoTossDoSeen,
-                                       *autoTossNoFile,
-                                       *autoTossNoFreq,
-                                       *autoTossNoExec,
-                                       *autoTossNoTrns,
-                                       *autoTossNoArea,
+                                       &nncp.TossOpts{
+                                               Nice:   nice,
+                                               DoSeen: *autoTossDoSeen,
+                                               NoFile: *autoTossNoFile,
+                                               NoFreq: *autoTossNoFreq,
+                                               NoExec: *autoTossNoExec,
+                                               NoTrns: *autoTossNoTrns,
+                                               NoArea: *autoTossNoArea,
+                                               NoACK:  *autoTossNoACK,
+                                       },
                                )
                        }
                        <-nodeIdC // call completion
-                       if *autoToss {
+                       if *autoToss && nodeId != nil {
                                close(autoTossFinish)
                                <-autoTossBadCode
                        }