|
|
|
@ -2493,55 +2493,40 @@ bool LoadExternalBlockFile(FILE* fileIn)
@@ -2493,55 +2493,40 @@ bool LoadExternalBlockFile(FILE* fileIn)
|
|
|
|
|
|
|
|
|
|
int nLoaded = 0; |
|
|
|
|
{ |
|
|
|
|
CBufferedFile blkdat(fileIn, 2*MAX_BLOCK_SIZE, MAX_BLOCK_SIZE+8, SER_DISK, CLIENT_VERSION); |
|
|
|
|
uint64 nRewind = blkdat.GetPos(); |
|
|
|
|
while (blkdat.good() && !blkdat.eof() && !fShutdown) { |
|
|
|
|
blkdat.SetPos(nRewind); |
|
|
|
|
nRewind++; // start one byte further next time, in case of failure
|
|
|
|
|
blkdat.SetLimit(); // remove former limit
|
|
|
|
|
try { |
|
|
|
|
CAutoFile blkdat(fileIn, SER_DISK, CLIENT_VERSION); |
|
|
|
|
unsigned int nPos = 0; |
|
|
|
|
while (nPos != (unsigned int)-1 && blkdat.good() && !fRequestShutdown) |
|
|
|
|
{ |
|
|
|
|
unsigned char pchData[65536]; |
|
|
|
|
do { |
|
|
|
|
fseek(blkdat, nPos, SEEK_SET); |
|
|
|
|
int nRead = fread(pchData, 1, sizeof(pchData), blkdat); |
|
|
|
|
if (nRead <= 8) |
|
|
|
|
{ |
|
|
|
|
nPos = (unsigned int)-1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
void* nFind = memchr(pchData, pchMessageStart[0], nRead+1-sizeof(pchMessageStart)); |
|
|
|
|
if (nFind) |
|
|
|
|
{ |
|
|
|
|
if (memcmp(nFind, pchMessageStart, sizeof(pchMessageStart))==0) |
|
|
|
|
{ |
|
|
|
|
nPos += ((unsigned char*)nFind - pchData) + sizeof(pchMessageStart); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
nPos += ((unsigned char*)nFind - pchData) + 1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
nPos += sizeof(pchData) - sizeof(pchMessageStart) + 1; |
|
|
|
|
} while(!fRequestShutdown); |
|
|
|
|
if (nPos == (unsigned int)-1) |
|
|
|
|
break; |
|
|
|
|
fseek(blkdat, nPos, SEEK_SET); |
|
|
|
|
// locate a header
|
|
|
|
|
unsigned char buf[4]; |
|
|
|
|
blkdat.FindByte(pchMessageStart[0]); |
|
|
|
|
nRewind = blkdat.GetPos()+1; |
|
|
|
|
blkdat >> FLATDATA(buf); |
|
|
|
|
if (memcmp(buf, pchMessageStart, 4)) |
|
|
|
|
continue; |
|
|
|
|
// read size
|
|
|
|
|
unsigned int nSize; |
|
|
|
|
blkdat >> nSize; |
|
|
|
|
if (nSize > 0 && nSize <= MAX_BLOCK_SIZE) |
|
|
|
|
{ |
|
|
|
|
if (nSize < 80 || nSize > MAX_BLOCK_SIZE) |
|
|
|
|
continue; |
|
|
|
|
// read block
|
|
|
|
|
blkdat.SetLimit(blkdat.GetPos() + nSize); |
|
|
|
|
CBlock block; |
|
|
|
|
blkdat >> block; |
|
|
|
|
nRewind = blkdat.GetPos(); |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
if (ProcessBlock(NULL,&block)) |
|
|
|
|
{ |
|
|
|
|
nLoaded++; |
|
|
|
|
nPos += 4 + nSize; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (std::exception &e) { |
|
|
|
|
printf("%s() : Deserialize or I/O error caught during load\n", __PRETTY_FUNCTION__); |
|
|
|
|
} |
|
|
|
|
catch (std::exception &e) { |
|
|
|
|
printf("%s() : Deserialize or I/O error caught during load\n", |
|
|
|
|
__PRETTY_FUNCTION__); |
|
|
|
|
} |
|
|
|
|
fclose(fileIn); |
|
|
|
|
} |
|
|
|
|
printf("Loaded %i blocks from external file in %"PRI64d"ms\n", nLoaded, GetTimeMillis() - nStart); |
|
|
|
|
return nLoaded > 0; |
|
|
|
|