summaryrefslogtreecommitdiff
path: root/extra/hefur/Check-that-added-torrents-from-the-disk-are-still-on.patch
blob: 8ad67ee748833fbcb2982908861867fd799d1090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
From dbd00cfc3805b6f1ff794f7de0b52b1a7893401f Mon Sep 17 00:00:00 2001
From: Alexandre Bique <bique.alexandre@gmail.com>
Date: Thu, 15 Nov 2012 20:43:41 +0100
Subject: [PATCH 07/12] Check that added torrents from the disk are still on
 the disk.
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 hefur/fs-tree-white-list.cc | 20 ++++++++++++++++++++
 hefur/fs-tree-white-list.hh |  1 +
 hefur/torrent-db.hh         |  4 +++-
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/hefur/fs-tree-white-list.cc b/hefur/fs-tree-white-list.cc
index f493e95..61714d0 100644
--- a/hefur/fs-tree-white-list.cc
+++ b/hefur/fs-tree-white-list.cc
@@ -54,10 +54,30 @@ namespace hefur
   }
 
   void
+  FsTreeWhiteList::check()
+  {
+    std::vector<m::StringRef> keys;
+    auto db = Hefur::instance().torrentDb();
+    m::SharedMutex::Locker locker(db->torrents_lock_);
+    db->torrents_.foreach([this, &keys] (Torrent::Ptr torrent) {
+        if (::strncmp(torrent->path().c_str(), root_.c_str(), root_.size()))
+          return;
+
+        struct ::stat st;
+        if (::stat(torrent->path().c_str(), &st) && errno == ENOENT)
+          keys.push_back(torrent->key());
+      });
+
+    for (auto it = keys.begin(); it != keys.end(); ++it)
+      db->torrents_.erase(*it);
+  }
+
+  void
   FsTreeWhiteList::loopScan()
   {
     do {
       scan();
+      check();
     } while (!stop_.timedWait(m::time() + rescan_interval_));
   }
 }
diff --git a/hefur/fs-tree-white-list.hh b/hefur/fs-tree-white-list.hh
index c32bcd4..643fb78 100644
--- a/hefur/fs-tree-white-list.hh
+++ b/hefur/fs-tree-white-list.hh
@@ -30,6 +30,7 @@ namespace hefur
      * When a .torrent is found, call TorrentDb::addTorrent().
      */
     void scan();
+    void check();
 
   private:
     /**
diff --git a/hefur/torrent-db.hh b/hefur/torrent-db.hh
index a1e5d38..e25ed33 100644
--- a/hefur/torrent-db.hh
+++ b/hefur/torrent-db.hh
@@ -17,6 +17,7 @@ namespace hefur
 {
   class StatHandler;
   class PeersHandler;
+  class FsTreeWhiteList;
 
   /**
    * This is the "in memory" torrent database.
@@ -63,6 +64,7 @@ namespace hefur
     friend class StatHandler;
     friend class PeersHandler;
     friend class FileHandler;
+    friend class FsTreeWhiteList;
 
     /** helper to use torrent->key() as a key for the trie */
     static inline m::StringRef torrentKey(Torrent::Ptr torrent) {
@@ -77,7 +79,7 @@ namespace hefur
     m::Future<bool> cleanup_stop_;
     m::Thread       cleanup_thread_;
     m::SharedMutex  torrents_lock_;
-    torrents_type        torrents_;
+    torrents_type   torrents_;
   };
 }
 
-- 
1.8.0.1