]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl update faketape driver to work with regress tests
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 9 Jun 2008 12:09:25 +0000 (12:09 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 9 Jun 2008 12:09:25 +0000 (12:09 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7122 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/configure
bacula/src/baconfig.h
bacula/src/stored/btape.c
bacula/src/stored/dev.c
bacula/src/stored/dev.h
bacula/src/stored/faketape.c
bacula/src/stored/faketape.h
bacula/src/stored/stored.h
bacula/src/stored/stored_conf.c
bacula/src/version.h
bacula/technotes-2.5

index 55745e5e8140da8be2e91c829148aa69cf1c4f20..ed189417b3fd677d912c2ea5eb1bc06da4afd1cf 100755 (executable)
@@ -1461,7 +1461,6 @@ Optional Features:
   --enable-bwx-console     enable build of wxWidgets console disabled
   --enable-tray-monitor   enable build of Gnome tray monitor (compatible with KDE) disabled
   --enable-smartalloc     enable smartalloc debugging support disabled
-  --enable-faketape         enable faketape debugging support disabled
   --enable-static-tools   enable static tape tools disabled
   --enable-static-fd      enable static File daemon disabled
   --enable-static-sd      enable static Storage daemon disabled
@@ -13430,7 +13429,6 @@ _ACEOF
 
 fi
 
-support_faketape=no
 support_mysql=no
 support_sqlite=no
 support_sqlite3=no
@@ -13685,25 +13683,6 @@ _ACEOF
 
 fi
 
-# -------------------------------------------
-# faketape (default off)
-# -------------------------------------------
-# Check whether --enable-faketape was given.
-if test "${enable_faketape+set}" = set; then
-  enableval=$enable_faketape; if test x$enableval = xyes; then
-    support_faketape=yes
-  fi
-fi
-
-
-if test x$support_faketape = xyes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define USE_FAKETAPE 1
-_ACEOF
-
-fi
-
 # -------------------------------------------
 # static-tools (default off)
 # -------------------------------------------
@@ -32275,7 +32254,6 @@ Configuration on `date`:
   Encryption support:        ${support_crypto}
   ZLIB support:              ${have_zlib}
   enable-smartalloc:         ${support_smartalloc}
-  enable-faketape:           ${support_faketape}
   bat support:               ${support_bat} ${QWT_LDFLAGS}
   enable-gnome:              ${support_gnome} ${gnome_version}
   enable-bwx-console:        ${support_wx_console} ${wx_version}
index af2bf44e0bf633f7c397440b594ce2d1c2bc55a1..c0e6ef087da90731f45af374ab0721dadc891528 100644 (file)
 void InitWinAPIWrapper();
 
 #define  OSDependentInit()    InitWinAPIWrapper()
-#define  tape_open            win32_tape_open
-#define  tape_ioctl           win32_tape_ioctl
-#define  tape_read            win32_tape_read
-#define  tape_write           win32_tape_write
-#define  tape_close           win32_tape_close
-#define  IS_TAPE(x)           S_ISCHR(x)
 
 #define sbrk(x)  0
 
@@ -117,22 +111,6 @@ void InitWinAPIWrapper();
 
 #define  OSDependentInit()
 
-#if defined(USE_FAKETAPE)
-#  define  tape_open            faketape_open
-#  define  tape_ioctl           faketape_ioctl
-#  define  tape_read            faketape_read
-#  define  tape_write           faketape_write
-#  define  tape_close           faketape_close
-#  define  IS_TAPE(x)           S_ISREG(x)
-#else  /* UNIX && !FAKETAPE */
-#  define  tape_open            ::open
-#  define  tape_ioctl           ::ioctl
-#  define  tape_read            ::read
-#  define  tape_write           ::write
-#  define  tape_close           ::close
-#  define  IS_TAPE(x)           S_ISCHR(x)
-#endif
-
 #endif /* HAVE_WIN32 */
 
 
index a92d01e215129b6e8e775def821fd838a361fc95..2aaaad2b58984b663c1d5d3f484648c98b1a0d6a 100644 (file)
@@ -2504,11 +2504,7 @@ static void rawfill_cmd()
    Pmsg1(0, _("Begin writing raw blocks of %u bytes.\n"), block->buf_len);
    for ( ;; ) {
       *p = block_num;
-      if (dev->is_tape()) {
-         stat = tape_write(dev->fd(), block->buf, block->buf_len);
-      } else {
-         stat = write(dev->fd(), block->buf, block->buf_len);
-      }
+      stat = dev->d_write(dev->fd(), block->buf, block->buf_len);
       if (stat == (int)block->buf_len) {
          if ((block_num++ % 100) == 0) {
             printf("+");
index 46c5bcce7f25f51b7016e9b753fc6b1b004412b1..b09c33dbcd45712c1d10a0d562e03e6c15409570 100644 (file)
@@ -123,10 +123,17 @@ init_dev(JCR *jcr, DEVRES *device)
       }
       if (S_ISDIR(statp.st_mode)) {
          device->dev_type = B_FILE_DEV;
-      } else if (IS_TAPE(statp.st_mode)) { /* char device or fake tape */
+      } else if (S_ISCHR(statp.st_mode)) {
          device->dev_type = B_TAPE_DEV;
       } else if (S_ISFIFO(statp.st_mode)) {
          device->dev_type = B_FIFO_DEV;
+#ifdef USE_FAKETAPE
+      /* must set DeviceType = Faketape 
+       * in normal mode, autodetection is disabled
+       */
+      } else if (S_ISREG(statp.st_mode)) { 
+         device->dev_type = B_FAKETAPE_DEV;
+#endif
       } else if (!(device->cap_bits & CAP_REQMOUNT)) {
          Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
                " or have RequiresMount=yes for DVD. st_mode=%x\n"),
@@ -162,6 +169,7 @@ init_dev(JCR *jcr, DEVRES *device)
    dev->drive_index = device->drive_index;
    dev->autoselect = device->autoselect;
    dev->dev_type = device->dev_type;
+   dev->init_backend();
    if (dev->is_tape()) { /* No parts on tapes */
       dev->max_part_size = 0;
    } else {
@@ -264,6 +272,34 @@ init_dev(JCR *jcr, DEVRES *device)
    return dev;
 }
 
+/* Choose the right backend */
+void DEVICE::init_backend()
+{
+   if (is_faketape()) {
+      d_open  = faketape_open;
+      d_write = faketape_write;
+      d_close = faketape_close;
+      d_ioctl = faketape_ioctl;
+      d_read  = faketape_read;
+
+#ifdef HAVE_WIN32
+   } else if (is_tape()) {
+      d_open  = win32_tape_open;
+      d_write = win32_tape_write;
+      d_close = win32_tape_close;
+      d_ioctl = win32_tape_ioctl;
+      d_read  = win32_tape_read;
+#endif
+
+   } else {
+      d_open  = ::open;
+      d_write = ::write;
+      d_close = ::close;
+      d_ioctl = ::ioctl;
+      d_read  = ::read;
+   }
+}
+
 /*
  * Open the device with the operating system and
  * initialize buffer pointers.
@@ -285,11 +321,7 @@ DEVICE::open(DCR *dcr, int omode)
       if (openmode == omode) {
          return m_fd;
       } else {
-         if (is_tape()) {
-            tape_close(m_fd);
-         } else {
-            ::close(m_fd);
-         }
+         d_close(m_fd);
          clear_opened();
          Dmsg0(100, "Close fd for mode change.\n");
          preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
@@ -368,7 +400,7 @@ void DEVICE::open_tape_device(DCR *dcr, int omode)
 #if defined(HAVE_WIN32)
 
    /*   Windows Code */
-   if ((m_fd = tape_open(dev_name, mode)) < 0) {
+   if ((m_fd = d_open(dev_name, mode)) < 0) {
       dev_errno = errno;
    }
 
@@ -378,7 +410,7 @@ void DEVICE::open_tape_device(DCR *dcr, int omode)
    /* If busy retry each second for max_open_wait seconds */
    for ( ;; ) {
       /* Try non-blocking open */
-      m_fd = tape_open(dev_name, mode+O_NONBLOCK);
+      m_fd = d_open(dev_name, mode+O_NONBLOCK);
       if (m_fd < 0) {
          berrno be;
          dev_errno = errno;
@@ -390,10 +422,10 @@ void DEVICE::open_tape_device(DCR *dcr, int omode)
          mt_com.mt_op = MTREW;
          mt_com.mt_count = 1;
          /* rewind only if dev is a tape */
-         if (is_tape() && (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0)) {
+         if (is_tape() && (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0)) {
             berrno be;
             dev_errno = errno;           /* set error status from rewind */
-            tape_close(m_fd);
+            d_close(m_fd);
             clear_opened();
             Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
                   be.bstrerror(dev_errno));
@@ -403,8 +435,8 @@ void DEVICE::open_tape_device(DCR *dcr, int omode)
             }
          } else {
             /* Got fd and rewind worked, so we must have medium in drive */
-            tape_close(m_fd);
-            m_fd = tape_open(dev_name, mode);  /* open normally */
+            d_close(m_fd);
+            m_fd = d_open(dev_name, mode);  /* open normally */
             if (m_fd < 0) {
                berrno be;
                dev_errno = errno;
@@ -688,7 +720,7 @@ void DEVICE::open_dvd_device(DCR *dcr, int omode)
                be.bstrerror());
          Dmsg1(100, "open failed: %s", errmsg);
          /* Use system close() */
-         ::close(m_fd);
+         d_close(m_fd);
          clear_opened();
       } else {
          part_size = filestat.st_size;
@@ -732,7 +764,7 @@ bool DEVICE::rewind(DCR *dcr)
        * retrying every 5 seconds.
        */
       for (i=max_rewind_wait; ; i -= 5) {
-         if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
+         if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
             berrno be;
             clrerror(MTREW);
             if (i == max_rewind_wait) {
@@ -746,7 +778,7 @@ bool DEVICE::rewind(DCR *dcr)
              */
             if (first && dcr) {
                int open_mode = openmode;
-               tape_close(m_fd);
+               d_close(m_fd);
                clear_opened();
                open(dcr, open_mode);
                if (m_fd < 0) {
@@ -886,7 +918,7 @@ bool DEVICE::eod(DCR *dcr)
          mt_com.mt_count = 1;
       }
 
-      if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
+      if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
          berrno be;
          clrerror(mt_com.mt_op);
          Dmsg1(50, "ioctl error: %s\n", be.bstrerror());
@@ -1030,7 +1062,7 @@ uint32_t status_dev(DEVICE *dev)
       stat |= BMT_TAPE;
       Pmsg0(-20,_(" Bacula status:"));
       Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
-      if (tape_ioctl(dev->fd(), MTIOCGET, (char *)&mt_stat) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCGET, (char *)&mt_stat) < 0) {
          berrno be;
          dev->dev_errno = errno;
          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
@@ -1157,7 +1189,7 @@ bool load_dev(DEVICE *dev)
    dev->file_addr = 0;
    mt_com.mt_op = MTLOAD;
    mt_com.mt_count = 1;
-   if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+   if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
       berrno be;
       dev->dev_errno = errno;
       Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
@@ -1188,7 +1220,7 @@ bool DEVICE::offline()
    unlock_door();
    mt_com.mt_op = MTOFFL;
    mt_com.mt_count = 1;
-   if (tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
+   if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
       berrno be;
       dev_errno = errno;
       Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
@@ -1263,7 +1295,7 @@ bool DEVICE::fsf(int num)
       int my_errno = 0;
       mt_com.mt_op = MTFSF;
       mt_com.mt_count = num;
-      stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+      stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
       if (stat < 0) {
          my_errno = errno;            /* save errno */
       } else if ((os_file=get_os_tape_file()) < 0) {
@@ -1344,7 +1376,7 @@ bool DEVICE::fsf(int num)
          }
 
          Dmsg0(100, "Doing MTFSF\n");
-         stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+         stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
          if (stat < 0) {                 /* error => EOT */
             berrno be;
             set_eot();
@@ -1418,7 +1450,7 @@ bool DEVICE::bsf(int num)
    file_size = 0;
    mt_com.mt_op = MTBSF;
    mt_com.mt_count = num;
-   stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
    if (stat < 0) {
       berrno be;
       clrerror(MTBSF);
@@ -1458,7 +1490,7 @@ bool DEVICE::fsr(int num)
    Dmsg1(100, "fsr %d\n", num);
    mt_com.mt_op = MTFSR;
    mt_com.mt_count = num;
-   stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
    if (stat == 0) {
       clear_eof();
       block_num += num;
@@ -1517,7 +1549,7 @@ bool DEVICE::bsr(int num)
    clear_eot();
    mt_com.mt_op = MTBSR;
    mt_com.mt_count = num;
-   stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
    if (stat < 0) {
       berrno be;
       clrerror(MTBSR);
@@ -1533,7 +1565,7 @@ void DEVICE::lock_door()
    struct mtop mt_com;
    mt_com.mt_op = MTLOCK;
    mt_com.mt_count = 1;
-   tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
 #endif
 }
 
@@ -1543,7 +1575,7 @@ void DEVICE::unlock_door()
    struct mtop mt_com;
    mt_com.mt_op = MTUNLOCK;
    mt_com.mt_count = 1;
-   tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
 #endif
 }
 
@@ -1668,7 +1700,7 @@ bool DEVICE::weof(int num)
    clear_eot();
    mt_com.mt_op = MTWEOF;
    mt_com.mt_count = num;
-   stat = tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
    if (stat == 0) {
       block_num = 0;
       file += num;
@@ -1799,7 +1831,7 @@ void DEVICE::clrerror(int func)
 /* Found on Solaris */
 #ifdef MTIOCLRERR
 {
-   tape_ioctl(m_fd, MTIOCLRERR);
+   d_ioctl(m_fd, MTIOCLRERR);
    Dmsg0(200, "Did MTIOCLRERR\n");
 }
 #endif
@@ -1812,7 +1844,7 @@ void DEVICE::clrerror(int func)
    union mterrstat mt_errstat;
    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
       be.bstrerror(dev_errno));
-   tape_ioctl(m_fd, MTIOCERRSTAT, (char *)&mt_errstat);
+   d_ioctl(m_fd, MTIOCERRSTAT, (char *)&mt_errstat);
 }
 #endif
 
@@ -1823,7 +1855,7 @@ void DEVICE::clrerror(int func)
    mt_com.mt_op = MTCSE;
    mt_com.mt_count = 1;
    /* Clear any error condition on the tape */
-   tape_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
+   d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
    Dmsg0(200, "Did MTCSE\n");
 }
 #endif
@@ -1858,12 +1890,11 @@ void DEVICE::close()
 
    switch (dev_type) {
    case B_VTL_DEV:
+   case B_FAKETAPE_DEV:
    case B_TAPE_DEV:
       unlock_door(); 
-      tape_close(m_fd);
-      break;
    default:
-      ::close(m_fd);
+      d_close(m_fd);
    }
 
    /* Clean up device packet so it can be reused */
@@ -1933,6 +1964,7 @@ bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
    Dmsg1(100, "truncate %s\n", print_name());
    switch (dev_type) {
    case B_VTL_DEV:
+   case B_FAKETAPE_DEV:
    case B_TAPE_DEV:
       /* maybe we should rewind and write and eof ???? */
       return true;                    /* we don't really truncate tapes */
@@ -2262,11 +2294,7 @@ ssize_t DEVICE::read(void *buf, size_t len)
 
    get_timer_count();
 
-   if (this->is_tape()) {
-      read_len = tape_read(m_fd, buf, len);
-   } else {
-      read_len = ::read(m_fd, buf, len);
-   }
+   read_len = d_read(m_fd, buf, len);
 
    last_tick = get_timer_count();
 
@@ -2287,11 +2315,7 @@ ssize_t DEVICE::write(const void *buf, size_t len)
 
    get_timer_count();
 
-   if (this->is_tape()) {
-      write_len = tape_write(m_fd, buf, len);
-   } else {
-      write_len = ::write(m_fd, buf, len);
-   }
+   write_len = d_write(m_fd, buf, len);
 
    last_tick = get_timer_count();
 
@@ -2317,7 +2341,7 @@ int32_t DEVICE::get_os_tape_file()
    struct mtget mt_stat;
 
    if (has_cap(CAP_MTIOCGET) &&
-       tape_ioctl(m_fd, MTIOCGET, (char *)&mt_stat) == 0) {
+       d_ioctl(m_fd, MTIOCGET, (char *)&mt_stat) == 0) {
       return mt_stat.mt_fileno;
    }
    return -1;
@@ -2442,7 +2466,7 @@ void set_os_device_parameters(DCR *dcr)
       mt_com.mt_op = MTSETBLK;
       mt_com.mt_count = 0;
       Dmsg0(100, "Set block size to zero\n");
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTSETBLK);
       }
    }
@@ -2458,7 +2482,7 @@ void set_os_device_parameters(DCR *dcr)
          mt_com.mt_count |= MT_ST_FAST_MTEOM;
       }
       Dmsg0(100, "MTSETDRVBUFFER\n");
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTSETDRVBUFFER);
       }
    }
@@ -2472,13 +2496,13 @@ void set_os_device_parameters(DCR *dcr)
        dev->min_block_size == 0) {    /* variable block mode */
       mt_com.mt_op = MTSETBSIZ;
       mt_com.mt_count = 0;
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTSETBSIZ);
       }
       /* Get notified at logical end of tape */
       mt_com.mt_op = MTEWARN;
       mt_com.mt_count = 1;
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTEWARN);
       }
    }
