]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
14c3d393550bc34361dfa5542458c62de8239f76
[bacula/bacula] / bacula / src / stored / dev.c
1 /*
2  *
3  *   dev.c  -- low level operations on device (storage device)
4  *
5  *              Kern Sibbald, MM
6  *
7  *     NOTE!!!! None of these routines are reentrant. You must
8  *        use lock_device() and unlock_device() at a higher level,
9  *        or use the xxx_device() equivalents.  By moving the
10  *        thread synchronization to a higher level, we permit
11  *        the higher level routines to "seize" the device and
12  *        to carry out operations without worrying about who
13  *        set what lock (i.e. race conditions).
14  *
15  *     Note, this is the device dependent code, and my have
16  *           to be modified for each system, but is meant to
17  *           be as "generic" as possible.
18  *
19  *     The purpose of this code is to develop a SIMPLE Storage
20  *     daemon. More complicated coding (double buffering, writer
21  *     thread, ...) is left for a later version.
22  *
23  *     Unfortunately, I have had to add more and more complication
24  *     to this code. This was not foreseen as noted above, and as
25  *     a consequence has lead to something more contorted than is
26  *     really necessary -- KES.  Note, this contortion has been
27  *     corrected to a large extent by a rewrite (Apr MMI).
28  *
29  *   Version $Id$
30  */
31 /*
32    Copyright (C) 2000-2005 Kern Sibbald
33
34    This program is free software; you can redistribute it and/or
35    modify it under the terms of the GNU General Public License
36    version 2 as amended with additional clauses defined in the
37    file LICENSE in the main source directory.
38
39    This program is distributed in the hope that it will be useful,
40    but WITHOUT ANY WARRANTY; without even the implied warranty of
41    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
42    the file LICENSE for additional details.
43
44  */
45
46 /*
47  * Handling I/O errors and end of tape conditions are a bit tricky.
48  * This is how it is currently done when writting.
49  * On either an I/O error or end of tape,
50  * we will stop writing on the physical device (no I/O recovery is
51  * attempted at least in this daemon). The state flag will be sent
52  * to include ST_EOT, which is ephimeral, and ST_WEOT, which is
53  * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
54  * cleared only when the problem goes away.  Now when ST_WEOT
55  * is set all calls to write_block_to_device() call the fix_up
56  * routine. In addition, all threads are blocked
57  * from writing on the tape by calling lock_dev(), and thread other
58  * than the first thread to hit the EOT will block on a condition
59  * variable. The first thread to hit the EOT will continue to
60  * be able to read and write the tape (he sort of tunnels through
61  * the locking mechanism -- see lock_dev() for details).
62  *
63  * Now presumably somewhere higher in the chain of command
64  * (device.c), someone will notice the EOT condition and
65  * get a new tape up, get the tape label read, and mark
66  * the label for rewriting. Then this higher level routine
67  * will write the unwritten buffer to the new volume.
68  * Finally, he will release
69  * any blocked threads by doing a broadcast on the condition
70  * variable.  At that point, we should be totally back in
71  * business with no lost data.
72  */
73
74
75 #include "bacula.h"
76 #include "stored.h"
77
78 #ifndef O_NONBLOCK 
79 #define O_NONBLOCK 0
80 #endif
81
82 /* Forward referenced functions */
83 void set_os_device_parameters(DEVICE *dev);
84 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
85 static char *mode_to_str(int mode);
86
87 /*
88  * Allocate and initialize the DEVICE structure
89  * Note, if dev is non-NULL, it is already allocated,
90  * thus we neither allocate it nor free it. This allows
91  * the caller to put the packet in shared memory.
92  *
93  *  Note, for a tape, the device->device_name is the device name
94  *     (e.g. /dev/nst0), and for a file, the device name
95  *     is the directory in which the file will be placed.
96  *
97  */
98 DEVICE *
99 init_dev(JCR *jcr, DEVRES *device)
100 {
101    struct stat statp;
102    bool tape, fifo;
103    int errstat;
104    DCR *dcr = NULL;
105    DEVICE *dev;
106
107    /* Check that device is available */
108    if (stat(device->device_name, &statp) < 0) {
109       berrno be;
110       Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"), 
111          device->device_name, be.strerror());
112       return NULL;
113    }
114    
115    
116    tape = false;
117    fifo = false;
118    if (S_ISDIR(statp.st_mode)) {
119       tape = false;
120    } else if (S_ISCHR(statp.st_mode)) {
121       tape = true;
122    } else if (S_ISFIFO(statp.st_mode)) {
123       fifo = true;
124    } else if (!(device->cap_bits & CAP_REQMOUNT)) {
125       Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
126             " or have RequiresMount=yes for DVD. st_mode=%x\n"),
127          device->device_name, statp.st_mode);
128       return NULL;
129    }
130
131    dev = (DEVICE *)get_memory(sizeof(DEVICE));
132    memset(dev, 0, sizeof(DEVICE));
133    dev->state = ST_MALLOC;
134
135    /* Copy user supplied device parameters from Resource */
136    dev->dev_name = get_memory(strlen(device->device_name)+1);
137    pm_strcpy(dev->dev_name, device->device_name);
138    dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
139    /* We edit "Resource-name" (physical-name) */
140    Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
141    dev->capabilities = device->cap_bits;
142    dev->min_block_size = device->min_block_size;
143    dev->max_block_size = device->max_block_size;
144    dev->max_volume_size = device->max_volume_size;
145    dev->max_file_size = device->max_file_size;
146    dev->volume_capacity = device->volume_capacity;
147    dev->max_rewind_wait = device->max_rewind_wait;
148    dev->max_open_wait = device->max_open_wait;
149    dev->max_open_vols = device->max_open_vols;
150    dev->vol_poll_interval = device->vol_poll_interval;
151    dev->max_spool_size = device->max_spool_size;
152    dev->drive_index = device->drive_index;
153    dev->autoselect = device->autoselect;
154    if (tape) { /* No parts on tapes */
155       dev->max_part_size = 0;
156    }
157    else {
158       dev->max_part_size = device->max_part_size;
159    }
160    /* Sanity check */
161    if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
162       dev->vol_poll_interval = 60;
163    }
164    dev->device = device;
165
166    if (tape) {
167       dev->state |= ST_TAPE;
168    } else if (fifo) {
169       dev->state |= ST_FIFO;
170       dev->capabilities |= CAP_STREAM; /* set stream device */
171    } else {
172       dev->state |= ST_FILE;
173    }
174
175    /* If the device requires mount :
176     * - Check that the mount point is available 
177     * - Check that (un)mount commands are defined
178     */
179    if (dev->is_file() && dev->requires_mount()) {
180       if (stat(device->mount_point, &statp) < 0) {
181          berrno be;
182          dev->dev_errno = errno;
183          Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"), 
184             device->mount_point, be.strerror());
185          return NULL;
186       }
187       if (!device->mount_command || !device->unmount_command) {
188          Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
189       }
190       if (!device->write_part_command) {
191          Jmsg0(jcr, M_ERROR_TERM, 0, _("Write part command must be defined for a device which requires mount.\n"));
192       }
193       dev->state |= ST_DVD;
194    }
195
196    if (dev->max_block_size > 1000000) {
197       Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
198          dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
199       dev->max_block_size = 0;
200    }
201    if (dev->max_block_size % TAPE_BSIZE != 0) {
202       Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
203          dev->max_block_size, dev->print_name());
204    }
205
206    dev->errmsg = get_pool_memory(PM_EMSG);
207    *dev->errmsg = 0;
208
209    if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
210       berrno be;
211       dev->dev_errno = errstat;
212       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
213       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
214    }
215    if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
216       berrno be;
217       dev->dev_errno = errstat;
218       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
219       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
220    }
221    if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
222       berrno be;
223       dev->dev_errno = errstat;
224       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
225       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
226    }
227    if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
228       berrno be;
229       dev->dev_errno = errstat;
230       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
231       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
232    }
233    if ((errstat = rwl_init(&dev->lock)) != 0) {
234       berrno be;
235       dev->dev_errno = errstat;
236       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
237       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
238    }
239
240    dev->fd = -1;
241    dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
242    Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
243    
244    return dev;
245 }
246
247 /*
248  * Open the device with the operating system and
249  * initialize buffer pointers.
250  *
251  * Returns:  -1  on error
252  *           fd  on success
253  *
254  * Note, for a tape, the VolName is the name we give to the
255  *    volume (not really used here), but for a file, the
256  *    VolName represents the name of the file to be created/opened.
257  *    In the case of a file, the full name is the device name
258  *    (archive_name) with the VolName concatenated.
259  */
260 int
261 DEVICE::open(DCR *dcr, int omode)
262 {
263    if (is_open()) {
264       if (openmode == omode) {
265          return fd;
266       } else {
267         ::close(fd); /* use system close so correct mode will be used on open */
268         fd = -1;
269         Dmsg0(100, "Close fd for mode change.\n");
270       }
271    }
272    if (dcr) {
273       bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
274    }
275
276    Dmsg4(29, "open dev: tape=%d dev_name=%s vol=%s mode=%s\n", is_tape(),
277          print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
278    state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
279    label_type = B_BACULA_LABEL;
280    if (is_tape() || is_fifo()) {
281       open_tape_device(dcr, omode);
282    } else if (is_dvd()) {
283       Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(omode));
284       open_dvd_device(dcr, omode);
285    } else {
286       Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
287       open_file_device(omode);
288    }
289    return fd;
290 }
291
292 void DEVICE::set_mode(int new_mode) 
293 {
294    switch (new_mode) {
295    case CREATE_READ_WRITE:
296       mode = O_CREAT | O_RDWR | O_BINARY;
297       break;
298    case OPEN_READ_WRITE:
299       if (is_dvd() || is_file()) {
300          mode = O_CREAT | O_RDWR | O_BINARY;
301       } else {
302          mode = O_RDWR | O_BINARY;
303       }
304       break;
305    case OPEN_READ_ONLY:
306       mode = O_RDONLY | O_BINARY;
307       break;
308    case OPEN_WRITE_ONLY:
309       mode = O_WRONLY | O_BINARY;
310       break;
311    default:
312       Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
313    }
314 }
315
316 /*
317  * If the flage open_nowait is set, which is the case
318  *   when the daemon is initially trying to open the device,
319  *   we open it with O_NONBLOCK set and O_RONLY, which will
320  *   allow us to open normal Linux tape drives with no tape
321  *   in the drive without blocking.  We then immediately
322  *   set blocking status so that if we read from the device they
323  *   will be normal blocking reads.
324  *
325  * If later, we want to write on the device, it will be freed and
326  *   reopened, but hopefully there will be a tape in the drive so
327  *   we will not block.
328  */
329 void DEVICE::open_tape_device(DCR *dcr, int omode) 
330 {
331    int nonblocking = 0;
332    file_size = 0;
333    int timeout;
334    int ioerrcnt = 10;
335    Dmsg0(29, "open dev: device is tape\n");
336
337    if (is_tape() && is_autochanger()) {
338       get_autochanger_loaded_slot(dcr);
339    }
340
341    set_mode(omode);
342    timeout = max_open_wait;
343    errno = 0;
344 #ifdef HAVE_LINUX_OS
345    if (open_nowait) {
346        /* Set wait counters to zero for no wait */
347        timeout = ioerrcnt = 0;
348        /* Open drive in non-block mode */
349        nonblocking = O_NONBLOCK;
350    }
351 #endif
352    if (is_fifo() && timeout) {
353       /* Set open timer */
354       tid = start_thread_timer(pthread_self(), timeout);
355    }
356    /* If busy retry each second for max_open_wait seconds */
357    Dmsg3(100, "Try open %s mode=%s nonblocking=%d\n", print_name(),
358       mode_to_str(omode), nonblocking);
359    /* Use system open() */
360    while ((fd = ::open(dev_name, mode+nonblocking, MODE_RW)) < 0) {
361       berrno be;
362       Dmsg2(100, "Open error errno=%d ERR=%s\n", errno, be.strerror());
363       if (errno == EINTR || errno == EAGAIN) {
364          Dmsg0(100, "Continue open\n");
365          continue;
366       }
367       /* Busy wait for specified time (default = 5 mins) */
368       if (errno == EBUSY && timeout-- > 0) {
369          Dmsg2(100, "Device %s busy. ERR=%s\n", print_name(), be.strerror());
370          bmicrosleep(1, 0);
371          continue;
372       }
373       /* IO error (no volume) try 10 times every 6 seconds */
374       if (errno == EIO && ioerrcnt-- > 0) {
375          bmicrosleep(5, 0);
376          Dmsg0(100, "Continue open\n");
377          continue;
378       }
379       dev_errno = errno;
380       Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
381             print_name(), be.strerror(dev_errno));
382       /* Stop any open timer we set */
383       if (tid) {
384          stop_thread_timer(tid);
385          tid = 0;
386       }
387       Jmsg0(dcr->jcr, M_FATAL, 0, errmsg);
388       break;
389    }
390
391    if (nonblocking) {
392       set_blocking();
393    }
394
395    if (fd >= 0) {
396       openmode = omode;              /* save open mode */
397       Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
398       dev_errno = 0;
399       set_opened();
400       use_count = 1;
401       update_pos_dev(this);                /* update position */
402       set_os_device_parameters(this);      /* do system dependent stuff */
403    }
404
405    /* Stop any open() timer we started */
406    if (tid) {
407       stop_thread_timer(tid);
408       tid = 0;
409    }
410    Dmsg1(29, "open dev: tape %d opened\n", fd);
411 }
412
413 void DEVICE::set_blocking()
414 {
415    int oflags;
416    /* Try to reset blocking */
417    if ((oflags = fcntl(fd, F_GETFL, 0)) < 0 ||
418        fcntl(fd, F_SETFL, oflags & ~O_NONBLOCK) < 0) {
419       berrno be;
420       ::close(fd);                   /* use system close() */
421       fd = ::open(dev_name, mode, MODE_RW);       
422       Dmsg2(100, "fcntl error. ERR=%s. Close-reopen fd=%d\n", be.strerror(), fd);
423    }
424 }
425
426 /*
427  * Open a file device
428  */
429 void DEVICE::open_file_device(int omode) 
430 {
431    POOL_MEM archive_name(PM_FNAME);
432
433    /*
434     * Handle opening of File Archive (not a tape)
435     */     
436    Dmsg3(29, "Enter: open_file_dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
437          archive_name.c_str(), mode_to_str(omode));
438
439    if (VolCatInfo.VolCatName[0] == 0) {
440       Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
441          print_name());
442       fd = -1;
443       return;
444    }
445
446    pm_strcpy(archive_name, dev_name);
447    if (archive_name.c_str()[strlen(archive_name.c_str())-1] != '/') {
448       pm_strcat(archive_name, "/");
449    }
450    pm_strcat(archive_name, VolCatInfo.VolCatName);
451          
452    Dmsg3(29, "open dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
453          archive_name.c_str(), mode_to_str(omode));
454    openmode = omode;
455    Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
456    
457    set_mode(omode);
458    /* If creating file, give 0640 permissions */
459    Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode), 
460          archive_name.c_str(), mode);
461    /* Use system open() */
462    if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
463       berrno be;
464       dev_errno = errno;
465       Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(), 
466             be.strerror());
467       Dmsg1(29, "open failed: %s", errmsg);
468       Emsg0(M_FATAL, 0, errmsg);
469    } else {
470       dev_errno = 0;
471       set_opened();
472       use_count = 1;
473       update_pos_dev(this);                /* update position */
474    }
475    Dmsg5(29, "open dev: %s fd=%d opened, part=%d/%d, part_size=%u\n", 
476       is_dvd()?"DVD":"disk", fd, part, num_parts, 
477       part_size);
478 }
479
480 /*
481  * Open a DVD device. N.B. at this point, dcr->VolCatInfo.VolCatName (NB:??? I think it's VolCatInfo.VolCatName that is right)
482  *  has the desired Volume name, but there is NO assurance that
483  *  any other field of VolCatInfo is correct.
484  */
485 void DEVICE::open_dvd_device(DCR *dcr, int omode) 
486 {
487    POOL_MEM archive_name(PM_FNAME);
488    struct stat filestat;
489
490    /*
491     * Handle opening of DVD Volume
492     */     
493    Dmsg3(29, "Enter: open_dvd_dev: %s dev=%s mode=%s\n", is_dvd()?"DVD":"disk",
494          archive_name.c_str(), mode_to_str(omode));
495
496    if (VolCatInfo.VolCatName[0] == 0) {
497       Dmsg1(10,  "Could not open file device %s. No Volume name given.\n",
498          print_name());
499       Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
500          print_name());
501       fd = -1;
502       return;
503    }
504
505    if (part == 0) {
506       file_size = 0;
507    }
508    part_size = 0;
509
510    Dmsg2(99, "open_dvd_device: num_parts=%d, VolCatInfo.VolCatParts=%d\n",
511       dcr->dev->num_parts, dcr->VolCatInfo.VolCatParts);
512    if (dcr->dev->num_parts < dcr->VolCatInfo.VolCatParts) {
513       Dmsg2(99, "open_dvd_device: num_parts updated to %d (was %d)\n",
514          dcr->VolCatInfo.VolCatParts, dcr->dev->num_parts);
515       dcr->dev->num_parts = dcr->VolCatInfo.VolCatParts;
516    }
517
518    if (mount_dev(this, 1)) {
519       if ((num_parts == 0) && (!truncating)) {
520          /* If we can mount the device, and we are not truncating the DVD, we usually want to abort. */
521          /* There is one exception, if there is only one 0-sized file on the DVD, with the right volume name,
522           * we continue (it's the method used by truncate_dvd_dev to truncate a volume). */
523          if (!check_can_write_on_non_blank_dvd(dcr)) {
524             Mmsg(errmsg, _("The media in the device %s is not empty, please blank it before writing anything to it.\n"), print_name());
525             Emsg0(M_FATAL, 0, errmsg);
526             fd = -1;
527             return;
528          }
529       }
530    }
531    else {
532       /* We cannot mount the device */
533       if (num_parts == 0) {
534          /* Run free space, check there is a media. */
535          update_free_space_dev(this);
536          if (have_media()) {
537             Dmsg1(29, "Could not mount device %s, this is not a problem (num_parts == 0), and have media.\n", print_name());
538          }
539          else {
540             Mmsg(errmsg, _("There is no valid media in the device %s.\n"), print_name());
541             Emsg0(M_FATAL, 0, errmsg);
542             fd = -1;
543             return;
544          }
545       }
546       else {
547          Mmsg(errmsg, _("Could not mount device %s.\n"), print_name());
548          Emsg0(M_FATAL, 0, errmsg);
549          fd = -1;
550          return;
551       }
552    }
553    
554    Dmsg6(29, "open dev: %s dev=%s mode=%s part=%d npart=%d volcatnparts=%d\n", 
555       is_dvd()?"DVD":"disk", archive_name.c_str(), mode_to_str(omode),
556       part, num_parts, dcr->VolCatInfo.VolCatParts);
557    openmode = omode;
558    Dmsg2(100, "openmode=%d %s\n", openmode, mode_to_str(openmode));
559    
560    /*
561     * If we are not trying to access the last part, set mode to 
562     *   OPEN_READ_ONLY as writing would be an error.
563     */
564    if (part < num_parts) {
565       omode = OPEN_READ_ONLY;
566       make_mounted_dvd_filename(this, archive_name);
567    }
568    else {
569       make_spooled_dvd_filename(this, archive_name);
570    }
571    set_mode(omode);
572
573    /* If creating file, give 0640 permissions */
574    Dmsg3(29, "mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode), 
575          archive_name.c_str(), mode);
576    /* Use system open() */
577    if ((fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
578       berrno be;
579       Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(), 
580             be.strerror());
581       dev_errno = EIO; /* Interpreted as no device present by acquire.c:acquire_device_for_read(). */
582       Dmsg1(29, "open failed: %s", errmsg);
583       
584       if ((omode == OPEN_READ_ONLY) && (part == num_parts)) {
585          /* If the last part (on spool), doesn't exists when reading, create it and read from it
586           * (it will report immediately an EOF):
587           * Sometimes it is better to finish with an EOF than with an error. */
588          set_mode(OPEN_READ_WRITE);
589          fd = ::open(archive_name.c_str(), mode, 0640);
590          set_mode(OPEN_READ_ONLY);
591       }
592       
593       /* We don't need it. Only the last part is on spool */
594       /*if (omode == OPEN_READ_ONLY) {
595          make_spooled_dvd_filename(this, archive_name);
596          fd = ::open(archive_name.c_str(), mode, 0640);  // try on spool
597       }*/
598    }
599    Dmsg1(100, "after open fd=%d\n", fd);
600    if (fd >= 0) {
601       /* Get size of file */
602       if (fstat(fd, &filestat) < 0) {
603          berrno be;
604          dev_errno = errno;
605          Mmsg2(errmsg, _("Could not fstat: %s, ERR=%s\n"), archive_name.c_str(), 
606                be.strerror());
607          Dmsg1(29, "open failed: %s", errmsg);
608          /* Use system close() */
609          ::close(fd);
610          fd = -1;
611       } else {
612          part_size = filestat.st_size;
613          dev_errno = 0;
614          set_opened();
615          use_count = 1;
616          update_pos_dev(this);                /* update position */
617          
618          /* NB: It seems this code is wrong... part number is incremented in open_next_part, not here */
619          
620          /* Check if just created Volume  part */
621 /*         if (omode == OPEN_READ_WRITE && (part == 0 || part_size == 0)) {
622             part++;
623             num_parts = part;
624             VolCatInfo.VolCatParts = num_parts;
625          } else {
626             if (part == 0) {             // we must have opened the first part
627                part++;
628             }
629          }*/
630       }
631    }
632 }
633
634
635 #ifdef debug_tracing
636 #undef rewind_dev
637 bool _rewind_dev(char *file, int line, DEVICE *dev)
638 {
639    Dmsg3(100, "rewind_dev fd=%d called from %s:%d\n", dev->fd, file, line);
640    return rewind_dev(dev);
641 }
642 #endif
643
644 /*
645  * Rewind the device.
646  *  Returns: true  on success
647  *           false on failure
648  */
649 bool rewind_dev(DEVICE *dev)
650 {
651    struct mtop mt_com;
652    unsigned int i;
653
654    Dmsg2(29, "rewind_dev fd=%d %s\n", dev->fd, dev->print_name());
655    if (dev->fd < 0) {
656       if (!dev->is_dvd()) { /* In case of major error, the fd is not open on DVD, so we don't want to abort. */
657          dev->dev_errno = EBADF;
658          Mmsg1(dev->errmsg, _("Bad call to rewind_dev. Device %s not open\n"),
659             dev->print_name());
660          Emsg0(M_ABORT, 0, dev->errmsg);
661       }
662       return false;
663    }
664    dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
665    dev->block_num = dev->file = 0;
666    dev->file_size = 0;
667    dev->file_addr = 0;
668    if (dev->is_tape()) {
669       mt_com.mt_op = MTREW;
670       mt_com.mt_count = 1;
671       /* If we get an I/O error on rewind, it is probably because
672        * the drive is actually busy. We loop for (about 5 minutes)
673        * retrying every 5 seconds.
674        */
675       for (i=dev->max_rewind_wait; ; i -= 5) {
676          if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
677             berrno be;
678             clrerror_dev(dev, MTREW);
679             if (i == dev->max_rewind_wait) {
680                Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
681             }
682             if (dev->dev_errno == EIO && i > 0) {
683                Dmsg0(200, "Sleeping 5 seconds.\n");
684                bmicrosleep(5, 0);
685                continue;
686             }
687             Mmsg2(dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
688                dev->print_name(), be.strerror());
689             return false;
690          }
691          break;
692       }
693    } else if (dev->is_file()) {      
694       if (lseek_dev(dev, (off_t)0, SEEK_SET) < 0) {
695          berrno be;
696          dev->dev_errno = errno;
697          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
698             dev->print_name(), be.strerror());
699          return false;
700       }
701    }
702    return true;
703 }
704
705 void DEVICE::block(int why)
706 {
707    lock_device(this);
708    block_device(this, why);
709    V(mutex);
710 }
711
712 void DEVICE::unblock()
713 {  
714    P(mutex);
715    unblock_device(this);
716    V(mutex);
717 }
718
719 const char *DEVICE::print_blocked() const 
720 {
721    switch (dev_blocked) {
722    case BST_NOT_BLOCKED:
723       return "BST_NOT_BLOCKED";
724    case BST_UNMOUNTED:
725       return "BST_UNMOUNTED";
726    case BST_WAITING_FOR_SYSOP:
727       return "BST_WAITING_FOR_SYSOP";
728    case BST_DOING_ACQUIRE:
729       return "BST_DOING_ACQUIRE";
730    case BST_WRITING_LABEL:
731       return "BST_WRITING_LABEL";
732    case BST_UNMOUNTED_WAITING_FOR_SYSOP:
733       return "BST_UNMOUNTED_WAITING_FOR_SYSOP";
734    case BST_MOUNT:
735       return "BST_MOUNT";
736    default:
737       return _("unknown blocked code");
738    }
739 }
740
741 /*
742  * Called to indicate that we have just read an
743  *  EOF from the device.
744  */
745 void DEVICE::set_ateof() 
746
747    set_eof();
748    if (is_tape()) {
749       file++;
750    }
751    file_addr = 0;
752    file_size = 0;
753    block_num = 0;
754 }
755
756 /*
757  * Called to indicate we are now at the end of the tape, and
758  *   writing is not possible.
759  */
760 void DEVICE::set_ateot() 
761 {
762    /* Make tape effectively read-only */
763    state |= (ST_EOF|ST_EOT|ST_WEOT);
764    clear_append();
765 }
766
767 /*
768  * Position device to end of medium (end of data)
769  *  Returns: true  on succes
770  *           false on error
771  */
772 bool
773 eod_dev(DEVICE *dev)
774 {
775    struct mtop mt_com;
776    struct mtget mt_stat;
777    bool ok = true;
778    off_t pos;
779
780    if (dev->fd < 0) {
781       dev->dev_errno = EBADF;
782       Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
783             dev->print_name());
784       return false;
785    }
786
787 #if defined (__digital__) && defined (__unix__)
788    return dev->fsf(dev->VolCatInfo.VolCatFiles);
789 #endif
790
791    Dmsg0(29, "eod_dev\n");
792    if (dev->at_eot()) {
793       return true;
794    }
795    dev->state &= ~(ST_EOF);  /* remove EOF flags */
796    dev->block_num = dev->file = 0;
797    dev->file_size = 0;
798    dev->file_addr = 0;
799    if (dev->state & (ST_FIFO | ST_PROG)) {
800       return true;
801    }
802    if (!dev->is_tape()) {
803       pos = lseek_dev(dev, (off_t)0, SEEK_END);
804 //    Dmsg1(100, "====== Seek to %lld\n", pos);
805       if (pos >= 0) {
806          update_pos_dev(dev);
807          dev->state |= ST_EOT;
808          return true;
809       }
810       dev->dev_errno = errno;
811       berrno be;
812       Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
813              dev->print_name(), be.strerror());
814       return false;
815    }
816 #ifdef MTEOM
817    if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
818       Dmsg0(100,"Using FAST FSF for EOM\n");
819       /* If unknown position, rewind */
820       if (!dev_get_os_pos(dev, &mt_stat)) {
821         if (!rewind_dev(dev)) {
822           return false;
823         }
824       }
825       mt_com.mt_op = MTFSF;
826       /*
827        * ***FIXME*** fix code to handle case that INT16_MAX is
828        *   not large enough.
829        */
830       mt_com.mt_count = INT16_MAX;    /* use big positive number */
831       if (mt_com.mt_count < 0) {
832          mt_com.mt_count = INT16_MAX; /* brain damaged system */
833       }
834    }
835
836    if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
837       if (dev_cap(dev, CAP_EOM)) {
838          Dmsg0(100,"Using EOM for EOM\n");
839          mt_com.mt_op = MTEOM;
840          mt_com.mt_count = 1;
841       }
842
843       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
844          berrno be;
845          clrerror_dev(dev, mt_com.mt_op);
846          Dmsg1(50, "ioctl error: %s\n", be.strerror());
847          update_pos_dev(dev);
848          Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
849             dev->print_name(), be.strerror());
850          return false;
851       }
852
853       if (!dev_get_os_pos(dev, &mt_stat)) {
854          berrno be;
855          clrerror_dev(dev, -1);
856          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
857             dev->print_name(), be.strerror());
858          return false;
859       }
860       Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
861       dev->set_ateof();
862       dev->file = mt_stat.mt_fileno;
863    } else {
864 #else
865    {
866 #endif
867       /*
868        * Rewind then use FSF until EOT reached
869        */
870       if (!rewind_dev(dev)) {
871          return false;
872       }
873       /*
874        * Move file by file to the end of the tape
875        */
876       int file_num;
877       for (file_num=dev->file; !dev->at_eot(); file_num++) {
878          Dmsg0(200, "eod_dev: doing fsf 1\n");
879          if (!dev->fsf(1)) {
880             Dmsg0(200, "fsf error.\n");
881             return false;
882          }
883          /*
884           * Avoid infinite loop by ensuring we advance.
885           */
886          if (file_num == (int)dev->file) {
887             struct mtget mt_stat;
888             Dmsg1(100, "fsf did not advance from file %d\n", file_num);
889             dev->set_ateof();
890             if (dev_get_os_pos(dev, &mt_stat)) {
891                Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
892                dev->file = mt_stat.mt_fileno;
893             }       
894             break;
895          }
896       }
897    }
898    /*
899     * Some drivers leave us after second EOF when doing
900     * MTEOM, so we must backup so that appending overwrites
901     * the second EOF.
902     */
903    if (dev_cap(dev, CAP_BSFATEOM)) {
904       struct mtget mt_stat;
905       /* Backup over EOF */
906       ok = bsf_dev(dev, 1);
907       /* If BSF worked and fileno is known (not -1), set file */
908       if (dev_get_os_pos(dev, &mt_stat)) {
909          Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
910          dev->file = mt_stat.mt_fileno;
911       } else {
912          dev->file++;                 /* wing it -- not correct on all OSes */
913       }
914    } else {
915       update_pos_dev(dev);                   /* update position */
916    }
917    Dmsg1(200, "EOD dev->file=%d\n", dev->file);
918    return ok;
919 }
920
921 /*
922  * Set the position of the device -- only for files and DVD
923  *   For other devices, there is no generic way to do it.
924  *  Returns: true  on succes
925  *           false on error
926  */
927 bool update_pos_dev(DEVICE *dev)
928 {
929    off_t pos;
930    bool ok = true;
931
932    if (dev->fd < 0) {
933       dev->dev_errno = EBADF;
934       Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
935       Emsg0(M_FATAL, 0, dev->errmsg);
936       return false;
937    }
938
939    /* Find out where we are */
940    if (dev->is_file()) {
941       dev->file = 0;
942       dev->file_addr = 0;
943       pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
944       if (pos < 0) {
945          berrno be;
946          dev->dev_errno = errno;
947          Pmsg1(000, _("Seek error: ERR=%s\n"), be.strerror());
948          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
949             dev->print_name(), be.strerror());
950          ok = false;
951       } else {
952          dev->file_addr = pos;
953       }
954    }
955    return ok;
956 }
957
958
959 /*
960  * Return the status of the device.  This was meant
961  * to be a generic routine. Unfortunately, it doesn't
962  * seem possible (at least I do not know how to do it
963  * currently), which means that for the moment, this
964  * routine has very little value.
965  *
966  *   Returns: status
967  */
968 uint32_t status_dev(DEVICE *dev)
969 {
970    struct mtget mt_stat;
971    uint32_t stat = 0;
972
973    if (dev->state & (ST_EOT | ST_WEOT)) {
974       stat |= BMT_EOD;
975       Pmsg0(-20, " EOD");
976    }
977    if (dev->state & ST_EOF) {
978       stat |= BMT_EOF;
979       Pmsg0(-20, " EOF");
980    }
981    if (dev->is_tape()) {
982       stat |= BMT_TAPE;
983       Pmsg0(-20,_(" Bacula status:"));
984       Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
985       if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
986          berrno be;
987          dev->dev_errno = errno;
988          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
989             dev->print_name(), be.strerror());
990          return 0;
991       }
992       Pmsg0(-20, _(" Device status:"));
993
994 #if defined(HAVE_LINUX_OS)
995       if (GMT_EOF(mt_stat.mt_gstat)) {
996          stat |= BMT_EOF;
997          Pmsg0(-20, " EOF");
998       }
999       if (GMT_BOT(mt_stat.mt_gstat)) {
1000          stat |= BMT_BOT;
1001          Pmsg0(-20, " BOT");
1002       }
1003       if (GMT_EOT(mt_stat.mt_gstat)) {
1004          stat |= BMT_EOT;
1005          Pmsg0(-20, " EOT");
1006       }
1007       if (GMT_SM(mt_stat.mt_gstat)) {
1008          stat |= BMT_SM;
1009          Pmsg0(-20, " SM");
1010       }
1011       if (GMT_EOD(mt_stat.mt_gstat)) {
1012          stat |= BMT_EOD;
1013          Pmsg0(-20, " EOD");
1014       }
1015       if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1016          stat |= BMT_WR_PROT;
1017          Pmsg0(-20, " WR_PROT");
1018       }
1019       if (GMT_ONLINE(mt_stat.mt_gstat)) {
1020          stat |= BMT_ONLINE;
1021          Pmsg0(-20, " ONLINE");
1022       }
1023       if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1024          stat |= BMT_DR_OPEN;
1025          Pmsg0(-20, " DR_OPEN");
1026       }
1027       if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1028          stat |= BMT_IM_REP_EN;
1029          Pmsg0(-20, " IM_REP_EN");
1030       }
1031 #endif /* !SunOS && !OSF */
1032       if (dev_cap(dev, CAP_MTIOCGET)) {
1033          Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
1034       } else {
1035          Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1036       }
1037    } else {
1038       stat |= BMT_ONLINE | BMT_BOT;
1039    }
1040    return stat;
1041 }
1042
1043
1044 /*
1045  * Load medium in device
1046  *  Returns: true  on success
1047  *           false on failure
1048  */
1049 bool load_dev(DEVICE *dev)
1050 {
1051 #ifdef MTLOAD
1052    struct mtop mt_com;
1053 #endif
1054
1055    if (dev->fd < 0) {
1056       dev->dev_errno = EBADF;
1057       Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1058       Emsg0(M_FATAL, 0, dev->errmsg);
1059       return false;
1060    }
1061    if (!(dev->is_tape())) {
1062       return true;
1063    }
1064 #ifndef MTLOAD
1065    Dmsg0(200, "stored: MTLOAD command not available\n");
1066    berrno be;
1067    dev->dev_errno = ENOTTY;           /* function not available */
1068    Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1069          dev->print_name(), be.strerror());
1070    return false;
1071 #else
1072
1073    dev->block_num = dev->file = 0;
1074    dev->file_size = 0;
1075    dev->file_addr = 0;
1076    mt_com.mt_op = MTLOAD;
1077    mt_com.mt_count = 1;
1078    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1079       berrno be;
1080       dev->dev_errno = errno;
1081       Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1082          dev->print_name(), be.strerror());
1083       return false;
1084    }
1085    return true;
1086 #endif
1087 }
1088
1089 /*
1090  * Rewind device and put it offline
1091  *  Returns: true  on success
1092  *           false on failure
1093  */
1094 bool offline_dev(DEVICE *dev)
1095 {
1096    struct mtop mt_com;
1097
1098    if (!dev || dev->fd < 0 || !dev->is_tape()) {
1099       return true;                    /* device not open */
1100    }
1101
1102    dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
1103    dev->block_num = dev->file = 0;
1104    dev->file_size = 0;
1105    dev->file_addr = 0;
1106    dev->part = 0;
1107 #ifdef MTUNLOCK
1108    mt_com.mt_op = MTUNLOCK;
1109    mt_com.mt_count = 1;
1110    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1111 #endif
1112    mt_com.mt_op = MTOFFL;
1113    mt_com.mt_count = 1;
1114    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1115       berrno be;
1116       dev->dev_errno = errno;
1117       Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1118          dev->print_name(), be.strerror());
1119       return false;
1120    }
1121    Dmsg1(100, "Offlined device %s\n", dev->print_name());
1122    return true;
1123 }
1124
1125 bool offline_or_rewind_dev(DEVICE *dev)
1126 {
1127    if (dev->fd < 0) {
1128       return false;
1129    }
1130    if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1131       return offline_dev(dev);
1132    } else {
1133    /*
1134     * Note, this rewind probably should not be here (it wasn't
1135     *  in prior versions of Bacula), but on FreeBSD, this is
1136     *  needed in the case the tape was "frozen" due to an error
1137     *  such as backspacing after writing and EOF. If it is not
1138     *  done, all future references to the drive get and I/O error.
1139     */
1140       clrerror_dev(dev, MTREW);
1141       return rewind_dev(dev);
1142    }
1143 }
1144
1145 /*
1146  * Foward space a file
1147  *   Returns: true  on success
1148  *            false on failure
1149  */
1150 bool DEVICE::fsf(int num)
1151 {
1152    struct mtget mt_stat;
1153    struct mtop mt_com;
1154    int stat = 0;
1155
1156    if (fd < 0) {
1157       dev_errno = EBADF;
1158       Mmsg0(errmsg, _("Bad call to fsf_dev. Device not open\n"));
1159       Emsg0(M_FATAL, 0, errmsg);
1160       return false;
1161    }
1162
1163    if (!is_tape()) {
1164       return true;
1165    }
1166    if (at_eot()) {
1167       dev_errno = 0;
1168       Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1169       return false;
1170    }
1171    if (at_eof()) {
1172       Dmsg0(200, "ST_EOF set on entry to FSF\n");
1173    }
1174
1175    Dmsg0(100, "fsf\n");
1176    block_num = 0;
1177    /*
1178     * If Fast forward space file is set, then we
1179     *  use MTFSF to forward space and MTIOCGET
1180     *  to get the file position. We assume that
1181     *  the SCSI driver will ensure that we do not
1182     *  forward space past the end of the medium.
1183     */
1184    if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
1185       mt_com.mt_op = MTFSF;
1186       mt_com.mt_count = num;
1187       stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1188       if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1189          berrno be;
1190          set_eot();
1191          Dmsg0(200, "Set ST_EOT\n");
1192          clrerror_dev(this, MTFSF);
1193          Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1194             print_name(), be.strerror());
1195          Dmsg1(200, "%s", errmsg);
1196          return false;
1197       }
1198       Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1199       set_ateof();
1200       file = mt_stat.mt_fileno;
1201       return true;
1202
1203    /*
1204     * Here if CAP_FSF is set, and virtually all drives
1205     *  these days support it, we read a record, then forward
1206     *  space one file. Using this procedure, which is slow,
1207     *  is the only way we can be sure that we don't read
1208     *  two consecutive EOF marks, which means End of Data.
1209     */
1210    } else if (dev_cap(this, CAP_FSF)) {
1211       POOLMEM *rbuf;
1212       int rbuf_len;
1213       Dmsg0(200, "FSF has cap_fsf\n");
1214       if (max_block_size == 0) {
1215          rbuf_len = DEFAULT_BLOCK_SIZE;
1216       } else {
1217          rbuf_len = max_block_size;
1218       }
1219       rbuf = get_memory(rbuf_len);
1220       mt_com.mt_op = MTFSF;
1221       mt_com.mt_count = 1;
1222       while (num-- && !at_eot()) {
1223          Dmsg0(100, "Doing read before fsf\n");
1224          if ((stat = read(fd, (char *)rbuf, rbuf_len)) < 0) {
1225             if (errno == ENOMEM) {     /* tape record exceeds buf len */
1226                stat = rbuf_len;        /* This is OK */
1227             /*
1228              * On IBM drives, they return ENOSPC at EOM
1229              *  instead of EOF status
1230              */
1231             } else if (at_eof() && errno == ENOSPC) {
1232                stat = 0;
1233             } else {
1234                berrno be;
1235                set_eot();
1236                clrerror_dev(this, -1);
1237                Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1238                   be.strerror());
1239                Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1240                   print_name(), be.strerror());
1241                Dmsg1(100, "%s", errmsg);
1242                break;
1243             }
1244          }
1245          if (stat == 0) {                /* EOF */
1246             update_pos_dev(this);
1247             Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1248             /* Two reads of zero means end of tape */
1249             if (at_eof()) {
1250                set_eot();
1251                Dmsg0(100, "Set ST_EOT\n");
1252                break;
1253             } else {
1254                set_ateof();
1255                continue;
1256             }
1257          } else {                        /* Got data */
1258             clear_eot();
1259             clear_eof();
1260          }
1261
1262          Dmsg0(100, "Doing MTFSF\n");
1263          stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1264          if (stat < 0) {                 /* error => EOT */
1265             berrno be;
1266             set_eot();
1267             Dmsg0(100, "Set ST_EOT\n");
1268             clrerror_dev(this, MTFSF);
1269             Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1270                print_name(), be.strerror());
1271             Dmsg0(100, "Got < 0 for MTFSF\n");
1272             Dmsg1(100, "%s", errmsg);
1273          } else {
1274             set_ateof();
1275          }
1276       }
1277       free_memory(rbuf);
1278
1279    /*
1280     * No FSF, so use FSR to simulate it
1281     */
1282    } else {
1283       Dmsg0(200, "Doing FSR for FSF\n");
1284       while (num-- && !at_eot()) {
1285          fsr(INT32_MAX);    /* returns -1 on EOF or EOT */
1286       }
1287       if (at_eot()) {
1288          dev_errno = 0;
1289          Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1290          stat = -1;
1291       } else {
1292          stat = 0;
1293       }
1294    }
1295    update_pos_dev(this);
1296    Dmsg1(200, "Return %d from FSF\n", stat);
1297    if (at_eof())
1298       Dmsg0(200, "ST_EOF set on exit FSF\n");
1299    if (at_eot())
1300       Dmsg0(200, "ST_EOT set on exit FSF\n");
1301    Dmsg1(200, "Return from FSF file=%d\n", file);
1302    return stat == 0;
1303 }
1304
1305 /*
1306  * Backward space a file
1307  *  Returns: false on failure
1308  *           true  on success
1309  */
1310 bool
1311 bsf_dev(DEVICE *dev, int num)
1312 {
1313    struct mtop mt_com;
1314    int stat;
1315
1316    if (dev->fd < 0) {
1317       dev->dev_errno = EBADF;
1318       Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1319       Emsg0(M_FATAL, 0, dev->errmsg);
1320       return false;
1321    }
1322
1323    if (!dev->is_tape()) {
1324       Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1325          dev->print_name());
1326       return false;
1327    }
1328    Dmsg0(29, "bsf_dev\n");
1329    dev->state &= ~(ST_EOT|ST_EOF);
1330    dev->file -= num;
1331    dev->file_addr = 0;
1332    dev->file_size = 0;
1333    mt_com.mt_op = MTBSF;
1334    mt_com.mt_count = num;
1335    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1336    if (stat < 0) {
1337       berrno be;
1338       clrerror_dev(dev, MTBSF);
1339       Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1340          dev->print_name(), be.strerror());
1341    }
1342    update_pos_dev(dev);
1343    return stat == 0;
1344 }
1345
1346
1347 /*
1348  * Foward space num records
1349  *  Returns: false on failure
1350  *           true  on success
1351  */
1352 bool DEVICE::fsr(int num)
1353 {
1354    struct mtop mt_com;
1355    int stat;
1356
1357    if (fd < 0) {
1358       dev_errno = EBADF;
1359       Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1360       Emsg0(M_FATAL, 0, errmsg);
1361       return false;
1362    }
1363
1364    if (!is_tape()) {
1365       return false;
1366    }
1367    if (!dev_cap(this, CAP_FSR)) {
1368       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1369       return false;
1370    }
1371
1372    Dmsg1(29, "fsr %d\n", num);
1373    mt_com.mt_op = MTFSR;
1374    mt_com.mt_count = num;
1375    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1376    if (stat == 0) {
1377       clear_eof();
1378       block_num += num;
1379    } else {
1380       berrno be;
1381       struct mtget mt_stat;
1382       clrerror_dev(this, MTFSR);
1383       Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1384       if (dev_get_os_pos(this, &mt_stat)) {
1385          Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1386             block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1387          file = mt_stat.mt_fileno;
1388          block_num = mt_stat.mt_blkno;
1389       } else {
1390          if (at_eof()) {
1391             set_eot();
1392          } else {
1393             set_ateof();
1394          }
1395       }
1396       Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1397          num, print_name(), be.strerror());
1398    }
1399    update_pos_dev(this);
1400    return stat == 0;
1401 }
1402
1403 /*
1404  * Backward space a record
1405  *   Returns:  false on failure
1406  *             true  on success
1407  */
1408 bool
1409 bsr_dev(DEVICE *dev, int num)
1410 {
1411    struct mtop mt_com;
1412    int stat;
1413
1414    if (dev->fd < 0) {
1415       dev->dev_errno = EBADF;
1416       Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1417       Emsg0(M_FATAL, 0, dev->errmsg);
1418       return false;
1419    }
1420
1421    if (!dev->is_tape()) {
1422       return false;
1423    }
1424
1425    if (!dev_cap(dev, CAP_BSR)) {
1426       Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1427       return false;
1428    }
1429
1430    Dmsg0(29, "bsr_dev\n");
1431    dev->block_num -= num;
1432    dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1433    mt_com.mt_op = MTBSR;
1434    mt_com.mt_count = num;
1435    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1436    if (stat < 0) {
1437       berrno be;
1438       clrerror_dev(dev, MTBSR);
1439       Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1440          dev->print_name(), be.strerror());
1441    }
1442    update_pos_dev(dev);
1443    return stat == 0;
1444 }
1445
1446 /*
1447  * Reposition the device to file, block
1448  * Returns: false on failure
1449  *          true  on success
1450  */
1451 bool
1452 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1453 {
1454    if (dev->fd < 0) {
1455       dev->dev_errno = EBADF;
1456       Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1457       Emsg0(M_FATAL, 0, dev->errmsg);
1458       return false;
1459    }
1460
1461    if (!dev->is_tape()) {
1462       off_t pos = (((off_t)file)<<32) + (off_t)block;
1463       Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1464       if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1465          berrno be;
1466          dev->dev_errno = errno;
1467          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1468             dev->print_name(), be.strerror());
1469          return false;
1470       }
1471       dev->file = file;
1472       dev->block_num = block;
1473       dev->file_addr = pos;
1474       return true;
1475    }
1476    Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1477       dev->file, dev->block_num, file, block);
1478    if (file < dev->file) {
1479       Dmsg0(100, "Rewind_dev\n");
1480       if (!rewind_dev(dev)) {
1481          return false;
1482       }
1483    }
1484    if (file > dev->file) {
1485       Dmsg1(100, "fsf %d\n", file-dev->file);
1486       if (!dev->fsf(file-dev->file)) {
1487          Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1488          return false;
1489       }
1490       Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1491    }
1492    if (block < dev->block_num) {
1493       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1494       Dmsg0(100, "bsf_dev 1\n");
1495       bsf_dev(dev, 1);
1496       Dmsg0(100, "fsf_dev 1\n");
1497       dev->fsf(1);
1498       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1499    }
1500    if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1501       /* Ignore errors as Bacula can read to the correct block */
1502       Dmsg1(100, "fsr %d\n", block-dev->block_num);
1503       return dev->fsr(block-dev->block_num);
1504    }
1505    return true;
1506 }
1507
1508
1509
1510 /*
1511  * Write an end of file on the device
1512  *   Returns: 0 on success
1513  *            non-zero on failure
1514  */
1515 int
1516 weof_dev(DEVICE *dev, int num)
1517 {
1518    struct mtop mt_com;
1519    int stat;
1520    Dmsg0(29, "weof_dev\n");
1521    
1522    if (dev->fd < 0) {
1523       dev->dev_errno = EBADF;
1524       Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1525       Emsg0(M_FATAL, 0, dev->errmsg);
1526       return -1;
1527    }
1528    dev->file_size = 0;
1529
1530    if (!dev->is_tape()) {
1531       return 0;
1532    }
1533    if (!dev->can_append()) {
1534       Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1535       Emsg0(M_FATAL, 0, dev->errmsg);
1536       return -1;
1537    }
1538       
1539    dev->state &= ~(ST_EOT | ST_EOF);  /* remove EOF/EOT flags */
1540    mt_com.mt_op = MTWEOF;
1541    mt_com.mt_count = num;
1542    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1543    if (stat == 0) {
1544       dev->block_num = 0;
1545       dev->file += num;
1546       dev->file_addr = 0;
1547    } else {
1548       berrno be;
1549       clrerror_dev(dev, MTWEOF);
1550       if (stat == -1) {
1551          Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1552             dev->print_name(), be.strerror());
1553        }
1554    }
1555    return stat;
1556 }
1557
1558 /*
1559  * Return string message with last error in English
1560  *  Be careful not to call this routine from within dev.c
1561  *  while editing an Mmsg() or you will end up in a recursive
1562  *  loop creating a Segmentation Violation.
1563  */
1564 char *
1565 strerror_dev(DEVICE *dev)
1566 {
1567    return dev->errmsg;
1568 }
1569
1570
1571 /*
1572  * If implemented in system, clear the tape
1573  * error status.
1574  */
1575 void
1576 clrerror_dev(DEVICE *dev, int func)
1577 {
1578    const char *msg = NULL;
1579    struct mtget mt_stat;
1580    char buf[100];
1581
1582    dev->dev_errno = errno;         /* save errno */
1583    if (errno == EIO) {
1584       dev->VolCatInfo.VolCatErrors++;
1585    }
1586
1587    if (!dev->is_tape()) {
1588       return;
1589    }
1590    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1591       switch (func) {
1592       case -1:
1593          Emsg0(M_ABORT, 0, _("Got ENOTTY on read/write!\n"));
1594          break;
1595       case MTWEOF:
1596          msg = "WTWEOF";
1597          dev->capabilities &= ~CAP_EOF; /* turn off feature */
1598          break;
1599 #ifdef MTEOM
1600       case MTEOM:
1601          msg = "WTEOM";
1602          dev->capabilities &= ~CAP_EOM; /* turn off feature */
1603          break;
1604 #endif
1605       case MTFSF:
1606          msg = "MTFSF";
1607          dev->capabilities &= ~CAP_FSF; /* turn off feature */
1608          break;
1609       case MTBSF:
1610          msg = "MTBSF";
1611          dev->capabilities &= ~CAP_BSF; /* turn off feature */
1612          break;
1613       case MTFSR:
1614          msg = "MTFSR";
1615          dev->capabilities &= ~CAP_FSR; /* turn off feature */
1616          break;
1617       case MTBSR:
1618          msg = "MTBSR";
1619          dev->capabilities &= ~CAP_BSR; /* turn off feature */
1620          break;
1621       case MTREW:
1622          msg = "MTREW";
1623          break;
1624 #ifdef MTSETBLK
1625       case MTSETBLK:
1626          msg = "MTSETBLK";
1627          break;
1628 #endif
1629 #ifdef MTSETBSIZ 
1630       case MTSETBSIZ:
1631          msg = "MTSETBSIZ";
1632          break;
1633 #endif
1634 #ifdef MTSRSZ
1635       case MTSRSZ:
1636          msg = "MTSRSZ";
1637          break;
1638 #endif
1639       default:
1640          bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1641          msg = buf;
1642          break;
1643       }
1644       if (msg != NULL) {
1645          dev->dev_errno = ENOSYS;
1646          Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1647          Emsg0(M_ERROR, 0, dev->errmsg);
1648       }
1649    }
1650    /* On some systems such as NetBSD, this clears all errors */
1651    ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1652
1653 /* Found on Linux */
1654 #ifdef MTIOCLRERR
1655 {
1656    struct mtop mt_com;
1657    mt_com.mt_op = MTIOCLRERR;
1658    mt_com.mt_count = 1;
1659    /* Clear any error condition on the tape */
1660    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1661    Dmsg0(200, "Did MTIOCLRERR\n");
1662 }
1663 #endif
1664
1665 /* Typically on FreeBSD */
1666 #ifdef MTIOCERRSTAT
1667 {
1668    /* Read and clear SCSI error status */
1669    union mterrstat mt_errstat;
1670    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1671       strerror(dev->dev_errno));
1672    ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1673 }
1674 #endif
1675
1676 /* Clear Subsystem Exception OSF1 */
1677 #ifdef MTCSE
1678 {
1679    struct mtop mt_com;
1680    mt_com.mt_op = MTCSE;
1681    mt_com.mt_count = 1;
1682    /* Clear any error condition on the tape */
1683    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1684    Dmsg0(200, "Did MTCSE\n");
1685 }
1686 #endif
1687 }
1688
1689 /*
1690  * Flush buffer contents
1691  *  No longer used.
1692  */
1693 int flush_dev(DEVICE *dev)
1694 {
1695    return 1;
1696 }
1697
1698 static void do_close(DEVICE *dev)
1699 {
1700
1701    Dmsg1(29, "really close_dev %s\n", dev->print_name());
1702    if (dev->fd >= 0) {
1703       close(dev->fd);
1704    }
1705
1706    if (!unmount_dev(dev, 1)) {
1707       Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1708    }
1709    
1710    /* Remove the last part file if it is empty */
1711    if (dev->num_parts > 0) {
1712       struct stat statp;
1713       POOL_MEM archive_name(PM_FNAME);
1714       dev->part = dev->num_parts;
1715       Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1716       make_spooled_dvd_filename(dev, archive_name);
1717       /* Check that the part file is empty */
1718       if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1719          Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1720          unlink(archive_name.c_str());
1721       }
1722    }
1723    
1724    /* Clean up device packet so it can be reused */
1725    dev->fd = -1;
1726    dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1727    dev->label_type = B_BACULA_LABEL;
1728    dev->file = dev->block_num = 0;
1729    dev->file_size = 0;
1730    dev->file_addr = 0;
1731    dev->part = 0;
1732    dev->num_parts = 0;
1733    dev->part_size = 0;
1734    dev->part_start = 0;
1735    dev->EndFile = dev->EndBlock = 0;
1736    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1737    free_volume(dev);
1738    memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1739    if (dev->tid) {
1740       stop_thread_timer(dev->tid);
1741       dev->tid = 0;
1742    }
1743    dev->use_count = 0;
1744    dev->openmode = 0;
1745 }
1746
1747 /*
1748  * Close the device
1749  */
1750 void DEVICE::close()
1751 {
1752    /*if (fd >= 0 && use_count == 1) {*/
1753    /* No need to check if fd >= 0: it is checked again
1754     * in do_close, and do_close MUST be called for volumes
1755     * splitted in parts, even if fd == -1. */
1756    if (use_count == 1) {
1757       do_close(this);
1758    } else if (use_count > 0) {
1759       use_count--;
1760    }
1761
1762 #ifdef FULL_DEBUG
1763    ASSERT(use_count >= 0);
1764 #endif
1765 }
1766
1767
1768 bool truncate_dev(DCR *dcr) /* We need the DCR for DVD-writing */
1769 {
1770    DEVICE *dev = dcr->dev;
1771
1772    Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1773    if (dev->is_tape()) {
1774       return true;                    /* we don't really truncate tapes */
1775       /* maybe we should rewind and write and eof ???? */
1776    }
1777    
1778    if (dev->is_dvd()) {
1779       return truncate_dvd_dev(dcr);
1780    }
1781    
1782    if (ftruncate(dev->fd, 0) != 0) {
1783       berrno be;
1784       Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
1785             dev->print_name(), be.strerror());
1786       return false;
1787    }
1788    return true;
1789 }
1790
1791 /* Return the resource name for the device */
1792 const char *DEVICE::name() const
1793 {
1794    return device->hdr.name;
1795 }
1796
1797 char *
1798 dev_vol_name(DEVICE *dev)
1799 {
1800    return dev->VolCatInfo.VolCatName;
1801 }
1802
1803 uint32_t dev_block(DEVICE *dev)
1804 {
1805    update_pos_dev(dev);
1806    return dev->block_num;
1807 }
1808
1809 uint32_t dev_file(DEVICE *dev)
1810 {
1811    update_pos_dev(dev);
1812    return dev->file;
1813 }
1814
1815 /*
1816  * Free memory allocated for the device
1817  */
1818 void
1819 term_dev(DEVICE *dev)
1820 {
1821    if (!dev) {
1822       dev->dev_errno = EBADF;
1823       Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1824       Emsg0(M_FATAL, 0, dev->errmsg);
1825       return;
1826    }
1827    Dmsg1(29, "term_dev: %s\n", dev->print_name());
1828    do_close(dev);
1829    if (dev->dev_name) {
1830       free_memory(dev->dev_name);
1831       dev->dev_name = NULL;
1832    }
1833    if (dev->prt_name) {
1834       free_memory(dev->prt_name);
1835       dev->prt_name = NULL;
1836    }
1837    if (dev->errmsg) {
1838       free_pool_memory(dev->errmsg);
1839       dev->errmsg = NULL;
1840    }
1841    pthread_mutex_destroy(&dev->mutex);
1842    pthread_cond_destroy(&dev->wait);
1843    pthread_cond_destroy(&dev->wait_next_vol);
1844    pthread_mutex_destroy(&dev->spool_mutex);
1845    rwl_destroy(&dev->lock);
1846    if (dev->attached_dcrs) {
1847       delete dev->attached_dcrs;
1848       dev->attached_dcrs = NULL;
1849    }
1850    if (dev->state & ST_MALLOC) {
1851       free_pool_memory((POOLMEM *)dev);
1852    }
1853 }
1854
1855 /*
1856  * This routine initializes the device wait timers
1857  */
1858 void init_device_wait_timers(DCR *dcr)
1859 {
1860    DEVICE *dev = dcr->dev;
1861    JCR *jcr = dcr->jcr;
1862
1863    /* ******FIXME******* put these on config variables */
1864    dev->min_wait = 60 * 60;
1865    dev->max_wait = 24 * 60 * 60;
1866    dev->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1867    dev->wait_sec = dev->min_wait;
1868    dev->rem_wait_sec = dev->wait_sec;
1869    dev->num_wait = 0;
1870    dev->poll = false;
1871    dev->BadVolName[0] = 0;
1872
1873    jcr->min_wait = 60 * 60;
1874    jcr->max_wait = 24 * 60 * 60;
1875    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1876    jcr->wait_sec = jcr->min_wait;
1877    jcr->rem_wait_sec = jcr->wait_sec;
1878    jcr->num_wait = 0;
1879
1880 }
1881
1882 void init_jcr_device_wait_timers(JCR *jcr)
1883 {
1884    /* ******FIXME******* put these on config variables */
1885    jcr->min_wait = 60 * 60;
1886    jcr->max_wait = 24 * 60 * 60;
1887    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1888    jcr->wait_sec = jcr->min_wait;
1889    jcr->rem_wait_sec = jcr->wait_sec;
1890    jcr->num_wait = 0;
1891 }
1892
1893
1894 /*
1895  * The dev timers are used for waiting on a particular device 
1896  *
1897  * Returns: true if time doubled
1898  *          false if max time expired
1899  */
1900 bool double_dev_wait_time(DEVICE *dev)
1901 {
1902    dev->wait_sec *= 2;               /* double wait time */
1903    if (dev->wait_sec > dev->max_wait) {   /* but not longer than maxtime */
1904       dev->wait_sec = dev->max_wait;
1905    }
1906    dev->num_wait++;
1907    dev->rem_wait_sec = dev->wait_sec;
1908    if (dev->num_wait >= dev->max_num_wait) {
1909       return false;
1910    }
1911    return true;
1912 }
1913
1914
1915 void set_os_device_parameters(DEVICE *dev)
1916 {
1917 #ifdef HAVE_LINUX_OS
1918    struct mtop mt_com;
1919    if (dev->min_block_size == dev->max_block_size &&
1920        dev->min_block_size == 0) {    /* variable block mode */
1921       mt_com.mt_op = MTSETBLK;
1922       mt_com.mt_count = 0;
1923       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1924          clrerror_dev(dev, MTSETBLK);
1925       }
1926       mt_com.mt_op = MTSETDRVBUFFER;
1927       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1928       if (!dev_cap(dev, CAP_TWOEOF)) {
1929          mt_com.mt_count |= MT_ST_TWO_FM;
1930       }
1931       if (dev_cap(dev, CAP_EOM)) {
1932          mt_com.mt_count |= MT_ST_FAST_MTEOM;
1933       }
1934       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1935          clrerror_dev(dev, MTSETBLK);
1936       }
1937    }
1938    return;
1939 #endif
1940
1941 #ifdef HAVE_NETBSD_OS
1942    struct mtop mt_com;
1943    if (dev->min_block_size == dev->max_block_size &&
1944        dev->min_block_size == 0) {    /* variable block mode */
1945       mt_com.mt_op = MTSETBSIZ;
1946       mt_com.mt_count = 0;
1947       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1948          clrerror_dev(dev, MTSETBSIZ);
1949       }
1950       /* Get notified at logical end of tape */
1951       mt_com.mt_op = MTEWARN;
1952       mt_com.mt_count = 1;
1953       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1954          clrerror_dev(dev, MTEWARN);
1955       }
1956    }
1957    return;
1958 #endif
1959
1960 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1961    struct mtop mt_com;
1962    if (dev->min_block_size == dev->max_block_size &&
1963        dev->min_block_size == 0) {    /* variable block mode */
1964       mt_com.mt_op = MTSETBSIZ;
1965       mt_com.mt_count = 0;
1966       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1967          clrerror_dev(dev, MTSETBSIZ);
1968       }
1969    }
1970    return;
1971 #endif
1972
1973 #ifdef HAVE_SUN_OS
1974    struct mtop mt_com;
1975    if (dev->min_block_size == dev->max_block_size &&
1976        dev->min_block_size == 0) {    /* variable block mode */
1977       mt_com.mt_op = MTSRSZ;
1978       mt_com.mt_count = 0;
1979       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1980          clrerror_dev(dev, MTSRSZ);
1981       }
1982    }
1983    return;
1984 #endif
1985 }
1986
1987 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1988 {
1989    return dev_cap(dev, CAP_MTIOCGET) && 
1990           ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1991           mt_stat->mt_fileno >= 0;
1992 }
1993
1994 static char *modes[] = {
1995    "CREATE_READ_WRITE",
1996    "OPEN_READ_WRITE",
1997    "OPEN_READ_ONLY",
1998    "OPEN_WRITE_ONLY"
1999 };
2000
2001
2002 static char *mode_to_str(int mode)  
2003 {
2004    return modes[mode-1];
2005 }