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