+#ifdef HAVE_LINUX_OS
+ struct mtop mt_com;
+ if (dev->min_block_size == dev->max_block_size &&
+ dev->min_block_size == 0) { /* variable block mode */
+ mt_com.mt_op = MTSETBLK;
+ mt_com.mt_count = 0;
+ if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ clrerror_dev(dev, MTSETBLK);
+ }
+ mt_com.mt_op = MTSETDRVBUFFER;
+ mt_com.mt_count = MT_ST_CLEARBOOLEANS;
+ if (!dev_cap(dev, CAP_TWOEOF)) {
+ mt_com.mt_count |= MT_ST_TWO_FM;
+ }
+ if (dev_cap(dev, CAP_EOM)) {
+ mt_com.mt_count |= MT_ST_FAST_MTEOM;
+ }
+ if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ clrerror_dev(dev, MTSETBLK);
+ }
+ }
+ return;
+#endif
+
+#ifdef HAVE_NETBSD_OS
+ struct mtop mt_com;
+ if (dev->min_block_size == dev->max_block_size &&
+ dev->min_block_size == 0) { /* variable block mode */
+ mt_com.mt_op = MTSETBSIZ;
+ mt_com.mt_count = 0;
+ if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ clrerror_dev(dev, MTSETBSIZ);
+ }
+ /* Get notified at logical end of tape */
+ mt_com.mt_op = MTEWARN;
+ mt_com.mt_count = 1;
+ if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ clrerror_dev(dev, MTEWARN);
+ }
+ }
+ return;
+#endif
+
+#if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
+ struct mtop mt_com;
+ if (dev->min_block_size == dev->max_block_size &&
+ dev->min_block_size == 0) { /* variable block mode */
+ mt_com.mt_op = MTSETBSIZ;
+ mt_com.mt_count = 0;
+ if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ clrerror_dev(dev, MTSETBSIZ);
+ }