memcpy(&dcr->VolCatInfo, &saveVolCatInfo, sizeof(dcr->VolCatInfo));
}
-
+off_t DEVICE::lseek(DCR *dcr, off_t offset, int whence)
+{
+ if (is_dvd()) {
+ return lseek_dvd(dcr, offset, whence);
+ }
+ if (is_file()) {
+ return ::lseek(fd, offset, whence);
+ }
+ return -1;
+}
bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
bool scan_dir_for_volume(DCR *dcr); /* in scan.c */
bool reposition(uint32_t rfile, uint32_t rblock); /* in dev.c */
void clrerror(int func); /* in dev.c */
+ off_t lseek(DCR *dcr, off_t offset, int whence); /* in dev.c */
void set_blocked(int block) { dev_blocked = block; };
int get_blocked() const { return dev_blocked; };
return dev->fd;
}
-
-/* Protected version of lseek, which opens the right part if necessary */
+/* Deprecated */
off_t lseek_dev(DEVICE *dev, off_t offset, int whence)
{
DCR *dcr;
- off_t pos;
- char ed1[50], ed2[50];
- Dmsg5(400, "Enter lseek_dev fd=%d off=%s w=%d part=%d nparts=%d\n", dev->fd,
- edit_int64(offset, ed1), whence, dev->part, dev->num_dvd_parts);
if (!dev->is_dvd()) {
Dmsg0(400, "Using sys lseek\n");
return lseek(dev->fd, offset, whence);
}
dcr = (DCR *)dev->attached_dcrs->first(); /* any dcr will do */
+ return lseek_dvd(dcr, offset, whence);
+}
+
+
+/*
+ * Do an lseek on a DVD handling all the different parts
+ */
+off_t lseek_dvd(DCR *dcr, off_t offset, int whence)
+{
+ DEVICE *dev = dcr->dev;
+ off_t pos;
+ char ed1[50], ed2[50];
+
+ Dmsg5(400, "Enter lseek_dev fd=%d off=%s w=%d part=%d nparts=%d\n", dev->fd,
+ edit_int64(offset, ed1), whence, dev->part, dev->num_dvd_parts);
+
switch(whence) {
case SEEK_SET:
Dmsg2(400, "lseek_dev SEEK_SET to %s (part_start=%s)\n",
mode = OPEN_READ_WRITE;
}
while (dev->open(dcr, mode) < 0) {
- Dmsg0(150, "open_device failed\n");
+ Dmsg1(150, "open_device failed: ERR=%s\n", dev->bstrerror());
if (dev->is_file() && dev->is_removable()) {
Dmsg0(150, "call scan_dir_for_vol\n");
if (dev->scan_dir_for_volume(dcr)) {
/* From dev.c */
DEVICE *init_dev(JCR *jcr, DEVRES *device);
-off_t lseek_dev(DEVICE *dev, off_t offset, int whence);
bool can_open_mounted_dev(DEVICE *dev);
bool truncate_dev(DCR *dcr);
void term_dev(DEVICE *dev);
bool truncate_dvd(DCR *dcr);
bool check_can_write_on_non_blank_dvd(DCR *dcr);
int find_num_dvd_parts(DCR *dcr);
+off_t lseek_dvd(DCR *dcr, off_t offset, int whence);
+off_t lseek_dev(DEVICE *dev, off_t offset, int whence); /* deprecated */
/* From device.c */
bool open_device(DCR *dcr);
Technical notes on version 1.39
General:
+14Sep06
+kes Create lseek() method for DEVICE that takes dcr as an
+ argument. This is to eliminate the use of attached_dcrs in
+ lseek(). The calls to lseek_dev() must still be changed.
13Sep06
kes Apply Richard Mortimer's patches for printing an error
message in btape when a DVD is used, and to initialize traceback.