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