]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cfgdir.go
Generate ACKs during tossing
[nncp.git] / src / cfgdir.go
index de45a7d10a546428a6e4a614c0da165b6352a9e5..fc36636c051990ef8e6e382992e6ebb7f094f332 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
@@ -18,8 +18,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package nncp
 
 import (
+       "errors"
        "fmt"
-       "io/ioutil"
+       "io/fs"
        "os"
        "path/filepath"
        "sort"
@@ -65,7 +66,7 @@ func cfgDirSave(v interface{}, dst ...string) error {
        if strings.HasSuffix(dst[len(dst)-1], "prv") {
                mode = os.FileMode(0600)
        }
-       return ioutil.WriteFile(filepath.Join(dst...), []byte(r+"\n"), mode)
+       return os.WriteFile(filepath.Join(dst...), []byte(r+"\n"), mode)
 }
 
 func cfgDirTouch(dst ...string) error {
@@ -259,6 +260,24 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) {
                        }
                }
 
+               if n.ACK != nil {
+                       if err = cfgDirMkdir(dst, "neigh", name, "ack"); err != nil {
+                               return
+                       }
+                       if err = cfgDirSave(
+                               n.ACK.MinSize,
+                               dst, "neigh", name, "ack", "minsize",
+                       ); err != nil {
+                               return
+                       }
+                       if err = cfgDirSave(
+                               n.ACK.Nice,
+                               dst, "neigh", name, "ack", "nice",
+                       ); err != nil {
+                               return
+                       }
+               }
+
                if len(n.Via) > 0 {
                        if err = cfgDirSave(
                                strings.Join(n.Via, "\n"),
@@ -371,6 +390,16 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) {
                                        return
                                }
                        }
+                       if call.AutoTossNoACK {
+                               if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-noack"); err != nil {
+                                       return
+                               }
+                       }
+                       if call.AutoTossGenACK {
+                               if err = cfgDirTouch(dst, "neigh", name, "calls", is, "autotoss-gen-ack"); err != nil {
+                                       return
+                               }
+                       }
                }
        }
 
