]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dev.h
ebl rename faketape to vtape
[bacula/bacula] / bacula / src / stored / dev.h
index 619460ef1d028b9b636ab207dd22861072ee3792..9d022184408efeb35c45561869a163948b5d7f63 100644 (file)
@@ -95,7 +95,8 @@ enum {
    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() */
@@ -197,11 +198,9 @@ struct VOLUME_CAT_INFO {
 
 
 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
@@ -216,6 +215,8 @@ private:
    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 */
@@ -237,11 +238,11 @@ public:
    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 */
@@ -307,11 +308,13 @@ public:
    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; }
@@ -385,6 +388,7 @@ public:
    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 */
@@ -415,12 +419,24 @@ public:
    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
     */
@@ -533,7 +549,8 @@ public:
    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();
 };
 
 /*
@@ -542,6 +559,7 @@ public:
 class VOLRES { 
    bool m_swapping;                   /* set when swapping to another drive */
    bool m_in_use;                     /* set when volume reserved or in use */
+   int32_t m_slot;                    /* slot of swapping volume */
 public:
    dlink link;
    char *vol_name;                    /* Volume name */
@@ -553,6 +571,9 @@ public:
    bool is_in_use() const { return m_in_use; };
    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; };
 };