Skip to content

Commit 01185e4

Browse files
committed
types/result, util/lineiter: add package for a result type, use it
This adds a new generic result type (motivated by golang/go#70084) to try it out, and uses it in the new lineutil package (replacing the old lineread package), changing that package to return iterators: sometimes over []byte (when the input is all in memory), but sometimes iterators over results of []byte, if errors might happen at runtime. Updates #12912 Updates golang/go#70084 Change-Id: Iacdc1070e661b5fb163907b1e8b07ac7d51d3f83 Signed-off-by: Brad Fitzpatrick <[email protected]>
1 parent 809a6eb commit 01185e4

File tree

20 files changed

+289
-138
lines changed

20 files changed

+289
-138
lines changed

cmd/derper/depaware.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depawa
140140
tailscale.com/types/persist from tailscale.com/ipn
141141
tailscale.com/types/preftype from tailscale.com/ipn
142142
tailscale.com/types/ptr from tailscale.com/hostinfo+
143+
tailscale.com/types/result from tailscale.com/util/lineiter
143144
tailscale.com/types/structs from tailscale.com/ipn+
144145
tailscale.com/types/tkatype from tailscale.com/client/tailscale+
145146
tailscale.com/types/views from tailscale.com/ipn+
@@ -154,7 +155,7 @@ tailscale.com/cmd/derper dependencies: (generated by github.com/tailscale/depawa
154155
tailscale.com/util/fastuuid from tailscale.com/tsweb
155156
💣 tailscale.com/util/hashx from tailscale.com/util/deephash
156157
tailscale.com/util/httpm from tailscale.com/client/tailscale
157-
tailscale.com/util/lineread from tailscale.com/hostinfo+
158+
tailscale.com/util/lineiter from tailscale.com/hostinfo+
158159
L tailscale.com/util/linuxfw from tailscale.com/net/netns
159160
tailscale.com/util/mak from tailscale.com/health+
160161
tailscale.com/util/multierr from tailscale.com/health+

cmd/k8s-operator/depaware.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,7 @@ tailscale.com/cmd/k8s-operator dependencies: (generated by github.com/tailscale/
775775
tailscale.com/types/persist from tailscale.com/control/controlclient+
776776
tailscale.com/types/preftype from tailscale.com/ipn+
777777
tailscale.com/types/ptr from tailscale.com/cmd/k8s-operator+
778+
tailscale.com/types/result from tailscale.com/util/lineiter
778779
tailscale.com/types/structs from tailscale.com/control/controlclient+
779780
tailscale.com/types/tkatype from tailscale.com/client/tailscale+
780781
tailscale.com/types/views from tailscale.com/appc+
@@ -792,7 +793,7 @@ tailscale.com/cmd/k8s-operator dependencies: (generated by github.com/tailscale/
792793
💣 tailscale.com/util/hashx from tailscale.com/util/deephash
793794
tailscale.com/util/httphdr from tailscale.com/ipn/ipnlocal+
794795
tailscale.com/util/httpm from tailscale.com/client/tailscale+
795-
tailscale.com/util/lineread from tailscale.com/hostinfo+
796+
tailscale.com/util/lineiter from tailscale.com/hostinfo+
796797
L tailscale.com/util/linuxfw from tailscale.com/net/netns+
797798
tailscale.com/util/mak from tailscale.com/appc+
798799
tailscale.com/util/multierr from tailscale.com/control/controlclient+

cmd/stund/depaware.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,15 @@ tailscale.com/cmd/stund dependencies: (generated by github.com/tailscale/depawar
6767
tailscale.com/types/logger from tailscale.com/tsweb
6868
tailscale.com/types/opt from tailscale.com/envknob+
6969
tailscale.com/types/ptr from tailscale.com/tailcfg+
70+
tailscale.com/types/result from tailscale.com/util/lineiter
7071
tailscale.com/types/structs from tailscale.com/tailcfg+
7172
tailscale.com/types/tkatype from tailscale.com/tailcfg+
7273
tailscale.com/types/views from tailscale.com/net/tsaddr+
7374
tailscale.com/util/ctxkey from tailscale.com/tsweb+
7475
L 💣 tailscale.com/util/dirwalk from tailscale.com/metrics
7576
tailscale.com/util/dnsname from tailscale.com/tailcfg
7677
tailscale.com/util/fastuuid from tailscale.com/tsweb
77-
tailscale.com/util/lineread from tailscale.com/version/distro
78+
tailscale.com/util/lineiter from tailscale.com/version/distro
7879
tailscale.com/util/nocasemaps from tailscale.com/types/ipproto
7980
tailscale.com/util/slicesx from tailscale.com/tailcfg
8081
tailscale.com/util/vizerror from tailscale.com/tailcfg+

cmd/tailscale/depaware.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep
148148
tailscale.com/types/persist from tailscale.com/ipn
149149
tailscale.com/types/preftype from tailscale.com/cmd/tailscale/cli+
150150
tailscale.com/types/ptr from tailscale.com/hostinfo+
151+
tailscale.com/types/result from tailscale.com/util/lineiter
151152
tailscale.com/types/structs from tailscale.com/ipn+
152153
tailscale.com/types/tkatype from tailscale.com/types/key+
153154
tailscale.com/types/views from tailscale.com/tailcfg+
@@ -162,7 +163,7 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep
162163
tailscale.com/util/groupmember from tailscale.com/client/web
163164
💣 tailscale.com/util/hashx from tailscale.com/util/deephash
164165
tailscale.com/util/httpm from tailscale.com/client/tailscale+
165-
tailscale.com/util/lineread from tailscale.com/hostinfo+
166+
tailscale.com/util/lineiter from tailscale.com/hostinfo+
166167
L tailscale.com/util/linuxfw from tailscale.com/net/netns
167168
tailscale.com/util/mak from tailscale.com/cmd/tailscale/cli+
168169
tailscale.com/util/multierr from tailscale.com/control/controlhttp+

cmd/tailscaled/depaware.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
364364
tailscale.com/types/persist from tailscale.com/control/controlclient+
365365
tailscale.com/types/preftype from tailscale.com/ipn+
366366
tailscale.com/types/ptr from tailscale.com/control/controlclient+
367+
tailscale.com/types/result from tailscale.com/util/lineiter
367368
tailscale.com/types/structs from tailscale.com/control/controlclient+
368369
tailscale.com/types/tkatype from tailscale.com/tka+
369370
tailscale.com/types/views from tailscale.com/ipn/ipnlocal+
@@ -381,7 +382,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
381382
💣 tailscale.com/util/hashx from tailscale.com/util/deephash
382383
tailscale.com/util/httphdr from tailscale.com/ipn/ipnlocal+
383384
tailscale.com/util/httpm from tailscale.com/client/tailscale+
384-
tailscale.com/util/lineread from tailscale.com/hostinfo+
385+
tailscale.com/util/lineiter from tailscale.com/hostinfo+
385386
L tailscale.com/util/linuxfw from tailscale.com/net/netns+
386387
tailscale.com/util/mak from tailscale.com/control/controlclient+
387388
tailscale.com/util/multierr from tailscale.com/cmd/tailscaled+

hostinfo/hostinfo.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"tailscale.com/types/ptr"
2626
"tailscale.com/util/cloudenv"
2727
"tailscale.com/util/dnsname"
28-
"tailscale.com/util/lineread"
28+
"tailscale.com/util/lineiter"
2929
"tailscale.com/version"
3030
"tailscale.com/version/distro"
3131
)
@@ -231,12 +231,12 @@ func desktop() (ret opt.Bool) {
231231
}
232232

233233
seenDesktop := false
234-
lineread.File("/proc/net/unix", func(line []byte) error {
234+
for lr := range lineiter.File("/proc/net/unix") {
235+
line, _ := lr.Value()
235236
seenDesktop = seenDesktop || mem.Contains(mem.B(line), mem.S(" @/tmp/dbus-"))
236237
seenDesktop = seenDesktop || mem.Contains(mem.B(line), mem.S(".X11-unix"))
237238
seenDesktop = seenDesktop || mem.Contains(mem.B(line), mem.S("/wayland-1"))
238-
return nil
239-
})
239+
}
240240
ret.Set(seenDesktop)
241241

242242
// Only cache after a minute - compositors might not have started yet.
@@ -305,21 +305,21 @@ func inContainer() opt.Bool {
305305
ret.Set(true)
306306
return ret
307307
}
308-
lineread.File("/proc/1/cgroup", func(line []byte) error {
308+
for lr := range lineiter.File("/proc/1/cgroup") {
309+
line, _ := lr.Value()
309310
if mem.Contains(mem.B(line), mem.S("/docker/")) ||
310311
mem.Contains(mem.B(line), mem.S("/lxc/")) {
311312
ret.Set(true)
312-
return io.EOF // arbitrary non-nil error to stop loop
313+
break
313314
}
314-
return nil
315-
})
316-
lineread.File("/proc/mounts", func(line []byte) error {
315+
}
316+
for lr := range lineiter.File("/proc/mounts") {
317+
line, _ := lr.Value()
317318
if mem.Contains(mem.B(line), mem.S("lxcfs /proc/cpuinfo fuse.lxcfs")) {
318319
ret.Set(true)
319-
return io.EOF
320+
break
320321
}
321-
return nil
322-
})
322+
}
323323
return ret
324324
}
325325

hostinfo/hostinfo_linux.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
"golang.org/x/sys/unix"
1414
"tailscale.com/types/ptr"
15-
"tailscale.com/util/lineread"
15+
"tailscale.com/util/lineiter"
1616
"tailscale.com/version/distro"
1717
)
1818

@@ -106,15 +106,18 @@ func linuxVersionMeta() (meta versionMeta) {
106106
}
107107

108108
m := map[string]string{}
109-
lineread.File(propFile, func(line []byte) error {
109+
for lr := range lineiter.File(propFile) {
110+
line, err := lr.Value()
111+
if err != nil {
112+
break
113+
}
110114
eq := bytes.IndexByte(line, '=')
111115
if eq == -1 {
112-
return nil
116+
continue
113117
}
114118
k, v := string(line[:eq]), strings.Trim(string(line[eq+1:]), `"'`)
115119
m[k] = v
116-
return nil
117-
})
120+
}
118121

119122
if v := m["VERSION_CODENAME"]; v != "" {
120123
meta.DistroCodeName = v

ipn/ipnlocal/ssh.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
"github.com/tailscale/golang-x-crypto/ssh"
2828
"go4.org/mem"
2929
"tailscale.com/tailcfg"
30-
"tailscale.com/util/lineread"
30+
"tailscale.com/util/lineiter"
3131
"tailscale.com/util/mak"
3232
)
3333

@@ -80,30 +80,32 @@ func (b *LocalBackend) getSSHUsernames(req *tailcfg.C2NSSHUsernamesRequest) (*ta
8080
if err != nil {
8181
return nil, err
8282
}
83-
lineread.Reader(bytes.NewReader(out), func(line []byte) error {
83+
for line := range lineiter.Bytes(out) {
8484
line = bytes.TrimSpace(line)
8585
if len(line) == 0 || line[0] == '_' {
86-
return nil
86+
continue
8787
}
8888
add(string(line))
89-
return nil
90-
})
89+
}
9190
default:
92-
lineread.File("/etc/passwd", func(line []byte) error {
91+
for lr := range lineiter.File("/etc/passwd") {
92+
line, err := lr.Value()
93+
if err != nil {
94+
break
95+
}
9396
line = bytes.TrimSpace(line)
9497
if len(line) == 0 || line[0] == '#' || line[0] == '_' {
95-
return nil
98+
continue
9699
}
97100
if mem.HasSuffix(mem.B(line), mem.S("/nologin")) ||
98101
mem.HasSuffix(mem.B(line), mem.S("/false")) {
99-
return nil
102+
continue
100103
}
101104
colon := bytes.IndexByte(line, ':')
102105
if colon != -1 {
103106
add(string(line[:colon]))
104107
}
105-
return nil
106-
})
108+
}
107109
}
108110
return res, nil
109111
}

net/netmon/interfaces_android.go

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package netmon
55

66
import (
77
"bytes"
8-
"errors"
98
"log"
109
"net/netip"
1110
"os/exec"
@@ -15,7 +14,7 @@ import (
1514
"golang.org/x/sys/unix"
1615
"tailscale.com/net/netaddr"
1716
"tailscale.com/syncs"
18-
"tailscale.com/util/lineread"
17+
"tailscale.com/util/lineiter"
1918
)
2019

2120
var (
@@ -34,11 +33,6 @@ func init() {
3433

3534
var procNetRouteErr atomic.Bool
3635

37-
// errStopReading is a sentinel error value used internally by
38-
// lineread.File callers to stop reading. It doesn't escape to
39-
// callers/users.
40-
var errStopReading = errors.New("stop reading")
41-
4236
/*
4337
Parse 10.0.0.1 out of:
4438
@@ -54,44 +48,42 @@ func likelyHomeRouterIPAndroid() (ret netip.Addr, myIP netip.Addr, ok bool) {
5448
}
5549
lineNum := 0
5650
var f []mem.RO
57-
err := lineread.File(procNetRoutePath, func(line []byte) error {
51+
for lr := range lineiter.File(procNetRoutePath) {
52+
line, err := lr.Value()
53+
if err != nil {
54+
procNetRouteErr.Store(true)
55+
return likelyHomeRouterIP()
56+
}
57+
5858
lineNum++
5959
if lineNum == 1 {
6060
// Skip header line.
61-
return nil
61+
continue
6262
}
6363
if lineNum > maxProcNetRouteRead {
64-
return errStopReading
64+
break
6565
}
6666
f = mem.AppendFields(f[:0], mem.B(line))
6767
if len(f) < 4 {
68-
return nil
68+
continue
6969
}
7070
gwHex, flagsHex := f[2], f[3]
7171
flags, err := mem.ParseUint(flagsHex, 16, 16)
7272
if err != nil {
73-
return nil // ignore error, skip line and keep going
73+
continue // ignore error, skip line and keep going
7474
}
7575
if flags&(unix.RTF_UP|unix.RTF_GATEWAY) != unix.RTF_UP|unix.RTF_GATEWAY {
76-
return nil
76+
continue
7777
}
7878
ipu32, err := mem.ParseUint(gwHex, 16, 32)
7979
if err != nil {
80-
return nil // ignore error, skip line and keep going
80+
continue // ignore error, skip line and keep going
8181
}
8282
ip := netaddr.IPv4(byte(ipu32), byte(ipu32>>8), byte(ipu32>>16), byte(ipu32>>24))
8383
if ip.IsPrivate() {
8484
ret = ip
85-
return errStopReading
85+
break
8686
}
87-
return nil
88-
})
89-
if errors.Is(err, errStopReading) {
90-
err = nil
91-
}
92-
if err != nil {
93-
procNetRouteErr.Store(true)
94-
return likelyHomeRouterIP()
9587
}
9688
if ret.IsValid() {
9789
// Try to get the local IP of the interface associated with
@@ -144,23 +136,26 @@ func likelyHomeRouterIPHelper() (ret netip.Addr, _ netip.Addr, ok bool) {
144136
return
145137
}
146138
// Search for line like "default via 10.0.2.2 dev radio0 table 1016 proto static mtu 1500 "
147-
lineread.Reader(out, func(line []byte) error {
139+
for lr := range lineiter.Reader(out) {
140+
line, err := lr.Value()
141+
if err != nil {
142+
break
143+
}
148144
const pfx = "default via "
149145
if !mem.HasPrefix(mem.B(line), mem.S(pfx)) {
150-
return nil
146+
continue
151147
}
152148
line = line[len(pfx):]
153149
sp := bytes.IndexByte(line, ' ')
154150
if sp == -1 {
155-
return nil
151+
continue
156152
}
157153
ipb := line[:sp]
158154
if ip, err := netip.ParseAddr(string(ipb)); err == nil && ip.Is4() {
159155
ret = ip
160156
log.Printf("interfaces: found Android default route %v", ip)
161157
}
162-
return nil
163-
})
158+
}
164159
cmd.Process.Kill()
165160
cmd.Wait()
166161
return ret, netip.Addr{}, ret.IsValid()

0 commit comments

Comments
 (0)