本文整理汇总了C++中DEVICE::set_part_spooled方法的典型用法代码示例。如果您正苦于以下问题:C++ DEVICE::set_part_spooled方法的具体用法?C++ DEVICE::set_part_spooled怎么用?C++ DEVICE::set_part_spooled使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类DEVICE
的用法示例。
在下文中一共展示了DEVICE::set_part_spooled方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dvd_remove_empty_part
void dvd_remove_empty_part(DCR *dcr)
{
DEVICE *dev = dcr->dev;
/* Remove the last part file if it is empty */
if (dev->is_dvd() && dev->num_dvd_parts > 0) {
struct stat statp;
uint32_t part_save = dev->part;
POOL_MEM archive_name(PM_FNAME);
int status;
dev->part = dev->num_dvd_parts;
make_spooled_dvd_filename(dev, archive_name);
/* Check that the part file is empty */
status = stat(archive_name.c_str(), &statp);
if (status == 0 && statp.st_size == 0) {
Dmsg3(100, "Unlink empty part in close call make_dvd_filename. part=%d num=%d vol=%s\n",
part_save, dev->num_dvd_parts, dev->getVolCatName());
Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
unlink(archive_name.c_str());
if (part_save == dev->part) {
dev->set_part_spooled(false); /* no spooled part left */
}
} else if (status < 0) {
if (part_save == dev->part) {
dev->set_part_spooled(false); /* spool doesn't exit */
}
}
dev->part = part_save; /* restore part number */
}
}
示例2: truncate_dvd
bool truncate_dvd(DCR *dcr)
{
DEVICE* dev = dcr->dev;
dev->clear_freespace_ok(); /* need to update freespace */
dev->close_part(dcr);
if (!dev->unmount(1)) {
Dmsg0(400, "truncate_dvd: Failed to unmount DVD\n");
return false;
}
/* If necessary, delete its spool file. */
if (dev->is_part_spooled()) {
POOL_MEM archive_name(PM_FNAME);
/* Delete spool file */
make_spooled_dvd_filename(dev, archive_name);
unlink(archive_name.c_str());
dev->set_part_spooled(false);
}
/* Set num_dvd_parts to zero (on disk) */
dev->part = 0;
dev->num_dvd_parts = 0;
dcr->VolCatInfo.VolCatParts = 0;
dev->VolCatInfo.VolCatParts = 0;
Dmsg0(400, "truncate_dvd: Opening first part (1)...\n");
dev->truncating = true;
/* This creates a zero length spool file and sets part=1 */
if (!dvd_open_first_part(dcr, CREATE_READ_WRITE)) {
Dmsg0(400, "truncate_dvd: Error while opening first part (1).\n");
dev->truncating = false;
return false;
}
dev->close_part(dcr);
Dmsg0(400, "truncate_dvd: Opening first part (2)...\n");
/*
* Now actually truncate the DVD which is done by writing
* a zero length part to the DVD/
*/
if (!dvd_write_part(dcr)) {
Dmsg0(400, "truncate_dvd: Error while writing to DVD.\n");
dev->truncating = false;
return false;
}
dev->truncating = false;
/* Set num_dvd_parts to zero (on disk) */
dev->part = 0;
dev->num_dvd_parts = 0;
dcr->VolCatInfo.VolCatParts = 0;
dev->VolCatInfo.VolCatParts = 0;
/* Clear the size of the volume */
dev->VolCatInfo.VolCatBytes = 0;
dcr->VolCatInfo.VolCatBytes = 0;
/* Update catalog */
if (!dir_update_volume_info(dcr, false, true)) {
return false;
}
return true;
}
示例3: dvd_open_next_part
/*
* Open the next part file.
* - Close the fd
* - Increment part number
* - Reopen the device
*/
int dvd_open_next_part(DCR *dcr)
{
DEVICE *dev = dcr->dev;
Dmsg6(29, "Enter: == open_next_part part=%d npart=%d dev=%s vol=%s mode=%d file_addr=%d\n",
dev->part, dev->num_dvd_parts, dev->print_name(),
dev->getVolCatName(), dev->openmode, dev->file_addr);
if (!dev->is_dvd()) {
Dmsg1(100, "Device %s is not dvd!!!!\n", dev->print_name());
return -1;
}
/* When appending, do not open a new part if the current is empty */
if (dev->can_append() && (dev->part > dev->num_dvd_parts) &&
(dev->part_size == 0)) {
Dmsg0(29, "open_next_part exited immediately (dev->part_size == 0).\n");
return dev->fd();
}
dev->close_part(dcr); /* close current part */
/*
* If we have a spooled part open, write it to the
* DVD before opening the next part.
*/
if (dev->is_part_spooled()) {
Dmsg2(100, "Before open next write previous. part=%d num_parts=%d\n",
dev->part, dev->num_dvd_parts);
if (!dvd_write_part(dcr)) {
Dmsg0(29, "Error in dvd_write part.\n");
return -1;
}
}
dev->part_start += dev->part_size;
dev->part++;
Dmsg2(29, "Inc part=%d num_dvd_parts=%d\n", dev->part, dev->num_dvd_parts);
/* Are we working on a part past what is written in the DVD? */
if (dev->num_dvd_parts < dev->part) {
POOL_MEM archive_name(PM_FNAME);
struct stat buf;
/*
* First check what is on DVD. If our part is there, we
* are in trouble, so bail out.
* NB: This is however not a problem if we are writing the first part.
* It simply means that we are over writing an existing volume...
*/
if (dev->num_dvd_parts > 0) {
make_mounted_dvd_filename(dev, archive_name); /* makes dvd name */
Dmsg1(100, "Check if part on DVD: %s\n", archive_name.c_str());
if (stat(archive_name.c_str(), &buf) == 0) {
/* bad news bail out */
dev->set_part_spooled(false);
Mmsg1(&dev->errmsg, _("Next Volume part already exists on DVD. Cannot continue: %s\n"),
archive_name.c_str());
return -1;
}
}
#ifdef neeeded
Dmsg2(400, "num_dvd_parts=%d part=%d\n", dev->num_dvd_parts, dev->part);
make_spooled_dvd_filename(dev, archive_name); /* makes spool name */
/* Check if the next part exists in spool directory . */
Dmsg1(100, "Check if part on spool: %s\n", archive_name.c_str());
if ((stat(archive_name.c_str(), &buf) == 0) || (errno != ENOENT)) {
Dmsg1(29, "======= Part %s is in the way, deleting it...\n", archive_name.c_str());
/* Then try to unlink it */
if (unlink(archive_name.c_str()) < 0) {
berrno be;
dev->set_part_spooled(false);
dev->dev_errno = errno;
Mmsg2(dev->errmsg, _("open_next_part can't unlink existing part %s, ERR=%s\n"),
archive_name.c_str(), be.bstrerror());
return -1;
}
}
#endif
}
Dmsg2(400, "Call dev->open(vol=%s, mode=%d)\n", dcr->getVolCatName(),
dev->openmode);
/* Open next part. Note, this sets part_size for part opened. */
if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
return -1;
}
dev->set_labeled(); /* all next parts are "labeled" */
return dev->fd();
}
示例4: dvd_write_part
/*
* Note!!!! Part numbers now begin at 1. The part number is
* suppressed from the first part, which is just the Volume
* name. Each subsequent part is the Volumename.partnumber.
*
* Write a part (Vol, Vol.2, ...) from the spool to the DVD
* This routine does not update the part number, so normally, you
* should call open_next_part()
*
* It is also called from truncate_dvd to "blank" the medium, as
* well as from block.c when the DVD is full to write the last part.
*/
bool dvd_write_part(DCR *dcr)
{
DEVICE *dev = dcr->dev;
POOL_MEM archive_name(PM_FNAME);
/*
* Don't write empty part files.
* This is only useful when growisofs does not support write beyond
* the 4GB boundary.
* Example :
* - 3.9 GB on the volume, dvd-freespace reports 0.4 GB free
* - Write 0.2 GB on the volume, Bacula thinks it could still
* append data, it creates a new empty part.
* - dvd-freespace reports 0 GB free, as the 4GB boundary has
* been crossed
* - Bacula thinks he must finish to write to the device, so it
* tries to write the last part (0-byte), but dvd-writepart fails...
*
* There is one exception: when recycling a volume, we write a blank part
* file, so, then, we need to accept to write it.
*/
if (dev->part_size == 0 && !dev->truncating) {
Dmsg2(29, "dvd_write_part: device is %s, won't write blank part %d\n", dev->print_name(), dev->part);
/* Delete spool file */
make_spooled_dvd_filename(dev, archive_name);
unlink(archive_name.c_str());
dev->set_part_spooled(false);
Dmsg1(29, "========= unlink(%s)\n", archive_name.c_str());
Dsm_check(400);
return true;
}
POOL_MEM ocmd(PM_FNAME);
POOL_MEM results(PM_MESSAGE);
char* icmd;
int status;
int timeout;
char ed1[50];
dev->clear_freespace_ok(); /* need to update freespace */
Dsm_check(400);
Dmsg3(29, "dvd_write_part: device is %s, part is %d, is_mounted=%d\n", dev->print_name(), dev->part, dev->is_mounted());
icmd = dev->device->write_part_command;
dev->edit_mount_codes(ocmd, icmd);
/*
* original line follows
* timeout = dev->max_open_wait + (dev->max_part_size/(1350*1024/2));
* I modified this for a longer timeout; pre-formatting, blanking and
* writing can take quite a while
*/
/* Explanation of the timeout value, when writing the first part,
* by Arno Lehmann :
* 9 GB, write speed 1x: 6990 seconds (almost 2 hours...)
* Overhead: 900 seconds (starting, initializing, finalizing,probably
* reloading 15 minutes)
* Sum: 15780.
* A reasonable last-exit timeout would be 16000 seconds. Quite long -
* almost 4.5 hours, but hopefully, that timeout will only ever be needed
* in case of a serious emergency.
*/
if (dev->part == 1) {
timeout = 16000;
} else {
timeout = dev->max_open_wait + (dev->part_size/(1350*1024/4));
}
Dmsg2(20, "Write part: cmd=%s timeout=%d\n", ocmd.c_str(), timeout);
status = run_program_full_output(ocmd.c_str(), timeout, results.addr());
Dmsg2(20, "Write part status=%d result=%s\n", status, results.c_str());
dev->blank_dvd = false;
if (status != 0) {
Jmsg2(dcr->jcr, M_FATAL, 0, _("Error writing part %d to the DVD: ERR=%s\n"),
dev->part, results.c_str());
Mmsg1(dev->errmsg, _("Error while writing current part to the DVD: %s"),
results.c_str());
Dmsg1(100, "%s\n", dev->errmsg);
dev->dev_errno = EIO;
if (!dev->truncating) {
dcr->mark_volume_in_error();
}
Dsm_check(400);
return false;
//.........这里部分代码省略.........