BackupPC-XS
view release on metacpan or search on metacpan
bpc_poolWrite.c view on Meta::CPAN
/*
* Routines for matching and writing files in the pool.
*
* Copyright (C) 2013 Craig Barratt.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, visit the http://fsf.org website.
*/
#include "backuppc.h"
static uint32 PoolWriteCnt = 0;
/*
* Buffer used in various places for copying, comparing etc
*/
#define COMPARE_BUF_SZ (1 << 20) /* 1.0 MB */
static uchar TempBuf[2 * COMPARE_BUF_SZ];
/*
* A freelist of unused BPC_POOL_WRITE_BUF_SZ sized-buffers.
* We use the first sizeof(void*) bytes of the buffer as a single-linked
* list, with a NULL at the end.
*/
static void *DataBufferFreeList = (void*)NULL;
int bpc_poolWrite_open(bpc_poolWrite_info *info, int compress, bpc_digest *digest)
{
int i;
info->compress = compress;
info->eof = 0;
info->errorCnt = 0;
info->state = 0;
info->bufferIdx = 0;
info->fileSize = 0;
info->matchPosn = 0;
info->candidateList = NULL;
info->fdOpen = 0;
info->retValue = -1;
info->poolFileSize = 0;
info->retryCnt = 0;
info->digestExtOpen = -1;
info->digestExtZeroLen = -1;
for ( i = 0 ; i < BPC_POOL_WRITE_CONCURRENT_MATCH ; i++ ) {
info->match[i].used = 0;
}
if ( DataBufferFreeList ) {
info->buffer = DataBufferFreeList;
DataBufferFreeList = *(void**)DataBufferFreeList;
} else {
info->buffer = malloc(BPC_POOL_WRITE_BUF_SZ);
}
if ( !info->buffer ) {
bpc_logErrf("bpc_poolWrite_open: can't allocate %d bytes for buffer\n", BPC_POOL_WRITE_BUF_SZ);
return -1;
}
if ( digest ) {
info->digest = *digest;
/* TODO: don't have V3 digest at this point! */
info->state = 2;
} else {
info->digest.len = 0;
}
info->digest_v3.len = 0;
if ( snprintf(info->tmpFileName, sizeof(info->tmpFileName), "%s/%d.%d.%d",
compress ? BPC_CPoolDir : BPC_PoolDir, (int)getpid(), PoolWriteCnt++,
BPC_TmpFileUnique >= 0 ? BPC_TmpFileUnique : 0) >= (int)sizeof(info->tmpFileName) - 1 ) {
bpc_logErrf("bpc_poolWrite_open: file name too long %s\n", info->tmpFileName);
( run in 0.767 second using v1.01-cache-2.11-cpan-39bf76dae61 )