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