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