Browse Source

2008-02-06 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Create directory before saving DHT routing table.
	Now ios::failure is now handled properly.
	* src/DHTAutoSaveCommand.cc
Tatsuhiro Tsujikawa 17 years ago
parent
commit
d82e183d34
2 changed files with 33 additions and 4 deletions
  1. 6 0
      ChangeLog
  2. 27 4
      src/DHTAutoSaveCommand.cc

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+2008-02-06  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Create directory before saving DHT routing table.
+	Now ios::failure is now handled properly.
+	* src/DHTAutoSaveCommand.cc
+
 2008-02-05  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Removed unnecessary cerr.

+ 27 - 4
src/DHTAutoSaveCommand.cc

@@ -44,6 +44,8 @@
 #include "RequestGroupMan.h"
 #include "prefs.h"
 #include "Option.h"
+#include "message.h"
+#include <cerrno>
 #include <fstream>
 
 DHTAutoSaveCommand::DHTAutoSaveCommand(int32_t cuid, DownloadEngine* e, int32_t interval):
@@ -68,6 +70,25 @@ void DHTAutoSaveCommand::process()
 
 void DHTAutoSaveCommand::save()
 {
+  string dhtFile = _e->option->get(PREF_DHT_FILE_PATH);
+  logger->info("Saving DHT routing table to %s.", dhtFile.c_str());
+
+  string tempFile = dhtFile+"__temp";
+  {
+    File f(tempFile);
+    if(!f.isFile()) {
+      File dir(f.getDirname());
+      if(!dir.exists()) {
+	if(!dir.mkdirs()) {
+	  logger->info(EX_MAKE_DIR, dir.getPath().c_str(), strerror(errno));
+	  return;
+	}
+      } else if(!dir.isDir()) {
+	logger->info(EX_NOT_DIRECTORY, dir.getPath().c_str());
+	return;
+      }
+    }
+  }
   DHTNodes nodes;
   DHTBuckets buckets = _routingTable->getBuckets();
   for(DHTBuckets::const_iterator i = buckets.begin(); i != buckets.end(); ++i) {
@@ -80,17 +101,19 @@ void DHTAutoSaveCommand::save()
   serializer.setLocalNode(_localNode);
   serializer.setNodes(nodes);
 
-  string dhtFile = _e->option->get(PREF_DHT_FILE_PATH);
-  string tempFile = dhtFile+"__temp";
-  ofstream o(tempFile.c_str(), ios::out|ios::binary);
-  o.exceptions(ios::failbit);
   try {
+    ofstream o(tempFile.c_str(), ios::out|ios::binary);
+    o.exceptions(ios::failbit);
+
     serializer.serialize(o);
 
     if(!File(tempFile).renameTo(dhtFile)) {
       logger->error("Cannot move file from %s to %s.",
 		    tempFile.c_str(), dhtFile.c_str());
     }
+  } catch(ios::failure const& e) {
+    logger->error("Failed to save DHT routing table to %s. cause:%s",
+		  tempFile.c_str(), strerror(errno));
   } catch(RecoverableException* e) {
     logger->error("Exception caught while saving DHT routing table to %s",
 		  e, tempFile.c_str());