summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-04-02 01:24:07 +0700
committerShulhan <ms@kilabit.info>2023-04-02 01:24:07 +0700
commit7f4c77577efc3400a7ddabb8ae85176c1d2b8b65 (patch)
tree9c9230fa1d4fefcb0535045516a7f88e9bd2a304
parent133331febf70ff5c22c5c7e7568eae69f5f704eb (diff)
downloadpakakeh.go-7f4c77577efc3400a7ddabb8ae85176c1d2b8b65.tar.xz
lib/net: add method WriteTo to ResolvConf
The WriteTo method write the ResolvConf as text.
-rw-r--r--lib/net/resolvconf.go50
-rw-r--r--lib/net/resolvconf_example_test.go43
2 files changed, 92 insertions, 1 deletions
diff --git a/lib/net/resolvconf.go b/lib/net/resolvconf.go
index faf12c50..d35dda38 100644
--- a/lib/net/resolvconf.go
+++ b/lib/net/resolvconf.go
@@ -5,7 +5,11 @@
package net
import (
+ "bytes"
+ "fmt"
+ "io"
"os"
+ "sort"
"strconv"
"strings"
@@ -353,3 +357,49 @@ func (rc *ResolvConf) PopulateQuery(dname string) (queries []string) {
}
return queries
}
+
+// WriteTo write the ResolvConf into w.
+func (rc *ResolvConf) WriteTo(w io.Writer) (n int, err error) {
+ var bb bytes.Buffer
+
+ if len(rc.Domain) > 0 {
+ fmt.Fprintf(&bb, "domain %s\n", rc.Domain)
+ }
+
+ var k string
+
+ if len(rc.Search) > 0 {
+ fmt.Fprint(&bb, `search`)
+ for _, k = range rc.Search {
+ bb.WriteString(` ` + k)
+ }
+ bb.WriteByte('\n')
+ }
+ for _, k = range rc.NameServers {
+ fmt.Fprintf(&bb, "nameserver %s\n", k)
+ }
+
+ if rc.NDots > 0 {
+ fmt.Fprintf(&bb, "options ndots:%d\n", rc.NDots)
+ }
+ if rc.Timeout > 0 {
+ fmt.Fprintf(&bb, "options timeout:%d\n", rc.Timeout)
+ }
+ if rc.Attempts > 0 {
+ fmt.Fprintf(&bb, "options attempts:%d\n", rc.Attempts)
+ }
+
+ if len(rc.OptMisc) > 0 {
+ var keys []string
+ for k = range rc.OptMisc {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+
+ for _, k = range keys {
+ fmt.Fprintf(&bb, "options %s\n", k)
+ }
+ }
+
+ return w.Write(bb.Bytes())
+}
diff --git a/lib/net/resolvconf_example_test.go b/lib/net/resolvconf_example_test.go
index a3e8cb6e..c33630ad 100644
--- a/lib/net/resolvconf_example_test.go
+++ b/lib/net/resolvconf_example_test.go
@@ -4,7 +4,11 @@
package net
-import "fmt"
+import (
+ "bytes"
+ "fmt"
+ "log"
+)
func ExampleResolvConf_PopulateQuery() {
var (
@@ -24,3 +28,40 @@ func ExampleResolvConf_PopulateQuery() {
//[vpn vpn.my.internal]
//[a.machine]
}
+
+func ExampleResolvConf_WriteTo() {
+ var (
+ rc = &ResolvConf{
+ Domain: `internal`,
+ Search: []string{`a.internal`, `b.internal`},
+ NameServers: []string{`127.0.0.1`, `192.168.1.1`},
+ NDots: 1,
+ Timeout: 5,
+ Attempts: 3,
+ OptMisc: map[string]bool{
+ `rotate`: true,
+ `debug`: true,
+ },
+ }
+
+ bb bytes.Buffer
+ err error
+ )
+
+ _, err = rc.WriteTo(&bb)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ fmt.Println(bb.String())
+ // Output:
+ // domain internal
+ // search a.internal b.internal
+ // nameserver 127.0.0.1
+ // nameserver 192.168.1.1
+ // options ndots:1
+ // options timeout:5
+ // options attempts:3
+ // options debug
+ // options rotate
+}