@@ -2491,7 +2515,7 @@ void set_os_device_parameters(DCR *dcr)
        dev->min_block_size == 0) {    /* variable block mode */
       mt_com.mt_op = MTSETBSIZ;
       mt_com.mt_count = 0;
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTSETBSIZ);
       }
    }
@@ -2502,7 +2526,7 @@ void set_os_device_parameters(DCR *dcr)
    } else {
       neof = 1;
    }
-   if (tape_ioctl(dev->fd(), MTIOCSETEOTMODEL, (caddr_t)&neof) < 0) {
+   if (dev->d_ioctl(dev->fd(), MTIOCSETEOTMODEL, (caddr_t)&neof) < 0) {
       berrno be;
       dev->dev_errno = errno;         /* save errno */
       Mmsg2(dev->errmsg, _("Unable to set eotmodel on device %s: ERR=%s\n"),
@@ -2519,7 +2543,7 @@ void set_os_device_parameters(DCR *dcr)
        dev->min_block_size == 0) {    /* variable block mode */
       mt_com.mt_op = MTSRSZ;
       mt_com.mt_count = 0;
-      if (tape_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
+      if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
          dev->clrerror(MTSRSZ);
       }
    }
@@ -2531,7 +2555,7 @@ static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
 {
    Dmsg0(100, "dev_get_os_pos\n");
    return dev->has_cap(CAP_MTIOCGET) && 
-          tape_ioctl(dev->fd(), MTIOCGET, (char *)mt_stat) == 0 &&
+          dev->d_ioctl(dev->fd(), MTIOCGET, (char *)mt_stat) == 0 &&
           mt_stat->mt_fileno >= 0;
 }
 
index 265680f5b77fc151baeffc78af3314751feea377..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() */
@@ -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; }
@@ -426,6 +429,14 @@ public:
    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
     */
index c5ae12b95e25736a83c79ebfd7fe4c817890b5c9..43ba1903fa45c8e90852874b89b06fe1382d183e 100644 (file)
@@ -60,7 +60,6 @@ Device {
 #include "bacula.h"             /* define 64bit file usage */
 #include "stored.h"
 
-#ifdef USE_FAKETAPE
 #include "faketape.h"
 
 static int dbglevel = 100;
@@ -240,7 +239,7 @@ int faketape::tape_op(struct mtop *mt_com)
       current_file = 0;
       current_block = 0;
       lseek(fd, 0, SEEK_SET);
-      read_fm(FT_READ_EOF);
+      result = !read_fm(FT_READ_EOF);
       break;
 
    case MTOFFL:                 /* put tape offline */
@@ -912,7 +911,7 @@ int faketape::read(void *buffer, unsigned int count)
    nb = ::read(fd, buffer, s);
    if (s != nb) {              /* read error */
       errno=EIO;
-      set_eot();
+      atEOT=true;
       current_block = -1;
       Dmsg0(dbglevel, "EOT during reading\n");
       return -1;
@@ -976,7 +975,7 @@ void faketape::update_pos()
    Dmsg1(dbglevel+1, "update_pos=%i\n", file_block);
 
    if (file_block > max_block) {
-      set_eot();
+      atEOT = true;
    } else {
       atEOT = false;
    }
@@ -992,4 +991,3 @@ void faketape::dump()
          atEOF, atEOT, atEOD, atBOT);  
 }
 
-#endif /* USE_FAKETAPE */
index b2a7bcde0b830fafdb5ba982921a9a79bcce60ee..ba36030acea1982c725c4157c1f6985a831132be 100644 (file)
@@ -38,8 +38,6 @@
 #include <stddef.h>
 #include "bacula.h"
 
-#ifdef USE_FAKETAPE
-
 #define FTAPE_MAX_DRIVE 50
 
 /* 
@@ -85,7 +83,6 @@ private:
    void check_eof() { if(needEOF) weof();};
    void update_pos();
    bool read_fm(FT_READ_FM_MODE readfirst);
-   void set_eot() { eot_count=0; atEOT=true;};
 
 public:
    int fsf();
@@ -109,5 +106,4 @@ public:
    int tape_pos(struct mtpos *mt_com);
 };
 
-#endif /* USE_FAKETAPE */
 #endif /* !FAKETAPE_H */
index 552062104c822750fba0b138a4749b0c7508b06e..764b478f5f959a9f5e0b1f967ffeaf201638a33b 100644 (file)
@@ -78,9 +78,8 @@ const int sd_dbglvl = 300;
 int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
 #endif
 
-#ifdef USE_FAKETAPE
-# include "faketape.h"
-#endif
+#include "faketape.h"
+
 
 /* Daemon globals from stored.c */
 extern STORES *me;                    /* "Global" daemon resource */
index 8857ddda56a3e16af48de95b52decf834e0a0f34..d81fad95f91603dde66f21c12367a85f4ab59d8d 100644 (file)
@@ -213,6 +213,7 @@ static s_kw dev_types[] = {
    {"dvd",           B_DVD_DEV},
    {"fifo",          B_FIFO_DEV},
    {"vtl",           B_VTL_DEV},
+   {"faketape",      B_FAKETAPE_DEV},
    {NULL,            0}
 };
 
index cba9b27869b9684a8c1793bc8819b27c3c26d0e3..3530506c881cd4a3b50cbdc40da6c88fdaed83d3 100644 (file)
@@ -62,7 +62,7 @@
  *  run regress test.
  */
 #ifdef DEVELOPER
-//#define USE_FAKETAPE
+#define USE_FAKETAPE
 #endif
 
 /* 
index 1e027dce094586b29bdb9ed33866df64459de5ed..11cd95b8d91d52053f3d0ac3bc9abcce0357d618 100644 (file)
@@ -24,6 +24,8 @@ Add long term statistics job table
 
 
 General:
+09Jun08
+ebl  Update faketape driver.
 08Jun08
 ebl  Modify faketape driver to avoid sparse file.
 kes  Add make clean of qt-source directory during ./configure