From 27006f58c506b3dd365a1dea3a9e42f41d5c2a6e Mon Sep 17 00:00:00 2001
From: Simon Zolin <s.zolin@adguard.com>
Date: Tue, 16 Jul 2019 12:55:18 +0300
Subject: [PATCH] - filters: windows: fix update procedure

We couldn't write filter files on Windows due to
 "file is being used" error.
---
 home/filter.go | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/home/filter.go b/home/filter.go
index c01ce55b..4e509866 100644
--- a/home/filter.go
+++ b/home/filter.go
@@ -170,12 +170,15 @@ func periodicallyRefreshFilters() {
 // Algorithm:
 // . Get the list of filters to be updated
 // . For each filter run the download and checksum check operation
-//  . If filter data hasn't changed, set new update time
-//  . If filter data has changed, parse it, save it on disk, set new update time
+// . Stop server
+// . For each filter:
+//  . If filter data hasn't changed, just set new update time on file
+//  . If filter data has changed, save it on disk
 //  . Apply changes to the current configuration
-// . Restart server
+// . Start server
 func refreshFiltersIfNecessary(force bool) int {
 	var updateFilters []filter
+	var updateFlags []bool // 'true' if filter data has changed
 
 	if config.firstRun {
 		return 0
@@ -210,21 +213,28 @@ func refreshFiltersIfNecessary(force bool) int {
 			log.Printf("Failed to update filter %s: %s\n", uf.URL, err)
 			continue
 		}
+		uf.LastUpdated = time.Now()
+		updateFlags = append(updateFlags, updated)
+	}
+
+	isRunning := isRunning()
+	_ = dnsServer.Stop()
+
+	for i := range updateFilters {
+		uf := &updateFilters[i]
+		updated := updateFlags[i]
 		if updated {
 			// Saving it to the filters dir now
-			err = uf.save()
+			err := uf.save()
 			if err != nil {
 				log.Printf("Failed to save the updated filter %d: %s", uf.ID, err)
 				continue
 			}
-
 		} else {
-			mtime := time.Now()
-			e := os.Chtimes(uf.Path(), mtime, mtime)
+			e := os.Chtimes(uf.Path(), uf.LastUpdated, uf.LastUpdated)
 			if e != nil {
 				log.Error("os.Chtimes(): %v", e)
 			}
-			uf.LastUpdated = mtime
 		}
 
 		config.Lock()
@@ -249,7 +259,7 @@ func refreshFiltersIfNecessary(force bool) int {
 		config.Unlock()
 	}
 
-	if updateCount > 0 && isRunning() {
+	if updateCount > 0 && isRunning {
 		err := reconfigureDNSServer()
 		if err != nil {
 			msg := fmt.Sprintf("SHOULD NOT HAPPEN: cannot reconfigure DNS server with the new filters: %s", err)