static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
static void open_tape_device(DEVICE *dev, int mode);
static void open_file_device(DEVICE *dev, int mode);
+static void open_dvd_device(DEVICE *dev, int mode);
/*
* Allocate and initialize the DEVICE structure
label_type = B_BACULA_LABEL;
if (is_tape() || is_fifo()) {
open_tape_device(this, mode);
+ } else if (is_dvd()) {
+ Dmsg1(100, "call open_dvd_device mode=%d\n", mode);
+ open_dvd_device(this, mode);
} else {
Dmsg1(100, "call open_file_device mode=%d\n", mode);
open_file_device(this, mode);
}
/*
- * Open a file or DVD device
+ * Open a file device
*/
static void open_file_device(DEVICE *dev, int mode)
+{
+ POOL_MEM archive_name(PM_FNAME);
+
+ /*
+ * Handle opening of File Archive (not a tape)
+ */
+ Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
+ archive_name.c_str(), mode);
+
+ if (dev->VolCatInfo.VolCatName[0] == 0) {
+ Mmsg(dev->errmsg, _("Could not open file device %s. No Volume name given.\n"),
+ dev->print_name());
+ dev->fd = -1;
+ return;
+ }
+
+ get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
+
+ Dmsg3(29, "open dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
+ archive_name.c_str(), mode);
+ dev->openmode = mode;
+
+ if (mode == OPEN_READ_WRITE) {
+ dev->mode = O_CREAT | O_RDWR | O_BINARY;
+ } else if (mode == OPEN_READ_ONLY) {
+ dev->mode = O_RDONLY | O_BINARY;
+ } else if (mode == OPEN_WRITE_ONLY) {
+ dev->mode = O_WRONLY | O_BINARY;
+ } else {
+ Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
+ }
+ /* If creating file, give 0640 permissions */
+ Dmsg3(29, "mode=%d open(%s, 0x%x, 0640)\n", mode, archive_name.c_str(), dev->mode);
+ if ((dev->fd = open(archive_name.c_str(), dev->mode, 0640)) < 0) {
+ berrno be;
+ dev->dev_errno = errno;
+ Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
+ be.strerror());
+ Dmsg1(29, "open failed: %s", dev->errmsg);
+ Emsg0(M_FATAL, 0, dev->errmsg);
+ } else {
+ dev->dev_errno = 0;
+ dev->state |= ST_OPENED;
+ dev->use_count = 1;
+ update_pos_dev(dev); /* update position */
+ }
+ Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
+ dev->is_dvd()?"DVD":"disk", dev->fd, dev->part, dev->num_parts,
+ dev->part_size);
+}
+
+/*
+ * Open a DVD device
+ */
+static void open_dvd_device(DEVICE *dev, int mode)
{
POOL_MEM archive_name(PM_FNAME);
struct stat filestat;
return;
}
- if (dev->is_dvd()) {
- if (dev->part == 0) {
- dev->file_size = 0;
- }
- dev->part_size = 0;
-
- /* if num_parts has not been set, but VolCatInfo is available, copy
- * it from the VolCatInfo.VolCatParts */
- if (dev->num_parts < dev->VolCatInfo.VolCatParts) {
- dev->num_parts = dev->VolCatInfo.VolCatParts;
- }
-
- get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
+ if (dev->part == 0) {
+ dev->file_size = 0;
+ }
+ dev->part_size = 0;
+
+ /* if num_parts has not been set, but VolCatInfo is available, copy
+ * it from the VolCatInfo.VolCatParts */
+ if (dev->num_parts < dev->VolCatInfo.VolCatParts) {
+ dev->num_parts = dev->VolCatInfo.VolCatParts;
+ }
+
+ get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
- if (mount_dev(dev, 1) < 0) {
- Mmsg(dev->errmsg, _("Could not mount device %s.\n"),
- dev->print_name());
- Emsg0(M_FATAL, 0, dev->errmsg);
- dev->fd = -1;
- return;
- }
- } else {
- get_filename(dev, dev->VolCatInfo.VolCatName, archive_name);
+ if (mount_dev(dev, 1) < 0) {
+ Mmsg(dev->errmsg, _("Could not mount device %s.\n"),
+ dev->print_name());
+ Emsg0(M_FATAL, 0, dev->errmsg);
+ dev->fd = -1;
+ return;
}
Dmsg3(29, "open dev: %s dev=%s mode=%d\n", dev->is_dvd()?"DVD":"disk",
Mmsg2(dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(),
be.strerror());
Dmsg1(29, "open failed: %s", dev->errmsg);
- Emsg0(M_FATAL, 0, dev->errmsg);
} else {
- dev->dev_errno = 0;
- dev->state |= ST_OPENED;
- dev->use_count = 1;
- update_pos_dev(dev); /* update position */
+ /* Get size of file */
if (fstat(dev->fd, &filestat) < 0) {
berrno be;
dev->dev_errno = errno;
Mmsg2(dev->errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(),
be.strerror());
- Emsg0(M_FATAL, 0, dev->errmsg);
Dmsg1(29, "open failed: %s", dev->errmsg);
+ close(dev->fd);
+ dev->fd = -1;
} else {
dev->part_size = filestat.st_size;
+ dev->dev_errno = 0;
+ dev->state |= ST_OPENED;
+ dev->use_count = 1;
+ update_pos_dev(dev); /* update position */
}
}
Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n",
}
}
+
#ifdef debug_tracing
#undef rewind_dev
bool _rewind_dev(char *file, int line, DEVICE *dev)