From 15101a89a058263c43e19d9f0eb6e55ebba15672 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 25 Aug 2008 11:55:30 +0000 Subject: 2008-08-25 Tatsuhiro Tsujikawa 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 --- src/DHTRoutingTableDeserializer.cc | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'src/DHTRoutingTableDeserializer.cc') 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 #include #include @@ -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(buf))); - // 4bytes reserved - in.read(buf, 4); + if(version == 2) { + in.read(buf, 4); + _serializedTime.setTimeInSec(ntohl(*reinterpret_cast(buf))); + // 4bytes reserved + in.read(buf, 4); + } else { + in.read(buf, 8); + _serializedTime.setTimeInSec(ntoh64(*reinterpret_cast(buf))); + } // localnode // 8bytes reserved -- cgit