]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
0cd3fcfa06fd86dfc9c4bc95e7a4b281ecd11076
[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    file++;
749    file_addr = 0;
750    file_size = 0;
751    block_num = 0;
752 }
753
754 /*
755  * Called to indicate we are now at the end of the tape, and
756  *   writing is not possible.
757  */
758 void DEVICE::set_ateot() 
759 {
760    /* Make tape effectively read-only */
761    state |= (ST_EOF|ST_EOT|ST_WEOT);
762    clear_append();
763 }
764
765 /*
766  * Position device to end of medium (end of data)
767  *  Returns: true  on succes
768  *           false on error
769  */
770 bool
771 eod_dev(DEVICE *dev)
772 {
773    struct mtop mt_com;
774    struct mtget mt_stat;
775    bool ok = true;
776    off_t pos;
777
778    if (dev->fd < 0) {
779       dev->dev_errno = EBADF;
780       Mmsg1(dev->errmsg, _("Bad call to eod_dev. Device %s not open\n"),
781             dev->print_name());
782       return false;
783    }
784
785 #if defined (__digital__) && defined (__unix__)
786    return dev->fsf(dev->VolCatInfo.VolCatFiles);
787 #endif
788
789    Dmsg0(29, "eod_dev\n");
790    if (dev->at_eot()) {
791       return true;
792    }
793    dev->state &= ~(ST_EOF);  /* remove EOF flags */
794    dev->block_num = dev->file = 0;
795    dev->file_size = 0;
796    dev->file_addr = 0;
797    if (dev->state & (ST_FIFO | ST_PROG)) {
798       return true;
799    }
800    if (!dev->is_tape()) {
801       pos = lseek_dev(dev, (off_t)0, SEEK_END);
802 //    Dmsg1(100, "====== Seek to %lld\n", pos);
803       if (pos >= 0) {
804          update_pos_dev(dev);
805          dev->state |= ST_EOT;
806          return true;
807       }
808       dev->dev_errno = errno;
809       berrno be;
810       Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
811              dev->print_name(), be.strerror());
812       return false;
813    }
814 #ifdef MTEOM
815    if (dev_cap(dev, CAP_FASTFSF) && !dev_cap(dev, CAP_EOM)) {
816       Dmsg0(100,"Using FAST FSF for EOM\n");
817       /* If unknown position, rewind */
818       if (!dev_get_os_pos(dev, &mt_stat)) {
819         if (!rewind_dev(dev)) {
820           return false;
821         }
822       }
823       mt_com.mt_op = MTFSF;
824       /*
825        * ***FIXME*** fix code to handle case that INT16_MAX is
826        *   not large enough.
827        */
828       mt_com.mt_count = INT16_MAX;    /* use big positive number */
829       if (mt_com.mt_count < 0) {
830          mt_com.mt_count = INT16_MAX; /* brain damaged system */
831       }
832    }
833
834    if (dev_cap(dev, CAP_MTIOCGET) && (dev_cap(dev, CAP_FASTFSF) || dev_cap(dev, CAP_EOM))) {
835       if (dev_cap(dev, CAP_EOM)) {
836          Dmsg0(100,"Using EOM for EOM\n");
837          mt_com.mt_op = MTEOM;
838          mt_com.mt_count = 1;
839       }
840
841       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
842          berrno be;
843          clrerror_dev(dev, mt_com.mt_op);
844          Dmsg1(50, "ioctl error: %s\n", be.strerror());
845          update_pos_dev(dev);
846          Mmsg2(dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
847             dev->print_name(), be.strerror());
848          return false;
849       }
850
851       if (!dev_get_os_pos(dev, &mt_stat)) {
852          berrno be;
853          clrerror_dev(dev, -1);
854          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
855             dev->print_name(), be.strerror());
856          return false;
857       }
858       Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
859       dev->set_ateof();
860       dev->file = mt_stat.mt_fileno;
861    } else {
862 #else
863    {
864 #endif
865       /*
866        * Rewind then use FSF until EOT reached
867        */
868       if (!rewind_dev(dev)) {
869          return false;
870       }
871       /*
872        * Move file by file to the end of the tape
873        */
874       int file_num;
875       for (file_num=dev->file; !dev->at_eot(); file_num++) {
876          Dmsg0(200, "eod_dev: doing fsf 1\n");
877          if (!dev->fsf(1)) {
878             Dmsg0(200, "fsf error.\n");
879             return false;
880          }
881          /*
882           * Avoid infinite loop by ensuring we advance.
883           */
884          if (file_num == (int)dev->file) {
885             struct mtget mt_stat;
886             Dmsg1(100, "fsf did not advance from file %d\n", file_num);
887             dev->set_ateof();
888             if (dev_get_os_pos(dev, &mt_stat)) {
889                Dmsg2(100, "Adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
890                dev->file = mt_stat.mt_fileno;
891             }       
892             break;
893          }
894       }
895    }
896    /*
897     * Some drivers leave us after second EOF when doing
898     * MTEOM, so we must backup so that appending overwrites
899     * the second EOF.
900     */
901    if (dev_cap(dev, CAP_BSFATEOM)) {
902       struct mtget mt_stat;
903       /* Backup over EOF */
904       ok = bsf_dev(dev, 1);
905       /* If BSF worked and fileno is known (not -1), set file */
906       if (dev_get_os_pos(dev, &mt_stat)) {
907          Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", dev->file , mt_stat.mt_fileno);
908          dev->file = mt_stat.mt_fileno;
909       } else {
910          dev->file++;                 /* wing it -- not correct on all OSes */
911       }
912    } else {
913       update_pos_dev(dev);                   /* update position */
914    }
915    Dmsg1(200, "EOD dev->file=%d\n", dev->file);
916    return ok;
917 }
918
919 /*
920  * Set the position of the device -- only for files and DVD
921  *   For other devices, there is no generic way to do it.
922  *  Returns: true  on succes
923  *           false on error
924  */
925 bool update_pos_dev(DEVICE *dev)
926 {
927    off_t pos;
928    bool ok = true;
929
930    if (dev->fd < 0) {
931       dev->dev_errno = EBADF;
932       Mmsg0(dev->errmsg, _("Bad device call. Device not open\n"));
933       Emsg0(M_FATAL, 0, dev->errmsg);
934       return false;
935    }
936
937    /* Find out where we are */
938    if (dev->is_file()) {
939       dev->file = 0;
940       dev->file_addr = 0;
941       pos = lseek_dev(dev, (off_t)0, SEEK_CUR);
942       if (pos < 0) {
943          berrno be;
944          dev->dev_errno = errno;
945          Pmsg1(000, _("Seek error: ERR=%s\n"), be.strerror());
946          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
947             dev->print_name(), be.strerror());
948          ok = false;
949       } else {
950          dev->file_addr = pos;
951       }
952    }
953    return ok;
954 }
955
956
957 /*
958  * Return the status of the device.  This was meant
959  * to be a generic routine. Unfortunately, it doesn't
960  * seem possible (at least I do not know how to do it
961  * currently), which means that for the moment, this
962  * routine has very little value.
963  *
964  *   Returns: status
965  */
966 uint32_t status_dev(DEVICE *dev)
967 {
968    struct mtget mt_stat;
969    uint32_t stat = 0;
970
971    if (dev->state & (ST_EOT | ST_WEOT)) {
972       stat |= BMT_EOD;
973       Pmsg0(-20, " EOD");
974    }
975    if (dev->state & ST_EOF) {
976       stat |= BMT_EOF;
977       Pmsg0(-20, " EOF");
978    }
979    if (dev->is_tape()) {
980       stat |= BMT_TAPE;
981       Pmsg0(-20,_(" Bacula status:"));
982       Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
983       if (ioctl(dev->fd, MTIOCGET, (char *)&mt_stat) < 0) {
984          berrno be;
985          dev->dev_errno = errno;
986          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
987             dev->print_name(), be.strerror());
988          return 0;
989       }
990       Pmsg0(-20, _(" Device status:"));
991
992 #if defined(HAVE_LINUX_OS)
993       if (GMT_EOF(mt_stat.mt_gstat)) {
994          stat |= BMT_EOF;
995          Pmsg0(-20, " EOF");
996       }
997       if (GMT_BOT(mt_stat.mt_gstat)) {
998          stat |= BMT_BOT;
999          Pmsg0(-20, " BOT");
1000       }
1001       if (GMT_EOT(mt_stat.mt_gstat)) {
1002          stat |= BMT_EOT;
1003          Pmsg0(-20, " EOT");
1004       }
1005       if (GMT_SM(mt_stat.mt_gstat)) {
1006          stat |= BMT_SM;
1007          Pmsg0(-20, " SM");
1008       }
1009       if (GMT_EOD(mt_stat.mt_gstat)) {
1010          stat |= BMT_EOD;
1011          Pmsg0(-20, " EOD");
1012       }
1013       if (GMT_WR_PROT(mt_stat.mt_gstat)) {
1014          stat |= BMT_WR_PROT;
1015          Pmsg0(-20, " WR_PROT");
1016       }
1017       if (GMT_ONLINE(mt_stat.mt_gstat)) {
1018          stat |= BMT_ONLINE;
1019          Pmsg0(-20, " ONLINE");
1020       }
1021       if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
1022          stat |= BMT_DR_OPEN;
1023          Pmsg0(-20, " DR_OPEN");
1024       }
1025       if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
1026          stat |= BMT_IM_REP_EN;
1027          Pmsg0(-20, " IM_REP_EN");
1028       }
1029 #endif /* !SunOS && !OSF */
1030       if (dev_cap(dev, CAP_MTIOCGET)) {
1031          Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
1032       } else {
1033          Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1034       }
1035    } else {
1036       stat |= BMT_ONLINE | BMT_BOT;
1037    }
1038    return stat;
1039 }
1040
1041
1042 /*
1043  * Load medium in device
1044  *  Returns: true  on success
1045  *           false on failure
1046  */
1047 bool load_dev(DEVICE *dev)
1048 {
1049 #ifdef MTLOAD
1050    struct mtop mt_com;
1051 #endif
1052
1053    if (dev->fd < 0) {
1054       dev->dev_errno = EBADF;
1055       Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1056       Emsg0(M_FATAL, 0, dev->errmsg);
1057       return false;
1058    }
1059    if (!(dev->is_tape())) {
1060       return true;
1061    }
1062 #ifndef MTLOAD
1063    Dmsg0(200, "stored: MTLOAD command not available\n");
1064    berrno be;
1065    dev->dev_errno = ENOTTY;           /* function not available */
1066    Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1067          dev->print_name(), be.strerror());
1068    return false;
1069 #else
1070
1071    dev->block_num = dev->file = 0;
1072    dev->file_size = 0;
1073    dev->file_addr = 0;
1074    mt_com.mt_op = MTLOAD;
1075    mt_com.mt_count = 1;
1076    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1077       berrno be;
1078       dev->dev_errno = errno;
1079       Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1080          dev->print_name(), be.strerror());
1081       return false;
1082    }
1083    return true;
1084 #endif
1085 }
1086
1087 /*
1088  * Rewind device and put it offline
1089  *  Returns: true  on success
1090  *           false on failure
1091  */
1092 bool offline_dev(DEVICE *dev)
1093 {
1094    struct mtop mt_com;
1095
1096    if (!dev || dev->fd < 0 || !dev->is_tape()) {
1097       return true;                    /* device not open */
1098    }
1099
1100    dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
1101    dev->block_num = dev->file = 0;
1102    dev->file_size = 0;
1103    dev->file_addr = 0;
1104    dev->part = 0;
1105 #ifdef MTUNLOCK
1106    mt_com.mt_op = MTUNLOCK;
1107    mt_com.mt_count = 1;
1108    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1109 #endif
1110    mt_com.mt_op = MTOFFL;
1111    mt_com.mt_count = 1;
1112    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1113       berrno be;
1114       dev->dev_errno = errno;
1115       Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1116          dev->print_name(), be.strerror());
1117       return false;
1118    }
1119    Dmsg1(100, "Offlined device %s\n", dev->print_name());
1120    return true;
1121 }
1122
1123 bool offline_or_rewind_dev(DEVICE *dev)
1124 {
1125    if (dev->fd < 0) {
1126       return false;
1127    }
1128    if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1129       return offline_dev(dev);
1130    } else {
1131    /*
1132     * Note, this rewind probably should not be here (it wasn't
1133     *  in prior versions of Bacula), but on FreeBSD, this is
1134     *  needed in the case the tape was "frozen" due to an error
1135     *  such as backspacing after writing and EOF. If it is not
1136     *  done, all future references to the drive get and I/O error.
1137     */
1138       clrerror_dev(dev, MTREW);
1139       return rewind_dev(dev);
1140    }
1141 }
1142
1143 /*
1144  * Foward space a file
1145  *   Returns: true  on success
1146  *            false on failure
1147  */
1148 bool DEVICE::fsf(int num)
1149 {
1150    struct mtget mt_stat;
1151    struct mtop mt_com;
1152    int stat = 0;
1153
1154    if (fd < 0) {
1155       dev_errno = EBADF;
1156       Mmsg0(errmsg, _("Bad call to fsf_dev. Device not open\n"));
1157       Emsg0(M_FATAL, 0, errmsg);
1158       return false;
1159    }
1160
1161    if (!is_tape()) {
1162       return true;
1163    }
1164    if (at_eot()) {
1165       dev_errno = 0;
1166       Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1167       return false;
1168    }
1169    if (at_eof()) {
1170       Dmsg0(200, "ST_EOF set on entry to FSF\n");
1171    }
1172
1173    Dmsg0(100, "fsf\n");
1174    block_num = 0;
1175    /*
1176     * If Fast forward space file is set, then we
1177     *  use MTFSF to forward space and MTIOCGET
1178     *  to get the file position. We assume that
1179     *  the SCSI driver will ensure that we do not
1180     *  forward space past the end of the medium.
1181     */
1182    if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
1183       mt_com.mt_op = MTFSF;
1184       mt_com.mt_count = num;
1185       stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1186       if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1187          berrno be;
1188          set_eot();
1189          Dmsg0(200, "Set ST_EOT\n");
1190          clrerror_dev(this, MTFSF);
1191          Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1192             print_name(), be.strerror());
1193          Dmsg1(200, "%s", errmsg);
1194          return false;
1195       }
1196       Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1197       set_ateof();
1198       file = mt_stat.mt_fileno;
1199       return true;
1200
1201    /*
1202     * Here if CAP_FSF is set, and virtually all drives
1203     *  these days support it, we read a record, then forward
1204     *  space one file. Using this procedure, which is slow,
1205     *  is the only way we can be sure that we don't read
1206     *  two consecutive EOF marks, which means End of Data.
1207     */
1208    } else if (dev_cap(this, CAP_FSF)) {
1209       POOLMEM *rbuf;
1210       int rbuf_len;
1211       Dmsg0(200, "FSF has cap_fsf\n");
1212       if (max_block_size == 0) {
1213          rbuf_len = DEFAULT_BLOCK_SIZE;
1214       } else {
1215          rbuf_len = max_block_size;
1216       }
1217       rbuf = get_memory(rbuf_len);
1218       mt_com.mt_op = MTFSF;
1219       mt_com.mt_count = 1;
1220       while (num-- && !at_eot()) {
1221          Dmsg0(100, "Doing read before fsf\n");
1222          if ((stat = read(fd, (char *)rbuf, rbuf_len)) < 0) {
1223             if (errno == ENOMEM) {     /* tape record exceeds buf len */
1224                stat = rbuf_len;        /* This is OK */
1225             /*
1226              * On IBM drives, they return ENOSPC at EOM
1227              *  instead of EOF status
1228              */
1229             } else if (at_eof() && errno == ENOSPC) {
1230                stat = 0;
1231             } else {
1232                berrno be;
1233                set_eot();
1234                clrerror_dev(this, -1);
1235                Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1236                   be.strerror());
1237                Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1238                   print_name(), be.strerror());
1239                Dmsg1(100, "%s", errmsg);
1240                break;
1241             }
1242          }
1243          if (stat == 0) {                /* EOF */
1244             update_pos_dev(this);
1245             Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1246             /* Two reads of zero means end of tape */
1247             if (at_eof()) {
1248                set_eot();
1249                Dmsg0(100, "Set ST_EOT\n");
1250                break;
1251             } else {
1252                set_ateof();
1253                continue;
1254             }
1255          } else {                        /* Got data */
1256             clear_eot();
1257             clear_eof();
1258          }
1259
1260          Dmsg0(100, "Doing MTFSF\n");
1261          stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1262          if (stat < 0) {                 /* error => EOT */
1263             berrno be;
1264             set_eot();
1265             Dmsg0(100, "Set ST_EOT\n");
1266             clrerror_dev(this, MTFSF);
1267             Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1268                print_name(), be.strerror());
1269             Dmsg0(100, "Got < 0 for MTFSF\n");
1270             Dmsg1(100, "%s", errmsg);
1271          } else {
1272             set_ateof();
1273          }
1274       }
1275       free_memory(rbuf);
1276
1277    /*
1278     * No FSF, so use FSR to simulate it
1279     */
1280    } else {
1281       Dmsg0(200, "Doing FSR for FSF\n");
1282       while (num-- && !at_eot()) {
1283          fsr(INT32_MAX);    /* returns -1 on EOF or EOT */
1284       }
1285       if (at_eot()) {
1286          dev_errno = 0;
1287          Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1288          stat = -1;
1289       } else {
1290          stat = 0;
1291       }
1292    }
1293    update_pos_dev(this);
1294    Dmsg1(200, "Return %d from FSF\n", stat);
1295    if (at_eof())
1296       Dmsg0(200, "ST_EOF set on exit FSF\n");
1297    if (at_eot())
1298       Dmsg0(200, "ST_EOT set on exit FSF\n");
1299    Dmsg1(200, "Return from FSF file=%d\n", file);
1300    return stat == 0;
1301 }
1302
1303 /*
1304  * Backward space a file
1305  *  Returns: false on failure
1306  *           true  on success
1307  */
1308 bool
1309 bsf_dev(DEVICE *dev, int num)
1310 {
1311    struct mtop mt_com;
1312    int stat;
1313
1314    if (dev->fd < 0) {
1315       dev->dev_errno = EBADF;
1316       Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1317       Emsg0(M_FATAL, 0, dev->errmsg);
1318       return false;
1319    }
1320
1321    if (!dev->is_tape()) {
1322       Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1323          dev->print_name());
1324       return false;
1325    }
1326    Dmsg0(29, "bsf_dev\n");
1327    dev->state &= ~(ST_EOT|ST_EOF);
1328    dev->file -= num;
1329    dev->file_addr = 0;
1330    dev->file_size = 0;
1331    mt_com.mt_op = MTBSF;
1332    mt_com.mt_count = num;
1333    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1334    if (stat < 0) {
1335       berrno be;
1336       clrerror_dev(dev, MTBSF);
1337       Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1338          dev->print_name(), be.strerror());
1339    }
1340    update_pos_dev(dev);
1341    return stat == 0;
1342 }
1343
1344
1345 /*
1346  * Foward space num records
1347  *  Returns: false on failure
1348  *           true  on success
1349  */
1350 bool DEVICE::fsr(int num)
1351 {
1352    struct mtop mt_com;
1353    int stat;
1354
1355    if (fd < 0) {
1356       dev_errno = EBADF;
1357       Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1358       Emsg0(M_FATAL, 0, errmsg);
1359       return false;
1360    }
1361
1362    if (!is_tape()) {
1363       return false;
1364    }
1365    if (!dev_cap(this, CAP_FSR)) {
1366       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1367       return false;
1368    }
1369
1370    Dmsg1(29, "fsr %d\n", num);
1371    mt_com.mt_op = MTFSR;
1372    mt_com.mt_count = num;
1373    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1374    if (stat == 0) {
1375       clear_eof();
1376       block_num += num;
1377    } else {
1378       berrno be;
1379       struct mtget mt_stat;
1380       clrerror_dev(this, MTFSR);
1381       Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1382       if (dev_get_os_pos(this, &mt_stat)) {
1383          Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1384             block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1385          file = mt_stat.mt_fileno;
1386          block_num = mt_stat.mt_blkno;
1387       } else {
1388          if (at_eof()) {
1389             set_eot();
1390          } else {
1391             set_ateof();
1392          }
1393       }
1394       Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1395          num, print_name(), be.strerror());
1396    }
1397    update_pos_dev(this);
1398    return stat == 0;
1399 }
1400
1401 /*
1402  * Backward space a record
1403  *   Returns:  false on failure
1404  *             true  on success
1405  */
1406 bool
1407 bsr_dev(DEVICE *dev, int num)
1408 {
1409    struct mtop mt_com;
1410    int stat;
1411
1412    if (dev->fd < 0) {
1413       dev->dev_errno = EBADF;
1414       Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1415       Emsg0(M_FATAL, 0, dev->errmsg);
1416       return false;
1417    }
1418
1419    if (!dev->is_tape()) {
1420       return false;
1421    }
1422
1423    if (!dev_cap(dev, CAP_BSR)) {
1424       Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1425       return false;
1426    }
1427
1428    Dmsg0(29, "bsr_dev\n");
1429    dev->block_num -= num;
1430    dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1431    mt_com.mt_op = MTBSR;
1432    mt_com.mt_count = num;
1433    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1434    if (stat < 0) {
1435       berrno be;
1436       clrerror_dev(dev, MTBSR);
1437       Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1438          dev->print_name(), be.strerror());
1439    }
1440    update_pos_dev(dev);
1441    return stat == 0;
1442 }
1443
1444 /*
1445  * Reposition the device to file, block
1446  * Returns: false on failure
1447  *          true  on success
1448  */
1449 bool
1450 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1451 {
1452    if (dev->fd < 0) {
1453       dev->dev_errno = EBADF;
1454       Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1455       Emsg0(M_FATAL, 0, dev->errmsg);
1456       return false;
1457    }
1458
1459    if (!dev->is_tape()) {
1460       off_t pos = (((off_t)file)<<32) + (off_t)block;
1461       Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1462       if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1463          berrno be;
1464          dev->dev_errno = errno;
1465          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1466             dev->print_name(), be.strerror());
1467          return false;
1468       }
1469       dev->file = file;
1470       dev->block_num = block;
1471       dev->file_addr = pos;
1472       return true;
1473    }
1474    Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1475       dev->file, dev->block_num, file, block);
1476    if (file < dev->file) {
1477       Dmsg0(100, "Rewind_dev\n");
1478       if (!rewind_dev(dev)) {
1479          return false;
1480       }
1481    }
1482    if (file > dev->file) {
1483       Dmsg1(100, "fsf %d\n", file-dev->file);
1484       if (!dev->fsf(file-dev->file)) {
1485          Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1486          return false;
1487       }
1488       Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1489    }
1490    if (block < dev->block_num) {
1491       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1492       Dmsg0(100, "bsf_dev 1\n");
1493       bsf_dev(dev, 1);
1494       Dmsg0(100, "fsf_dev 1\n");
1495       dev->fsf(1);
1496       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1497    }
1498    if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1499       /* Ignore errors as Bacula can read to the correct block */
1500       Dmsg1(100, "fsr %d\n", block-dev->block_num);
1501       return dev->fsr(block-dev->block_num);
1502    }
1503    return true;
1504 }
1505
1506
1507
1508 /*
1509  * Write an end of file on the device
1510  *   Returns: 0 on success
1511  *            non-zero on failure
1512  */
1513 int
1514 weof_dev(DEVICE *dev, int num)
1515 {
1516    struct mtop mt_com;
1517    int stat;
1518    Dmsg0(29, "weof_dev\n");
1519    
1520    if (dev->fd < 0) {
1521       dev->dev_errno = EBADF;
1522       Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1523       Emsg0(M_FATAL, 0, dev->errmsg);
1524       return -1;
1525    }
1526    dev->file_size = 0;
1527
1528    if (!dev->is_tape()) {
1529       return 0;
1530    }
1531    if (!dev->can_append()) {
1532       Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1533       Emsg0(M_FATAL, 0, dev->errmsg);
1534       return -1;
1535    }
1536       
1537    dev->state &= ~(ST_EOT | ST_EOF);  /* remove EOF/EOT flags */
1538    mt_com.mt_op = MTWEOF;
1539    mt_com.mt_count = num;
1540    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1541    if (stat == 0) {
1542       dev->block_num = 0;
1543       dev->file += num;
1544       dev->file_addr = 0;
1545    } else {
1546       berrno be;
1547       clrerror_dev(dev, MTWEOF);
1548       if (stat == -1) {
1549          Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1550             dev->print_name(), be.strerror());
1551        }
1552    }
1553    return stat;
1554 }
1555
1556 /*
1557  * Return string message with last error in English
1558  *  Be careful not to call this routine from within dev.c
1559  *  while editing an Mmsg() or you will end up in a recursive
1560  *  loop creating a Segmentation Violation.
1561  */
1562 char *
1563 strerror_dev(DEVICE *dev)
1564 {
1565    return dev->errmsg;
1566 }
1567
1568
1569 /*
1570  * If implemented in system, clear the tape
1571  * error status.
1572  */
1573 void
1574 clrerror_dev(DEVICE *dev, int func)
1575 {
1576    const char *msg = NULL;
1577    struct mtget mt_stat;
1578    char buf[100];
1579
1580    dev->dev_errno = errno;         /* save errno */
1581    if (errno == EIO) {
1582       dev->VolCatInfo.VolCatErrors++;
1583    }
1584
1585    if (!dev->is_tape()) {
1586       return;
1587    }
1588    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1589       switch (func) {
1590       case -1:
1591          Emsg0(M_ABORT, 0, _("Got ENOTTY on read/write!\n"));
1592          break;
1593       case MTWEOF:
1594          msg = "WTWEOF";
1595          dev->capabilities &= ~CAP_EOF; /* turn off feature */
1596          break;
1597 #ifdef MTEOM
1598       case MTEOM:
1599          msg = "WTEOM";
1600          dev->capabilities &= ~CAP_EOM; /* turn off feature */
1601          break;
1602 #endif
1603       case MTFSF:
1604          msg = "MTFSF";
1605          dev->capabilities &= ~CAP_FSF; /* turn off feature */
1606          break;
1607       case MTBSF:
1608          msg = "MTBSF";
1609          dev->capabilities &= ~CAP_BSF; /* turn off feature */
1610          break;
1611       case MTFSR:
1612          msg = "MTFSR";
1613          dev->capabilities &= ~CAP_FSR; /* turn off feature */
1614          break;
1615       case MTBSR:
1616          msg = "MTBSR";
1617          dev->capabilities &= ~CAP_BSR; /* turn off feature */
1618          break;
1619       case MTREW:
1620          msg = "MTREW";
1621          break;
1622 #ifdef MTSETBLK
1623       case MTSETBLK:
1624          msg = "MTSETBLK";
1625          break;
1626 #endif
1627 #ifdef MTSETBSIZ 
1628       case MTSETBSIZ:
1629          msg = "MTSETBSIZ";
1630          break;
1631 #endif
1632 #ifdef MTSRSZ
1633       case MTSRSZ:
1634          msg = "MTSRSZ";
1635          break;
1636 #endif
1637       default:
1638          bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1639          msg = buf;
1640          break;
1641       }
1642       if (msg != NULL) {
1643          dev->dev_errno = ENOSYS;
1644          Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1645          Emsg0(M_ERROR, 0, dev->errmsg);
1646       }
1647    }
1648    /* On some systems such as NetBSD, this clears all errors */
1649    ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1650
1651 /* Found on Linux */
1652 #ifdef MTIOCLRERR
1653 {
1654    struct mtop mt_com;
1655    mt_com.mt_op = MTIOCLRERR;
1656    mt_com.mt_count = 1;
1657    /* Clear any error condition on the tape */
1658    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1659    Dmsg0(200, "Did MTIOCLRERR\n");
1660 }
1661 #endif
1662
1663 /* Typically on FreeBSD */
1664 #ifdef MTIOCERRSTAT
1665 {
1666    /* Read and clear SCSI error status */
1667    union mterrstat mt_errstat;
1668    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1669       strerror(dev->dev_errno));
1670    ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1671 }
1672 #endif
1673
1674 /* Clear Subsystem Exception OSF1 */
1675 #ifdef MTCSE
1676 {
1677    struct mtop mt_com;
1678    mt_com.mt_op = MTCSE;
1679    mt_com.mt_count = 1;
1680    /* Clear any error condition on the tape */
1681    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1682    Dmsg0(200, "Did MTCSE\n");
1683 }
1684 #endif
1685 }
1686
1687 /*
1688  * Flush buffer contents
1689  *  No longer used.
1690  */
1691 int flush_dev(DEVICE *dev)
1692 {
1693    return 1;
1694 }
1695
1696 static void do_close(DEVICE *dev)
1697 {
1698
1699    Dmsg1(29, "really close_dev %s\n", dev->print_name());
1700    if (dev->fd >= 0) {
1701       close(dev->fd);
1702    }
1703
1704    if (!unmount_dev(dev, 1)) {
1705       Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1706    }
1707    
1708    /* Remove the last part file if it is empty */
1709    if (dev->num_parts > 0) {
1710       struct stat statp;
1711       POOL_MEM archive_name(PM_FNAME);
1712       dev->part = dev->num_parts;
1713       Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1714       make_spooled_dvd_filename(dev, archive_name);
1715       /* Check that the part file is empty */
1716       if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1717          Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1718          unlink(archive_name.c_str());
1719       }
1720    }
1721    
1722    /* Clean up device packet so it can be reused */
1723    dev->fd = -1;
1724    dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1725    dev->label_type = B_BACULA_LABEL;
1726    dev->file = dev->block_num = 0;
1727    dev->file_size = 0;
1728    dev->file_addr = 0;
1729    dev->part = 0;
1730    dev->num_parts = 0;
1731    dev->part_size = 0;
1732    dev->part_start = 0;
1733    dev->EndFile = dev->EndBlock = 0;
1734    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1735    free_volume(dev);
1736    memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1737    if (dev->tid) {
1738       stop_thread_timer(dev->tid);
1739       dev->tid = 0;
1740    }
1741    dev->use_count = 0;
1742    dev->openmode = 0;
1743 }
1744
1745 /*
1746  * Close the device
1747  */
1748 void DEVICE::close()
1749 {
1750    /*if (fd >= 0 && use_count == 1) {*/
1751    /* No need to check if fd >= 0: it is checked again
1752     * in do_close, and do_close MUST be called for volumes
1753     * splitted in parts, even if fd == -1. */
1754    if (use_count == 1) {
1755       do_close(this);
1756    } else if (use_count > 0) {
1757       use_count--;
1758    }
1759
1760 #ifdef FULL_DEBUG
1761    ASSERT(use_count >= 0);
1762 #endif
1763 }
1764
1765
1766 bool truncate_dev(DCR *dcr) /* We need the DCR for DVD-writing */
1767 {
1768    DEVICE *dev = dcr->dev;
1769
1770    Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1771    if (dev->is_tape()) {
1772       return true;                    /* we don't really truncate tapes */
1773       /* maybe we should rewind and write and eof ???? */
1774    }
1775    
1776    if (dev->is_dvd()) {
1777       return truncate_dvd_dev(dcr);
1778    }
1779    
1780    if (ftruncate(dev->fd, 0) != 0) {
1781       berrno be;
1782       Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
1783             dev->print_name(), be.strerror());
1784       return false;
1785    }
1786    return true;
1787 }
1788
1789 /* Return the resource name for the device */
1790 const char *DEVICE::name() const
1791 {
1792    return device->hdr.name;
1793 }
1794
1795 char *
1796 dev_vol_name(DEVICE *dev)
1797 {
1798    return dev->VolCatInfo.VolCatName;
1799 }
1800
1801 uint32_t dev_block(DEVICE *dev)
1802 {
1803    update_pos_dev(dev);
1804    return dev->block_num;
1805 }
1806
1807 uint32_t dev_file(DEVICE *dev)
1808 {
1809    update_pos_dev(dev);
1810    return dev->file;
1811 }
1812
1813 /*
1814  * Free memory allocated for the device
1815  */
1816 void
1817 term_dev(DEVICE *dev)
1818 {
1819    if (!dev) {
1820       dev->dev_errno = EBADF;
1821       Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1822       Emsg0(M_FATAL, 0, dev->errmsg);
1823       return;
1824    }
1825    Dmsg1(29, "term_dev: %s\n", dev->print_name());
1826    do_close(dev);
1827    if (dev->dev_name) {
1828       free_memory(dev->dev_name);
1829       dev->dev_name = NULL;
1830    }
1831    if (dev->prt_name) {
1832       free_memory(dev->prt_name);
1833       dev->prt_name = NULL;
1834    }
1835    if (dev->errmsg) {
1836       free_pool_memory(dev->errmsg);
1837       dev->errmsg = NULL;
1838    }
1839    pthread_mutex_destroy(&dev->mutex);
1840    pthread_cond_destroy(&dev->wait);
1841    pthread_cond_destroy(&dev->wait_next_vol);
1842    pthread_mutex_destroy(&dev->spool_mutex);
1843    rwl_destroy(&dev->lock);
1844    if (dev->attached_dcrs) {
1845       delete dev->attached_dcrs;
1846       dev->attached_dcrs = NULL;
1847    }
1848    if (dev->state & ST_MALLOC) {
1849       free_pool_memory((POOLMEM *)dev);
1850    }
1851 }
1852
1853 /*
1854  * This routine initializes the device wait timers
1855  */
1856 void init_device_wait_timers(DCR *dcr)
1857 {
1858    DEVICE *dev = dcr->dev;
1859    JCR *jcr = dcr->jcr;
1860
1861    /* ******FIXME******* put these on config variables */
1862    dev->min_wait = 60 * 60;
1863    dev->max_wait = 24 * 60 * 60;
1864    dev->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1865    dev->wait_sec = dev->min_wait;
1866    dev->rem_wait_sec = dev->wait_sec;
1867    dev->num_wait = 0;
1868    dev->poll = false;
1869    dev->BadVolName[0] = 0;
1870
1871    jcr->min_wait = 60 * 60;
1872    jcr->max_wait = 24 * 60 * 60;
1873    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1874    jcr->wait_sec = jcr->min_wait;
1875    jcr->rem_wait_sec = jcr->wait_sec;
1876    jcr->num_wait = 0;
1877
1878 }
1879
1880 void init_jcr_device_wait_timers(JCR *jcr)
1881 {
1882    /* ******FIXME******* put these on config variables */
1883    jcr->min_wait = 60 * 60;
1884    jcr->max_wait = 24 * 60 * 60;
1885    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1886    jcr->wait_sec = jcr->min_wait;
1887    jcr->rem_wait_sec = jcr->wait_sec;
1888    jcr->num_wait = 0;
1889 }
1890
1891
1892 /*
1893  * The dev timers are used for waiting on a particular device 
1894  *
1895  * Returns: true if time doubled
1896  *          false if max time expired
1897  */
1898 bool double_dev_wait_time(DEVICE *dev)
1899 {
1900    dev->wait_sec *= 2;               /* double wait time */
1901    if (dev->wait_sec > dev->max_wait) {   /* but not longer than maxtime */
1902       dev->wait_sec = dev->max_wait;
1903    }
1904    dev->num_wait++;
1905    dev->rem_wait_sec = dev->wait_sec;
1906    if (dev->num_wait >= dev->max_num_wait) {
1907       return false;
1908    }
1909    return true;
1910 }
1911
1912
1913 void set_os_device_parameters(DEVICE *dev)
1914 {
1915 #ifdef HAVE_LINUX_OS
1916    struct mtop mt_com;
1917    if (dev->min_block_size == dev->max_block_size &&
1918        dev->min_block_size == 0) {    /* variable block mode */
1919       mt_com.mt_op = MTSETBLK;
1920       mt_com.mt_count = 0;
1921       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1922          clrerror_dev(dev, MTSETBLK);
1923       }
1924       mt_com.mt_op = MTSETDRVBUFFER;
1925       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1926       if (!dev_cap(dev, CAP_TWOEOF)) {
1927          mt_com.mt_count |= MT_ST_TWO_FM;
1928       }
1929       if (dev_cap(dev, CAP_EOM)) {
1930          mt_com.mt_count |= MT_ST_FAST_MTEOM;
1931       }
1932       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1933          clrerror_dev(dev, MTSETBLK);
1934       }
1935    }
1936    return;
1937 #endif
1938
1939 #ifdef HAVE_NETBSD_OS
1940    struct mtop mt_com;
1941    if (dev->min_block_size == dev->max_block_size &&
1942        dev->min_block_size == 0) {    /* variable block mode */
1943       mt_com.mt_op = MTSETBSIZ;
1944       mt_com.mt_count = 0;
1945       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1946          clrerror_dev(dev, MTSETBSIZ);
1947       }
1948       /* Get notified at logical end of tape */
1949       mt_com.mt_op = MTEWARN;
1950       mt_com.mt_count = 1;
1951       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1952          clrerror_dev(dev, MTEWARN);
1953       }
1954    }
1955    return;
1956 #endif
1957
1958 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1959    struct mtop mt_com;
1960    if (dev->min_block_size == dev->max_block_size &&
1961        dev->min_block_size == 0) {    /* variable block mode */
1962       mt_com.mt_op = MTSETBSIZ;
1963       mt_com.mt_count = 0;
1964       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1965          clrerror_dev(dev, MTSETBSIZ);
1966       }
1967    }
1968    return;
1969 #endif
1970
1971 #ifdef HAVE_SUN_OS
1972    struct mtop mt_com;
1973    if (dev->min_block_size == dev->max_block_size &&
1974        dev->min_block_size == 0) {    /* variable block mode */
1975       mt_com.mt_op = MTSRSZ;
1976       mt_com.mt_count = 0;
1977       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1978          clrerror_dev(dev, MTSRSZ);
1979       }
1980    }
1981    return;
1982 #endif
1983 }
1984
1985 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1986 {
1987    return dev_cap(dev, CAP_MTIOCGET) && 
1988           ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1989           mt_stat->mt_fileno >= 0;
1990 }
1991
1992 static char *modes[] = {
1993    "CREATE_READ_WRITE",
1994    "OPEN_READ_WRITE",
1995    "OPEN_READ_ONLY",
1996    "OPEN_WRITE_ONLY"
1997 };
1998
1999
2000 static char *mode_to_str(int mode)  
2001 {
2002    return modes[mode-1];
2003 }