*
*/
/*
- Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+ Copyright (C) 2000-2004 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
* record as a Label, otherwise it is simply
* the FileIndex of the current file.
*/
-char *FI_to_ascii(int fi)
+const char *FI_to_ascii(int fi)
{
static char buf[20];
if (fi >= 0) {
* dealing with a Label, hence the
* stream is the JobId.
*/
-char *stream_to_ascii(int stream, int fi)
+const char *stream_to_ascii(int stream, int fi)
{
static char buf[20];
if (fi < 0) {
return "UATTR";
case STREAM_FILE_DATA:
return "DATA";
+ case STREAM_WIN32_DATA:
+ return "WIN32-DATA";
+ case STREAM_WIN32_GZIP_DATA:
+ return "WIN32-GZIP";
case STREAM_MD5_SIGNATURE:
return "MD5";
+ case STREAM_SHA1_SIGNATURE:
+ return "SHA1";
case STREAM_GZIP_DATA:
return "GZIP";
- case STREAM_WIN32_ATTRIBUTES:
- return "WIN32-ATTR";
+ case STREAM_UNIX_ATTRIBUTES_EX:
+ return "UNIX-ATTR-EX";
case STREAM_SPARSE_DATA:
return "SPARSE-DATA";
case STREAM_SPARSE_GZIP_DATA:
return "contUATTR";
case -STREAM_FILE_DATA:
return "contDATA";
+ case -STREAM_WIN32_DATA:
+ return "contWIN32-DATA";
+ case -STREAM_WIN32_GZIP_DATA:
+ return "contWIN32-GZIP";
case -STREAM_MD5_SIGNATURE:
return "contMD5";
+ case -STREAM_SHA1_SIGNATURE:
+ return "contSHA1";
case -STREAM_GZIP_DATA:
return "contGZIP";
- case -STREAM_WIN32_ATTRIBUTES:
- return "contWIN32-ATTR";
+ case -STREAM_UNIX_ATTRIBUTES_EX:
+ return "contUNIX-ATTR-EX";
case -STREAM_SPARSE_DATA:
return "contSPARSE-DATA";
case -STREAM_SPARSE_GZIP_DATA:
{
DEV_RECORD *rec;
- rec = (DEV_RECORD *) get_memory(sizeof(DEV_RECORD));
+ rec = (DEV_RECORD *)get_memory(sizeof(DEV_RECORD));
memset(rec, 0, sizeof(DEV_RECORD));
rec->data = get_pool_memory(PM_MESSAGE);
return rec;
ser_declare;
uint32_t remlen;
- sm_check(__FILE__, __LINE__, False);
remlen = block->buf_len - block->binbuf;
ASSERT(block->binbuf == (uint32_t) (block->bufp - block->buf));
- ASSERT(remlen >= 0);
+ ASSERT(block->buf_len >= block->binbuf);
Dmsg6(190, "write_record_to_block() FI=%s SessId=%d Strm=%s len=%d\n\
rem=%d remainder=%d\n",
if (remlen >= WRITE_RECHDR_LENGTH) {
ser_begin(block->bufp, WRITE_RECHDR_LENGTH);
if (BLOCK_VER == 1) {
- ser_uint32(rec->VolSessionId);
- ser_uint32(rec->VolSessionTime);
+ ser_uint32(rec->VolSessionId);
+ ser_uint32(rec->VolSessionTime);
} else {
block->VolSessionId = rec->VolSessionId;
block->VolSessionTime = rec->VolSessionTime;
block->binbuf += WRITE_RECHDR_LENGTH;
remlen -= WRITE_RECHDR_LENGTH;
rec->remainder = rec->data_len;
+ if (rec->FileIndex > 0) {
+ /* If data record, update what we have in this block */
+ if (block->FirstIndex == 0) {
+ block->FirstIndex = rec->FileIndex;
+ }
+ block->LastIndex = rec->FileIndex;
+ }
} else {
rec->remainder = rec->data_len + WRITE_RECHDR_LENGTH;
- sm_check(__FILE__, __LINE__, False);
return 0;
}
} else {
*/
ser_begin(block->bufp, WRITE_RECHDR_LENGTH);
if (BLOCK_VER == 1) {
- ser_uint32(rec->VolSessionId);
- ser_uint32(rec->VolSessionTime);
+ ser_uint32(rec->VolSessionId);
+ ser_uint32(rec->VolSessionTime);
} else {
block->VolSessionId = rec->VolSessionId;
block->VolSessionTime = rec->VolSessionTime;
block->bufp += WRITE_RECHDR_LENGTH;
block->binbuf += WRITE_RECHDR_LENGTH;
remlen -= WRITE_RECHDR_LENGTH;
+ if (rec->FileIndex > 0) {
+ /* If data record, update what we have in this block */
+ if (block->FirstIndex == 0) {
+ block->FirstIndex = rec->FileIndex;
+ }
+ block->LastIndex = rec->FileIndex;
+ }
}
if (remlen == 0) {
- sm_check(__FILE__, __LINE__, False);
return 0; /* partial transfer */
}
} else {
memcpy(block->bufp, rec->data+rec->data_len-rec->remainder,
remlen);
-#ifdef SMCHECK
+#ifdef xxxxxSMCHECK
if (!sm_check_rtn(__FILE__, __LINE__, False)) {
/* We damaged a buffer */
Dmsg6(0, "Damaged block FI=%s SessId=%d Strm=%s len=%d\n\
}
}
rec->remainder = 0; /* did whole transfer */
- sm_check(__FILE__, __LINE__, False);
return 1;
}
remlen = block->binbuf;
rec->Block = block->BlockNumber;
+ rec->File = ((DEVICE *)block->dev)->file;
- /* Clear state flags */
+ /* Clear state flags */
rec->state = 0;
+ if (((DEVICE *)block->dev)->state & ST_TAPE) {
+ rec->state |= REC_ISTAPE;
+ }
+
/*
* Get the header. There is always a full header,
unser_begin(block->bufp, WRITE_RECHDR_LENGTH);
if (block->BlockVer == 1) {
- unser_uint32(VolSessionId);
- unser_uint32(VolSessionTime);
+ unser_uint32(VolSessionId);
+ unser_uint32(VolSessionTime);
} else {
VolSessionId = block->VolSessionId;
VolSessionTime = block->VolSessionTime;
rec->VolSessionId = VolSessionId;
rec->VolSessionTime = VolSessionTime;
rec->FileIndex = FileIndex;
+ if (FileIndex > 0) {
+ if (block->FirstIndex == 0) {
+ block->FirstIndex = FileIndex;
+ }
+ block->LastIndex = FileIndex;
+ }
- Dmsg6(100, "rd_rec_blk() got FI=%s SessId=%d Strm=%s len=%u\n\
-remlen=%d data_len=%d\n",
+ Dmsg6(100, "rd_rec_blk() got FI=%s SessId=%d Strm=%s len=%u\n"
+ "remlen=%d data_len=%d\n",
FI_to_ascii(rec->FileIndex), rec->VolSessionId,
stream_to_ascii(rec->Stream, rec->FileIndex), data_bytes, remlen,
rec->data_len);
}
#endif
rec->state |= (REC_NO_HEADER | REC_BLOCK_EMPTY);
+ empty_block(block); /* mark block empty */
return 0;
}