$NetBSD: patch-scsitape.c,v 1.2 2013/10/15 14:14:53 ryoon Exp $ --- scsitape.c.orig 2013-06-14 21:32:42.000000000 +0000 +++ scsitape.c @@ -1261,7 +1261,11 @@ int readblkid_scsitape ( DEVBLK* dev, BY // value, also known as the >>LOGICAL<< value and *NOT* // the absolute/physical device-relative value) +#if defined(BSD) && BSD >= 199306 + struct mtget mtpos; +#else struct mtpos mtpos; +#endif BYTE blockid[4]; if (ioctl_tape( dev->fd, MTIOCPOS, (char*) &mtpos ) < 0 ) @@ -1326,6 +1330,19 @@ int locateblk_scsitape ( DEVBLK* dev, U3 mtop.mt_count = CSWAP32( mtop.mt_count ); // (host <- guest) mtop.mt_op = MTSEEK; +#if defined(BSD) && BSD >= 199306 + /* Find out where we are so we can do a relative seek */ + { + struct mtget here; + + rc = ioctl_tape( dev->fd, MTIOCGET, (char*)&here ); + if (rc >= 0) { + mtop.mt_count -= here.mt_blkno; + mtop.mt_op = MTFSR; + } + } +#endif /* BSD */ + // Ask the actual hardware to do an actual physical locate... if ((rc = ioctl_tape( dev->fd, MTIOCTOP, (char*)&mtop )) < 0)