free_pool_memory(query);
return 0;
}
- fsr.FileSetId = 0;
- strcpy(fsr.FileSet, fileset_name);
+ fsr.FileSetId = atoi(fileset_name); /* Id is first part of name */
if (!db_get_fileset_record(ua->db, &fsr)) {
bsendmsg(ua, "Error getting FileSet record: %s\n", db_strerror(ua->db));
bsendmsg(ua, _("This probably means you modified the FileSet.\n"
"Continuing anyway.\n"));
}
+ /* Find JobId of last Full backup for this client, fileset */
Mmsg(&query, uar_last_full, ji->client->hdr.name, fsr.FileSetId);
- /* Find JobId of full Backup of system */
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s\n", db_strerror(ua->db));
}
*/
static int fileset_handler(void *ctx, int num_fields, char **row)
{
- add_prompt((UAContext *)ctx, row[1]);
+ char prompt[MAX_NAME_LENGTH+200];
+
+ snprintf(prompt, sizeof(prompt), "%s %s %s", row[0], row[1], row[2]);
+ add_prompt((UAContext *)ctx, prompt);
return 0;
}
jcr->buf_size = sd->msglen;
/* Adjust for compression so that output buffer is
- * 12 bytes + 0.1% larger than input buffer plus 2 bytes.
+ * 12 bytes + 0.1% larger than input buffer plus 18 bytes.
+ * This gives a bit extra plus room for the sparse addr if any.
* Note, we adjust the read size to be smaller so that the
* same output buffer can be used without growing it.
*/
- jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 14;
+ jcr->compress_buf_size = jcr->buf_size + ((jcr->buf_size+999) / 1000) + 30;
jcr->compress_buf = get_memory(jcr->compress_buf_size);
Dmsg1(100, "set_find_options ff=%p\n", jcr->ff);
*
*/
if (ff_pkt->fid >= 0) {
+ uint64_t fileAddr = 0; /* file address */
+ char *rbuf, *wbuf;
+ int rsize = jcr->buf_size; /* read buffer size */
+
+ msgsave = sd->msg;
+ rbuf = sd->msg; /* read buffer */
+ wbuf = sd->msg; /* write buffer */
Dmsg1(100, "Saving data, type=%d\n", ff_pkt->type);
- /*
- * Send Data header to Storage daemon
- * <file-index> <stream> <info>
- */
if (ff_pkt->flags & FO_SPARSE) {
stream = STREAM_SPARSE_DATA;
}
#ifdef HAVE_LIBZ
- uLong compress_len;
+ uLong compress_len, max_compress_len = 0;
const Bytef *cbuf = NULL;
if (ff_pkt->flags & FO_GZIP) {
if (ff_pkt->flags & FO_SPARSE) {
cbuf = (Bytef *)jcr->compress_buf + SPARSE_FADDR_SIZE;
- compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
+ max_compress_len = jcr->compress_buf_size - SPARSE_FADDR_SIZE;
} else {
cbuf = (Bytef *)jcr->compress_buf;
- compress_len = jcr->compress_buf_size; /* set max length */
+ max_compress_len = jcr->compress_buf_size; /* set max length */
}
+ wbuf = jcr->compress_buf; /* compressed output here */
}
#endif
#ifndef NO_FD_SEND_TEST
+ /*
+ * Send Data header to Storage daemon
+ * <file-index> <stream> <info>
+ */
if (!bnet_fsend(sd, "%ld %d 0", jcr->JobFiles, stream)) {
close(ff_pkt->fid);
return 0;
MD5Init(&md5c);
}
- msgsave = sd->msg;
- uint64_t fileAddr = 0; /* file address */
- char *rbuf = sd->msg; /* read buffer */
- int rsize = jcr->buf_size; /* read size */
-
- /* Make space at beginning of buffer for fileAddr */
+ /*
+ * Make space at beginning of buffer for fileAddr because this
+ * same buffer will be used for writing if compression if off.
+ */
if (ff_pkt->flags & FO_SPARSE) {
rbuf += SPARSE_FADDR_SIZE;
rsize -= SPARSE_FADDR_SIZE;
sparseBlock = is_buf_zero(rbuf, rsize);
}
- ser_begin(sd->msg, SPARSE_FADDR_SIZE);
+ ser_begin(wbuf, SPARSE_FADDR_SIZE);
ser_uint64(fileAddr); /* store fileAddr in begin of buffer */
}
#ifdef HAVE_LIBZ
/* Do compression if turned on */
if (!sparseBlock && ff_pkt->flags & FO_GZIP) {
- if (compress2((Bytef *)cbuf, &compress_len,
+ int zstat;
+ compress_len = max_compress_len;
+ Dmsg4(400, "cbuf=0x%x len=%u rbuf=0x%x len=%u\n", cbuf, compress_len,
+ rbuf, sd->msglen);
+ /* NOTE! This call modifies compress_len !!! */
+ if ((zstat=compress2((Bytef *)cbuf, &compress_len,
(const Bytef *)rbuf, (uLong)sd->msglen,
- ff_pkt->GZIP_level) != Z_OK) {
- Jmsg(jcr, M_FATAL, 0, _("Compression error\n"));
+ ff_pkt->GZIP_level)) != Z_OK) {
+ Jmsg(jcr, M_FATAL, 0, _("Compression error: %d\n"), zstat);
sd->msg = msgsave;
sd->msglen = 0;
close(ff_pkt->fid);
return 0;
}
- Dmsg2(100, "compressed len=%d uncompressed len=%d\n",
+ Dmsg2(400, "compressed len=%d uncompressed len=%d\n",
compress_len, sd->msglen);
- sd->msg = jcr->compress_buf; /* write compressed buffer */
- sd->msglen = compress_len;
+ sd->msglen = compress_len; /* set compressed length */
}
#endif
if (ff_pkt->flags & FO_SPARSE) {
sd->msglen += SPARSE_FADDR_SIZE; /* include fileAddr in size */
}
+ sd->msg = wbuf; /* set correct write buffer */
if (!bnet_send(sd)) {
sd->msg = msgsave; /* restore read buffer */
sd->msglen = 0;
} else if (stream == STREAM_GZIP_DATA || stream == STREAM_SPARSE_GZIP_DATA) {
#ifdef HAVE_LIBZ
if (extract) {
+ ser_declare;
uLong compress_len;
+ uint64_t faddr;
+ char ec1[50];
int stat;
if (stream == STREAM_SPARSE_GZIP_DATA) {
wbuf = sd->msg + SPARSE_FADDR_SIZE;
wsize = sd->msglen - SPARSE_FADDR_SIZE;
- if (fileAddr != *((uint64_t *)sd->msg)) {
- fileAddr = *((uint64_t *)sd->msg);
+ ser_begin(sd->msg, SPARSE_FADDR_SIZE);
+ unser_uint64(faddr);
+ if (fileAddr != faddr) {
+ fileAddr = faddr;
if (lseek(ofd, (off_t)fileAddr, SEEK_SET) < 0) {
- Jmsg2(jcr, M_ERROR, 0, "Seek error on %s: %s\n", ofile, strerror(errno));
+ Jmsg3(jcr, M_ERROR, 0, _("Seek to %s error on %s: ERR=%s\n"),
+ edit_uint64(fileAddr, ec1), ofile, strerror(errno));
goto bail_out;
}
}