@@ -20,29 +20,21 @@ import (
20
20
"fmt"
21
21
"os"
22
22
"strings"
23
- "sync"
24
- "time"
25
23
)
26
24
27
25
type hostsTable map [string ]scionAddr
28
26
29
- var cachedHostsTable struct {
30
- mapping hostsTable
31
- updated time.Time
32
- sync.Mutex
33
- }
34
-
35
27
// hostsfileResolver is an implementation of the resolver interface, backed
36
28
// by an /etc/hosts-like file.
37
29
type hostsfileResolver struct {
38
30
path string
39
31
}
40
32
41
- var _ resolver = & hostsfileResolver {}
42
-
43
33
func (r * hostsfileResolver ) Resolve (ctx context.Context , name string ) (scionAddr , error ) {
44
- cachedHostsTable .Lock ()
45
- defer cachedHostsTable .Unlock ()
34
+ // Note: obviously not perfectly elegant to parse the entire file for
35
+ // every query. However, properly caching this and still always provide
36
+ // fresh results after changes to the hosts file seems like a bigger task and
37
+ // for now that would be overkill.
46
38
table , err := loadHostsFile (r .path )
47
39
if err != nil {
48
40
return scionAddr {}, fmt .Errorf ("error loading %s: %w" , r .path , err )
@@ -54,34 +46,17 @@ func (r *hostsfileResolver) Resolve(ctx context.Context, name string) (scionAddr
54
46
return addr , nil
55
47
}
56
48
57
- // loadHostsFile provides a cached copy of the hostsTable or loads and parses the host file at path if it was modified
58
- // since the last update.
59
49
func loadHostsFile (path string ) (hostsTable , error ) {
60
- stat , err := os .Stat (path )
50
+ file , err := os .Open (path )
61
51
if os .IsNotExist (err ) {
62
52
// not existing file treated like an empty file,
63
53
// just return an empty table
64
54
return hostsTable (nil ), nil
65
- }
66
- if err != nil {
67
- return hostsTable (nil ), err
68
- }
69
- if stat .ModTime ().Before (cachedHostsTable .updated ) {
70
- return cachedHostsTable .mapping , nil
71
- }
72
-
73
- file , err := os .Open (path )
74
- if err != nil {
75
- return hostsTable (nil ), err
55
+ } else if err != nil {
56
+ return nil , err
76
57
}
77
58
defer file .Close ()
78
- mapping , err := parseHostsFile (file )
79
- if err != nil {
80
- return hostsTable (nil ), err
81
- }
82
- cachedHostsTable .mapping = mapping
83
- cachedHostsTable .updated = time .Now ()
84
- return cachedHostsTable .mapping , nil
59
+ return parseHostsFile (file )
85
60
}
86
61
87
62
func parseHostsFile (file * os.File ) (hostsTable , error ) {
0 commit comments