@@ -433,9 +462,9 @@ func CfgToDir(dst string, cfg *CfgJSON) (err error) {
 }
 
 func cfgDirLoad(src ...string) (v string, exists bool, err error) {
-       b, err := ioutil.ReadFile(filepath.Join(src...))
+       b, err := os.ReadFile(filepath.Join(src...))
        if err != nil {
-               if os.IsNotExist(err) {
+               if errors.Is(err, fs.ErrNotExist) {
                        return "", false, nil
                }
                return "", false, err
@@ -531,8 +560,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.MCDRxIfis = strings.Split(*sp, "\n")
        }
 
-       fis, err := ioutil.ReadDir(filepath.Join(src, "mcd-send"))
-       if err != nil && !os.IsNotExist(err) {
+       fis, err := os.ReadDir(filepath.Join(src, "mcd-send"))
+       if err != nil && !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
        if len(fis) > 0 {
@@ -543,7 +572,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                if n[0] == '.' {
                        continue
                }
-               b, err := ioutil.ReadFile(filepath.Join(src, "mcd-send", fi.Name()))
+               b, err := os.ReadFile(filepath.Join(src, "mcd-send", fi.Name()))
                if err != nil {
                        return nil, err
                }
@@ -565,8 +594,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        return nil, err
                }
        }
-       fis, err = ioutil.ReadDir(filepath.Join(src, "notify", "exec"))
-       if err != nil && !os.IsNotExist(err) {
+       fis, err = os.ReadDir(filepath.Join(src, "notify", "exec"))
+       if err != nil && !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
        for _, fi := range fis {
@@ -582,7 +611,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.Notify = &notify
        }
 
-       if _, err = ioutil.ReadDir(filepath.Join(src, "self")); err == nil {
+       if _, err = os.ReadDir(filepath.Join(src, "self")); err == nil {
                self := NodeOurJSON{}
                if self.Id, err = cfgDirLoadMust(src, "self", "id"); err != nil {
                        return nil, err
@@ -606,13 +635,13 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        return nil, err
                }
                cfg.Self = &self
-       } else if !os.IsNotExist(err) {
+       } else if !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
 
        cfg.Neigh = make(map[string]NodeJSON)
-       fis, err = ioutil.ReadDir(filepath.Join(src, "neigh"))
-       if err != nil && !os.IsNotExist(err) {
+       fis, err = os.ReadDir(filepath.Join(src, "neigh"))
+       if err != nil && !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
        for _, fi := range fis {
@@ -638,8 +667,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                node.Exec = make(map[string][]string)
-               fis2, err := ioutil.ReadDir(filepath.Join(src, "neigh", n, "exec"))
-               if err != nil && !os.IsNotExist(err) {
+               fis2, err := os.ReadDir(filepath.Join(src, "neigh", n, "exec"))
+               if err != nil && !errors.Is(err, fs.ErrNotExist) {
                        return nil, err
                }
                for _, fi2 := range fis2 {
@@ -688,6 +717,23 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        }
                }
 
+               if cfgDirExists(src, "neigh", n, "ack") {
+                       node.ACK = &NodeACKJSON{}
+                       i64, err := cfgDirLoadIntOpt(src, "neigh", n, "ack", "minsize")
+                       if err != nil {
+                               return nil, err
+                       }
+                       if i64 != nil {
+                               i := uint64(*i64)
+                               node.ACK.MinSize = &i
+                       }
+                       if node.ACK.Nice, err = cfgDirLoadOpt(
+                               src, "neigh", n, "ack", "nice",
+                       ); err != nil {
+                               return nil, err
+                       }
+               }
+
                via, err := cfgDirLoadOpt(src, "neigh", n, "via")
                if err != nil {
                        return nil, err
@@ -697,8 +743,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                node.Addrs = make(map[string]string)
-               fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "addrs"))
-               if err != nil && !os.IsNotExist(err) {
+               fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "addrs"))
+               if err != nil && !errors.Is(err, fs.ErrNotExist) {
                        return nil, err
                }
                for _, fi2 := range fis2 {
@@ -747,8 +793,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        node.MaxOnlineTime = &i
                }
 
-               fis2, err = ioutil.ReadDir(filepath.Join(src, "neigh", n, "calls"))
-               if err != nil && !os.IsNotExist(err) {
+               fis2, err = os.ReadDir(filepath.Join(src, "neigh", n, "calls"))
+               if err != nil && !errors.Is(err, fs.ErrNotExist) {
                        return nil, err
                }
                callsIdx := make([]int, 0, len(fis2))
@@ -855,14 +901,20 @@ func DirToCfg(src string) (*CfgJSON, error) {
                        if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noarea") {
                                call.AutoTossNoArea = true
                        }
+                       if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-noack") {
+                               call.AutoTossNoACK = true
+                       }
+                       if cfgDirExists(src, "neigh", n, "calls", is, "autotoss-gen-ack") {
+                               call.AutoTossGenACK = true
+                       }
                        node.Calls = append(node.Calls, call)
                }
                cfg.Neigh[n] = node
        }
 
        cfg.Areas = make(map[string]AreaJSON)
-       fis, err = ioutil.ReadDir(filepath.Join(src, "areas"))
-       if err != nil && !os.IsNotExist(err) {
+       fis, err = os.ReadDir(filepath.Join(src, "areas"))
+       if err != nil && !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
        for _, fi := range fis {
@@ -890,8 +942,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                }
 
                area.Exec = make(map[string][]string)
-               fis2, err := ioutil.ReadDir(filepath.Join(src, "areas", n, "exec"))
-               if err != nil && !os.IsNotExist(err) {
+               fis2, err := os.ReadDir(filepath.Join(src, "areas", n, "exec"))
+               if err != nil && !errors.Is(err, fs.ErrNotExist) {
                        return nil, err
                }
                for _, fi2 := range fis2 {
@@ -916,8 +968,8 @@ func DirToCfg(src string) (*CfgJSON, error) {
                cfg.Areas[n] = area
        }
 
-       fis, err = ioutil.ReadDir(filepath.Join(src, "yggdrasil-aliases"))
-       if err != nil && !os.IsNotExist(err) {
+       fis, err = os.ReadDir(filepath.Join(src, "yggdrasil-aliases"))
+       if err != nil && !errors.Is(err, fs.ErrNotExist) {
                return nil, err
        }
        if len(fis) > 0 {
@@ -928,7 +980,7 @@ func DirToCfg(src string) (*CfgJSON, error) {
                if n[0] == '.' {
                        continue
                }
-               b, err := ioutil.ReadFile(filepath.Join(src, "yggdrasil-aliases", fi.Name()))
+               b, err := os.ReadFile(filepath.Join(src, "yggdrasil-aliases", fi.Name()))
                if err != nil {
                        return nil, err
                }