#include "stored.h"
/* Forward referenced functions */
-static int record_cb(JCR *jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec);
+static bool record_cb(DCR *dcr, DEV_RECORD *rec);
/* Global variables */
static JCR *in_jcr; /* input jcr */
static JCR *out_jcr; /* output jcr */
static BSR *bsr = NULL;
-static char *wd = "/tmp";
+static const char *wd = "/tmp";
static int list_records = 0;
static uint32_t records = 0;
static uint32_t jobs = 0;
#define CONFIG_FILE "bacula-sd.conf"
char *configfile;
+bool forge_on = true;
static void usage()
{
fprintf(stderr, _(
+"Copyright (C) 2002-2004 Kern Sibbald and John Walker.\n"
"\nVersion: " VERSION " (" BDATE ")\n\n"
"Usage: bcopy [-d debug_level] <input-archive> <output-archive>\n"
" -b bootstrap specify a bootstrap file\n"
case 'p':
ignore_label_errors = true;
+ forge_on = true;
break;
case 'v':
parse_config(configfile);
/* Setup and acquire input device for reading */
- in_jcr = setup_jcr("bcopy", argv[0], bsr, iVolumeName);
+ in_jcr = setup_jcr("bcopy", argv[0], bsr, iVolumeName, 1); /* read device */
+ if (!in_jcr) {
+ exit(1);
+ }
in_jcr->ignore_label_errors = ignore_label_errors;
- in_dev = setup_to_access_device(in_jcr, 1); /* read device */
+ in_dev = in_jcr->dcr->dev;
if (!in_dev) {
exit(1);
}
/* Setup output device for writing */
- out_jcr = setup_jcr("bcopy", argv[1], bsr, oVolumeName);
- out_dev = setup_to_access_device(out_jcr, 0); /* no acquire */
+ out_jcr = setup_jcr("bcopy", argv[1], bsr, oVolumeName, 0); /* no acquire */
+ if (!out_jcr) {
+ exit(1);
+ }
+ out_dev = out_jcr->dcr->dev;
if (!out_dev) {
exit(1);
}
/* For we must now acquire the device for writing */
lock_device(out_dev);
- if (open_dev(out_dev, out_jcr->VolumeName, READ_WRITE) < 0) {
+ if (open_dev(out_dev, out_jcr->dcr->VolumeName, OPEN_READ_WRITE) < 0) {
Emsg1(M_FATAL, 0, _("dev open failed: %s\n"), out_dev->errmsg);
unlock_device(out_dev);
exit(1);
}
out_block = out_jcr->dcr->block;
- read_records(in_jcr, in_dev, record_cb, mount_next_read_volume);
- if (!write_block_to_device(out_jcr->dcr, out_block)) {
+ read_records(in_jcr->dcr, record_cb, mount_next_read_volume);
+ if (!write_block_to_device(out_jcr->dcr)) {
Pmsg0(000, _("Write of last block failed.\n"));
}
Pmsg2(000, _("%u Jobs copied. %u records copied.\n"), jobs, records);
- term_dev(in_dev);
- term_dev(out_dev);
free_jcr(in_jcr);
free_jcr(out_jcr);
+
+ term_dev(in_dev);
+ term_dev(out_dev);
return 0;
}
/*
* read_records() calls back here for each record it gets
*/
-static int record_cb(JCR *in_jcr, DEVICE *dev, DEV_BLOCK *block, DEV_RECORD *rec)
+static bool record_cb(DCR *in_dcr, DEV_RECORD *rec)
{
if (list_records) {
Pmsg5(000, _("Record: SessId=%u SessTim=%u FileIndex=%d Stream=%d len=%u\n"),
if (rec->FileIndex < 0) {
if (verbose > 1) {
- dump_label_record(dev, rec, 1);
+ dump_label_record(in_dcr->dev, rec, 1);
}
switch (rec->FileIndex) {
case PRE_LABEL:
Pmsg0(000, "Volume is prelabeled. This volume cannot be copied.\n");
- return 1;
+ return false;
case VOL_LABEL:
Pmsg0(000, "Volume label not copied.\n");
- return 1;
+ return true;
case SOS_LABEL:
jobs++;
break;
while (!write_record_to_block(out_block, rec)) {
Dmsg2(150, "!write_record_to_block data_len=%d rem=%d\n", rec->data_len,
rec->remainder);
- if (!write_block_to_device(out_jcr->dcr, out_block)) {
+ if (!write_block_to_device(out_jcr->dcr)) {
Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n",
dev_name(out_dev), strerror_dev(out_dev));
Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
strerror_dev(out_dev));
}
}
- if (!write_block_to_device(out_jcr->dcr, out_block)) {
+ if (!write_block_to_device(out_jcr->dcr)) {
Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n",
dev_name(out_dev), strerror_dev(out_dev));
Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
break;
case EOM_LABEL:
Pmsg0(000, "EOM label not copied.\n");
- return 1;
+ return true;
case EOT_LABEL: /* end of all tapes */
Pmsg0(000, "EOT label not copied.\n");
- return 1;
+ return true;
default:
break;
}
while (!write_record_to_block(out_block, rec)) {
Dmsg2(150, "!write_record_to_block data_len=%d rem=%d\n", rec->data_len,
rec->remainder);
- if (!write_block_to_device(out_jcr->dcr, out_block)) {
+ if (!write_block_to_device(out_jcr->dcr)) {
Dmsg2(90, "Got write_block_to_dev error on device %s. %s\n",
dev_name(out_dev), strerror_dev(out_dev));
Jmsg(out_jcr, M_FATAL, 0, _("Cannot fixup device error. %s\n"),
break;
}
}
- return 1;
+ return true;
}
/* Dummies to replace askdir.c */
-int dir_get_volume_info(JCR *jcr, enum get_vol_info_rw writing) { return 1;}
-int dir_find_next_appendable_volume(JCR *jcr) { return 1;}
-int dir_update_volume_info(JCR *jcr, DEVICE *dev, int relabel) { return 1; }
-int dir_create_jobmedia_record(JCR *jcr) { return 1; }
-int dir_ask_sysop_to_create_appendable_volume(JCR *jcr, DEVICE *dev) { return 1; }
-int dir_update_file_attributes(JCR *jcr, DEV_RECORD *rec) { return 1;}
-int dir_send_job_status(JCR *jcr) {return 1;}
+bool dir_get_volume_info(DCR *dcr, enum get_vol_info_rw writing) { return 1;}
+bool dir_find_next_appendable_volume(DCR *dcr) { return 1;}
+bool dir_update_volume_info(DCR *dcr, bool relabel) { return 1; }
+bool dir_create_jobmedia_record(DCR *dcr) { return 1; }
+bool dir_ask_sysop_to_create_appendable_volume(DCR *dcr) { return 1; }
+bool dir_update_file_attributes(DCR *dcr, DEV_RECORD *rec) { return 1;}
+bool dir_send_job_status(JCR *jcr) {return 1;}
-int dir_ask_sysop_to_mount_volume(JCR *jcr, DEVICE *dev)
+bool dir_ask_sysop_to_mount_volume(DCR *dcr)
{
- fprintf(stderr, "Mount Volume \"%s\" on device \"%s\" and press return when ready: ",
- in_jcr->VolumeName, dev_name(dev));
+ DEVICE *dev = dcr->dev;
+ fprintf(stderr, "Mount Volume \"%s\" on device %s and press return when ready: ",
+ dcr->VolumeName, dev_name(dev));
getchar();
- return 1;
+ return true;
}