B_TAPE_DEV,
B_DVD_DEV,
B_FIFO_DEV,
- B_VTL_DEV
+ B_FAKETAPE_DEV, /* change to B_TAPE_DEV after init */
+ B_VTL_DEV
};
/* Generic status bits returned from status_dev() */
class DEVRES; /* Device resource defined in stored_conf.h */
-
class DCR; /* forward reference */
class VOLRES; /* forward reference */
-
/*
* Device structure definition. There is one of these for
* each physical device. Everything here is "global" to
bool m_unload; /* set when Volume must be unloaded */
bool m_load; /* set when Volume must be loaded */
int m_num_reserved; /* counter of device reservations */
+ int32_t m_slot; /* slot loaded in drive or -1 if none */
+
public:
DEVICE * volatile swap_dev; /* Swap vol from this device */
dlist *attached_dcrs; /* attached DCR list */
bool initiated; /* set when init_dev() called */
int label_type; /* Bacula/ANSI/IBM label types */
uint32_t drive_index; /* Autochanger drive index (base 0) */
- int32_t Slot; /* Slot currently in drive (base 1) */
POOLMEM *dev_name; /* Physical device name */
POOLMEM *prt_name; /* Name used for display purposes */
char *errmsg; /* nicely edited error message */
uint32_t block_num; /* current block number base 0 */
+ uint32_t LastBlock; /* last DEV_BLOCK number written to Volume */
uint32_t file; /* current file number base 0 */
uint64_t file_addr; /* Current file read/write address */
uint64_t file_size; /* Current file size */
int is_autochanger() const { return capabilities & CAP_AUTOCHANGER; }
int requires_mount() const { return capabilities & CAP_REQMOUNT; }
int is_removable() const { return capabilities & CAP_REM; }
- int is_tape() const { return dev_type == B_TAPE_DEV; }
+ int is_tape() const { return (dev_type == B_TAPE_DEV ||
+ dev_type == B_FAKETAPE_DEV); }
int is_file() const { return dev_type == B_FILE_DEV; }
int is_fifo() const { return dev_type == B_FIFO_DEV; }
int is_dvd() const { return dev_type == B_DVD_DEV; }
int is_vtl() const { return dev_type == B_VTL_DEV; }
+ int is_faketape() const { return dev_type == B_FAKETAPE_DEV; }
int is_open() const { return m_fd >= 0; }
int is_offline() const { return state & ST_OFFLINE; }
int is_labeled() const { return state & ST_LABEL; }
void clear_load() { m_load = false; };
char *bstrerror(void) { return errmsg; };
char *print_errmsg() { return errmsg; };
+ int32_t get_slot() const { return m_slot; };
void clear_volhdr(); /* in dev.c */
void clrerror(int func); /* in dev.c */
boffset_t lseek(DCR *dcr, boffset_t offset, int whence); /* in dev.c */
bool update_pos(DCR *dcr); /* in dev.c */
+ void set_slot(int32_t slot); /* in dev.c */
+ void clear_slot(); /* in dev.c */
+
+
bool update_freespace(); /* in dvd.c */
uint32_t get_file() const { return file; };
uint32_t get_block_num() const { return block_num; };
int fd() const { return m_fd; };
+ /* low level operations */
+ void init_backend();
+ int (*d_open)(const char *pathname, int flags, ...);
+ int (*d_read)(int fd, void *buffer, unsigned int count);
+ int (*d_write)(int fd, const void *buffer, unsigned int count);
+ int (*d_close)(int fd);
+ int (*d_ioctl)(int fd, unsigned long int request, ...);
+
/*
* Locking and blocking calls
*/
bool is_eod_valid();
int check_volume_label(bool &ask, bool &autochanger);
void release_volume();
- void do_swapping();
+ void do_swapping(bool is_writing);
+ bool is_tape_position_ok();
};
/*
void set_in_use() { m_in_use = true; };
void clear_in_use() { m_in_use = false; };
void set_slot(int32_t slot) { m_slot = slot; };
+ void clear_slot() { m_slot = -1; };
int32_t get_slot() const { return m_slot; };
};