dev->capabilities = device->cap_bits;
dev->min_block_size = device->min_block_size;
dev->max_block_size = device->max_block_size;
- dev->max_volume_jobs = device->max_volume_jobs;
- dev->max_volume_files = device->max_volume_files;
dev->max_volume_size = device->max_volume_size;
dev->max_file_size = device->max_file_size;
dev->volume_capacity = device->volume_capacity;
}
if (errno == EBUSY && timeout-- > 0) {
Dmsg2(100, "Device %s busy. ERR=%s\n", dev->dev_name, strerror(errno));
- sleep(1);
+ bmicrosleep(1, 0);
continue;
}
dev->dev_errno = errno;
Dmsg1(29, "open_dev: tape %d opened\n", dev->fd);
} else {
/*
- * Handle opening of file
+ * Handle opening of File Archive (not a tape)
*/
archive_name = get_pool_memory(PM_FNAME);
pm_strcpy(&archive_name, dev->dev_name);
clrerror_dev(dev, MTREW);
if (dev->dev_errno == EIO && i > 0) {
Dmsg0(200, "Sleeping 5 seconds.\n");
- sleep(5);
+ bmicrosleep(5, 0);
continue;
}
Mmsg2(&dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
}
return 0;
}
- if (dev->capabilities & CAP_EOM) {
+ if (dev_cap(dev, CAP_EOM)) {
mt_com.mt_op = MTEOM;
mt_com.mt_count = 1;
if ((stat=ioctl(dev->fd, MTIOCTOP, (char *)&mt_com)) < 0) {
}
}
}
- update_pos_dev(dev); /* update position */
+ /*
+ * Some drivers leave us after second EOF when doing
+ * MTEOM, so we must backup so that appending overwrites
+ * the second EOF.
+ */
+ if (dev_cap(dev, CAP_BSFATEOM)) {
+ stat = (bsf_dev(dev, 1) == 0);
+ dev->file++; /* keep same file */
+ } else {
+ update_pos_dev(dev); /* update position */
+ stat = 1;
+ }
Dmsg1(200, "EOD dev->file=%d\n", dev->file);
- return 1;
+ return stat;
}
/*
dev->file_addr = 0;
pos = lseek(dev->fd, (off_t)0, SEEK_CUR);
if (pos < 0) {
- Dmsg1(000, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
+ Pmsg1(000, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
dev->dev_name, strerror(dev->dev_errno));
{
struct mtop mt_com;
int stat = 0;
- char rbuf[1024];
if (dev->fd < 0) {
dev->dev_errno = EBADF;
Mmsg1(&dev->errmsg, _("Device %s at End of Tape.\n"), dev->dev_name);
return 0;
}
- if (dev->state & ST_EOF)
+ if (dev->state & ST_EOF) {
Dmsg0(200, "ST_EOF set on entry to FSF\n");
- if (dev->state & ST_EOT)
+ }
+ if (dev->state & ST_EOT) {
Dmsg0(200, "ST_EOT set on entry to FSF\n");
+ }
Dmsg0(29, "fsf_dev\n");
dev->block_num = 0;
- if (dev->capabilities & CAP_FSF) {
+ if (dev_cap(dev, CAP_FSF)) {
+ POOLMEM *rbuf;
+ int rbuf_len;
Dmsg0(200, "FSF has cap_fsf\n");
+ if (dev->max_block_size == 0) {
+ rbuf_len = DEFAULT_BLOCK_SIZE;
+ } else {
+ rbuf_len = dev->max_block_size;
+ }
+ rbuf = get_memory(rbuf_len);
mt_com.mt_op = MTFSF;
mt_com.mt_count = 1;
while (num-- && !(dev->state & ST_EOT)) {
- Dmsg0(200, "Doing read for fsf\n");
- if ((stat = read(dev->fd, rbuf, sizeof(rbuf))) < 0) {
+ Dmsg0(200, "Doing read before fsf\n");
+ if ((stat = read(dev->fd, (char *)rbuf, rbuf_len)) < 0) {
if (errno == ENOMEM) { /* tape record exceeds buf len */
- stat = sizeof(rbuf); /* This is OK */
+ stat = rbuf_len; /* This is OK */
} else {
dev->state |= ST_EOT;
clrerror_dev(dev, -1);
- Dmsg1(200, "Set ST_EOT read error %d\n", dev->dev_errno);
+ Dmsg2(200, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
+ strerror(dev->dev_errno));
Mmsg2(&dev->errmsg, _("read error on %s. ERR=%s.\n"),
dev->dev_name, strerror(dev->dev_errno));
Dmsg1(200, "%s", dev->errmsg);
dev->file_addr = 0;
}
}
+ free_memory(rbuf);
/*
* No FSF, so use FSR to simulate it
/*
* Write an end of file on the device
+ * Returns: 0 on success
+ * non-zero on failure
*/
int
weof_dev(DEVICE *dev, int num)