diff --git a/etchosts/etchosts.go b/etchosts/etchosts.go index 92597b71b4..256a89dfa8 100644 --- a/etchosts/etchosts.go +++ b/etchosts/etchosts.go @@ -1,6 +1,7 @@ package etchosts import ( + "bufio" "bytes" "fmt" "io" @@ -138,19 +139,36 @@ func Delete(path string, recs []Record) error { if len(recs) == 0 { return nil } - - old, err := ioutil.ReadFile(path) + old, err := os.Open(path) if err != nil { return err } - regexpStr := fmt.Sprintf("\\S*\\t%s\\n", regexp.QuoteMeta(recs[0].Hosts)) - for _, r := range recs[1:] { - regexpStr = regexpStr + "|" + fmt.Sprintf("\\S*\\t%s\\n", regexp.QuoteMeta(r.Hosts)) + var buf bytes.Buffer + + s := bufio.NewScanner(old) + eol := []byte{'\n'} +loop: + for s.Scan() { + b := s.Bytes() + if b[0] == '#' { + buf.Write(b) + buf.Write(eol) + continue + } + for _, r := range recs { + if bytes.HasSuffix(b, []byte("\t"+r.Hosts)) { + continue loop + } + } + buf.Write(b) + buf.Write(eol) } - - var re = regexp.MustCompile(regexpStr) - return ioutil.WriteFile(path, re.ReplaceAll(old, []byte("")), 0644) + old.Close() + if err := s.Err(); err != nil { + return err + } + return ioutil.WriteFile(path, buf.Bytes(), 0644) } // Update all IP addresses where hostname matches.