summaryrefslogtreecommitdiff
path: root/src/DHTRoutingTableDeserializer.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-08-25 11:55:30 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-08-25 11:55:30 +0000
commit15101a89a058263c43e19d9f0eb6e55ebba15672 (patch)
tree6d93f79d8ea1dee05dbd6cea77ff2682c310871d /src/DHTRoutingTableDeserializer.cc
parentd9668e2c23bacaf8494c77f64a9e6330a50799dd (diff)
2008-08-25 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Bump up version number of dht.dat file to 3. In version 3 format, time is stored in 64bit, network byte order. New build can load old format(version 2) but it saves the file in new format. It means once you used new build, your dht.dat becomes incompatible with older build. * src/DHTRoutingTableDeserializer.cc * src/DHTRoutingTableSerializer.cc * test/DHTRoutingTableSerializerTest.cc
Diffstat (limited to 'src/DHTRoutingTableDeserializer.cc')
-rw-r--r--src/DHTRoutingTableDeserializer.cc34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/DHTRoutingTableDeserializer.cc b/src/DHTRoutingTableDeserializer.cc
index db84f7f7..48b8a2fb 100644
--- a/src/DHTRoutingTableDeserializer.cc
+++ b/src/DHTRoutingTableDeserializer.cc
@@ -40,6 +40,7 @@
#include "Logger.h"
#include "a2netcompat.h"
#include "StringFormat.h"
+#include "Util.h"
#include <cerrno>
#include <cstring>
#include <istream>
@@ -73,24 +74,45 @@ void DHTRoutingTableDeserializer::deserialize(std::istream& in)
header[2] = 0x02;
// version
header[6] = 0;
- header[7] = 0x02;
+ header[7] = 0x03;
+
+ char headerCompat[8];
+ memset(headerCompat, 0, sizeof(headerCompat));
+ // magic
+ headerCompat[0] = 0xa1;
+ headerCompat[1] = 0xa2;
+ // format ID
+ headerCompat[2] = 0x02;
+ // version
+ headerCompat[6] = 0;
+ headerCompat[7] = 0x02;
char zero[8];
memset(zero, 0, sizeof(zero));
+ int version;
char buf[26];
// header
in.read(buf, 8);
- if(memcmp(header, buf, 8) != 0) {
+ if(memcmp(header, buf, 8) == 0) {
+ version = 3;
+ } else if(memcmp(headerCompat, buf, 8) == 0) {
+ version = 2;
+ } else {
throw DlAbortEx
(StringFormat("Failed to load DHT routing table. cause:%s",
"bad header").str());
}
// time
- in.read(buf, 4);
- _serializedTime.setTimeInSec(ntohl(*reinterpret_cast<uint32_t*>(buf)));
- // 4bytes reserved
- in.read(buf, 4);
+ if(version == 2) {
+ in.read(buf, 4);
+ _serializedTime.setTimeInSec(ntohl(*reinterpret_cast<uint32_t*>(buf)));
+ // 4bytes reserved
+ in.read(buf, 4);
+ } else {
+ in.read(buf, 8);
+ _serializedTime.setTimeInSec(ntoh64(*reinterpret_cast<uint64_t*>(buf)));
+ }
// localnode
// 8bytes reserved