]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
- Fix bug that missed drive=nn specification.
[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->fd < 0) {
1092       dev->dev_errno = EBADF;
1093       Mmsg0(dev->errmsg, _("Bad call to offline_dev. Device not open\n"));
1094       Emsg0(M_FATAL, 0, dev->errmsg);
1095       return false;
1096    }
1097    if (!(dev->is_tape())) {
1098       return true;
1099    }
1100
1101    dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
1102    dev->block_num = dev->file = 0;
1103    dev->file_size = 0;
1104    dev->file_addr = 0;
1105    dev->part = 0;
1106 #ifdef MTUNLOCK
1107    mt_com.mt_op = MTUNLOCK;
1108    mt_com.mt_count = 1;
1109    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1110 #endif
1111    mt_com.mt_op = MTOFFL;
1112    mt_com.mt_count = 1;
1113    if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1114       berrno be;
1115       dev->dev_errno = errno;
1116       Mmsg2(dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1117          dev->print_name(), be.strerror());
1118       return false;
1119    }
1120    Dmsg1(100, "Offlined device %s\n", dev->print_name());
1121    return true;
1122 }
1123
1124 bool offline_or_rewind_dev(DEVICE *dev)
1125 {
1126    if (dev->fd < 0) {
1127       return false;
1128    }
1129    if (dev_cap(dev, CAP_OFFLINEUNMOUNT)) {
1130       return offline_dev(dev);
1131    } else {
1132    /*
1133     * Note, this rewind probably should not be here (it wasn't
1134     *  in prior versions of Bacula), but on FreeBSD, this is
1135     *  needed in the case the tape was "frozen" due to an error
1136     *  such as backspacing after writing and EOF. If it is not
1137     *  done, all future references to the drive get and I/O error.
1138     */
1139       clrerror_dev(dev, MTREW);
1140       return rewind_dev(dev);
1141    }
1142 }
1143
1144 /*
1145  * Foward space a file
1146  *   Returns: true  on success
1147  *            false on failure
1148  */
1149 bool DEVICE::fsf(int num)
1150 {
1151    struct mtget mt_stat;
1152    struct mtop mt_com;
1153    int stat = 0;
1154
1155    if (fd < 0) {
1156       dev_errno = EBADF;
1157       Mmsg0(errmsg, _("Bad call to fsf_dev. Device not open\n"));
1158       Emsg0(M_FATAL, 0, errmsg);
1159       return false;
1160    }
1161
1162    if (!is_tape()) {
1163       return true;
1164    }
1165    if (at_eot()) {
1166       dev_errno = 0;
1167       Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1168       return false;
1169    }
1170    if (at_eof()) {
1171       Dmsg0(200, "ST_EOF set on entry to FSF\n");
1172    }
1173
1174    Dmsg0(100, "fsf\n");
1175    block_num = 0;
1176    /*
1177     * If Fast forward space file is set, then we
1178     *  use MTFSF to forward space and MTIOCGET
1179     *  to get the file position. We assume that
1180     *  the SCSI driver will ensure that we do not
1181     *  forward space past the end of the medium.
1182     */
1183    if (dev_cap(this, CAP_FSF) && dev_cap(this, CAP_MTIOCGET) && dev_cap(this, CAP_FASTFSF)) {
1184       mt_com.mt_op = MTFSF;
1185       mt_com.mt_count = num;
1186       stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1187       if (stat < 0 || !dev_get_os_pos(this, &mt_stat)) {
1188          berrno be;
1189          set_eot();
1190          Dmsg0(200, "Set ST_EOT\n");
1191          clrerror_dev(this, MTFSF);
1192          Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1193             print_name(), be.strerror());
1194          Dmsg1(200, "%s", errmsg);
1195          return false;
1196       }
1197       Dmsg2(200, "fsf file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
1198       set_ateof();
1199       file = mt_stat.mt_fileno;
1200       return true;
1201
1202    /*
1203     * Here if CAP_FSF is set, and virtually all drives
1204     *  these days support it, we read a record, then forward
1205     *  space one file. Using this procedure, which is slow,
1206     *  is the only way we can be sure that we don't read
1207     *  two consecutive EOF marks, which means End of Data.
1208     */
1209    } else if (dev_cap(this, CAP_FSF)) {
1210       POOLMEM *rbuf;
1211       int rbuf_len;
1212       Dmsg0(200, "FSF has cap_fsf\n");
1213       if (max_block_size == 0) {
1214          rbuf_len = DEFAULT_BLOCK_SIZE;
1215       } else {
1216          rbuf_len = max_block_size;
1217       }
1218       rbuf = get_memory(rbuf_len);
1219       mt_com.mt_op = MTFSF;
1220       mt_com.mt_count = 1;
1221       while (num-- && !at_eot()) {
1222          Dmsg0(100, "Doing read before fsf\n");
1223          if ((stat = read(fd, (char *)rbuf, rbuf_len)) < 0) {
1224             if (errno == ENOMEM) {     /* tape record exceeds buf len */
1225                stat = rbuf_len;        /* This is OK */
1226             /*
1227              * On IBM drives, they return ENOSPC at EOM
1228              *  instead of EOF status
1229              */
1230             } else if (at_eof() && errno == ENOSPC) {
1231                stat = 0;
1232             } else {
1233                berrno be;
1234                set_eot();
1235                clrerror_dev(this, -1);
1236                Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1237                   be.strerror());
1238                Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1239                   print_name(), be.strerror());
1240                Dmsg1(100, "%s", errmsg);
1241                break;
1242             }
1243          }
1244          if (stat == 0) {                /* EOF */
1245             update_pos_dev(this);
1246             Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1247             /* Two reads of zero means end of tape */
1248             if (at_eof()) {
1249                set_eot();
1250                Dmsg0(100, "Set ST_EOT\n");
1251                break;
1252             } else {
1253                set_ateof();
1254                continue;
1255             }
1256          } else {                        /* Got data */
1257             clear_eot();
1258             clear_eof();
1259          }
1260
1261          Dmsg0(100, "Doing MTFSF\n");
1262          stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1263          if (stat < 0) {                 /* error => EOT */
1264             berrno be;
1265             set_eot();
1266             Dmsg0(100, "Set ST_EOT\n");
1267             clrerror_dev(this, MTFSF);
1268             Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1269                print_name(), be.strerror());
1270             Dmsg0(100, "Got < 0 for MTFSF\n");
1271             Dmsg1(100, "%s", errmsg);
1272          } else {
1273             set_ateof();
1274          }
1275       }
1276       free_memory(rbuf);
1277
1278    /*
1279     * No FSF, so use FSR to simulate it
1280     */
1281    } else {
1282       Dmsg0(200, "Doing FSR for FSF\n");
1283       while (num-- && !at_eot()) {
1284          fsr(INT32_MAX);    /* returns -1 on EOF or EOT */
1285       }
1286       if (at_eot()) {
1287          dev_errno = 0;
1288          Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1289          stat = -1;
1290       } else {
1291          stat = 0;
1292       }
1293    }
1294    update_pos_dev(this);
1295    Dmsg1(200, "Return %d from FSF\n", stat);
1296    if (at_eof())
1297       Dmsg0(200, "ST_EOF set on exit FSF\n");
1298    if (at_eot())
1299       Dmsg0(200, "ST_EOT set on exit FSF\n");
1300    Dmsg1(200, "Return from FSF file=%d\n", file);
1301    return stat == 0;
1302 }
1303
1304 /*
1305  * Backward space a file
1306  *  Returns: false on failure
1307  *           true  on success
1308  */
1309 bool
1310 bsf_dev(DEVICE *dev, int num)
1311 {
1312    struct mtop mt_com;
1313    int stat;
1314
1315    if (dev->fd < 0) {
1316       dev->dev_errno = EBADF;
1317       Mmsg0(dev->errmsg, _("Bad call to bsf_dev. Device not open\n"));
1318       Emsg0(M_FATAL, 0, dev->errmsg);
1319       return false;
1320    }
1321
1322    if (!dev->is_tape()) {
1323       Mmsg1(dev->errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1324          dev->print_name());
1325       return false;
1326    }
1327    Dmsg0(29, "bsf_dev\n");
1328    dev->state &= ~(ST_EOT|ST_EOF);
1329    dev->file -= num;
1330    dev->file_addr = 0;
1331    dev->file_size = 0;
1332    mt_com.mt_op = MTBSF;
1333    mt_com.mt_count = num;
1334    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1335    if (stat < 0) {
1336       berrno be;
1337       clrerror_dev(dev, MTBSF);
1338       Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1339          dev->print_name(), be.strerror());
1340    }
1341    update_pos_dev(dev);
1342    return stat == 0;
1343 }
1344
1345
1346 /*
1347  * Foward space num records
1348  *  Returns: false on failure
1349  *           true  on success
1350  */
1351 bool DEVICE::fsr(int num)
1352 {
1353    struct mtop mt_com;
1354    int stat;
1355
1356    if (fd < 0) {
1357       dev_errno = EBADF;
1358       Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1359       Emsg0(M_FATAL, 0, errmsg);
1360       return false;
1361    }
1362
1363    if (!is_tape()) {
1364       return false;
1365    }
1366    if (!dev_cap(this, CAP_FSR)) {
1367       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1368       return false;
1369    }
1370
1371    Dmsg1(29, "fsr %d\n", num);
1372    mt_com.mt_op = MTFSR;
1373    mt_com.mt_count = num;
1374    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1375    if (stat == 0) {
1376       clear_eof();
1377       block_num += num;
1378    } else {
1379       berrno be;
1380       struct mtget mt_stat;
1381       clrerror_dev(this, MTFSR);
1382       Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1383       if (dev_get_os_pos(this, &mt_stat)) {
1384          Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1385             block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1386          file = mt_stat.mt_fileno;
1387          block_num = mt_stat.mt_blkno;
1388       } else {
1389          if (at_eof()) {
1390             set_eot();
1391          } else {
1392             set_ateof();
1393          }
1394       }
1395       Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1396          num, print_name(), be.strerror());
1397    }
1398    update_pos_dev(this);
1399    return stat == 0;
1400 }
1401
1402 /*
1403  * Backward space a record
1404  *   Returns:  false on failure
1405  *             true  on success
1406  */
1407 bool
1408 bsr_dev(DEVICE *dev, int num)
1409 {
1410    struct mtop mt_com;
1411    int stat;
1412
1413    if (dev->fd < 0) {
1414       dev->dev_errno = EBADF;
1415       Mmsg0(dev->errmsg, _("Bad call to bsr_dev. Device not open\n"));
1416       Emsg0(M_FATAL, 0, dev->errmsg);
1417       return false;
1418    }
1419
1420    if (!dev->is_tape()) {
1421       return false;
1422    }
1423
1424    if (!dev_cap(dev, CAP_BSR)) {
1425       Mmsg1(dev->errmsg, _("ioctl MTBSR not permitted on %s.\n"), dev->print_name());
1426       return false;
1427    }
1428
1429    Dmsg0(29, "bsr_dev\n");
1430    dev->block_num -= num;
1431    dev->state &= ~(ST_EOF|ST_EOT|ST_EOF);
1432    mt_com.mt_op = MTBSR;
1433    mt_com.mt_count = num;
1434    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1435    if (stat < 0) {
1436       berrno be;
1437       clrerror_dev(dev, MTBSR);
1438       Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1439          dev->print_name(), be.strerror());
1440    }
1441    update_pos_dev(dev);
1442    return stat == 0;
1443 }
1444
1445 /*
1446  * Reposition the device to file, block
1447  * Returns: false on failure
1448  *          true  on success
1449  */
1450 bool
1451 reposition_dev(DEVICE *dev, uint32_t file, uint32_t block)
1452 {
1453    if (dev->fd < 0) {
1454       dev->dev_errno = EBADF;
1455       Mmsg0(dev->errmsg, _("Bad call to reposition_dev. Device not open\n"));
1456       Emsg0(M_FATAL, 0, dev->errmsg);
1457       return false;
1458    }
1459
1460    if (!dev->is_tape()) {
1461       off_t pos = (((off_t)file)<<32) + (off_t)block;
1462       Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1463       if (lseek_dev(dev, pos, SEEK_SET) == (off_t)-1) {
1464          berrno be;
1465          dev->dev_errno = errno;
1466          Mmsg2(dev->errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1467             dev->print_name(), be.strerror());
1468          return false;
1469       }
1470       dev->file = file;
1471       dev->block_num = block;
1472       dev->file_addr = pos;
1473       return true;
1474    }
1475    Dmsg4(100, "reposition_dev from %u:%u to %u:%u\n",
1476       dev->file, dev->block_num, file, block);
1477    if (file < dev->file) {
1478       Dmsg0(100, "Rewind_dev\n");
1479       if (!rewind_dev(dev)) {
1480          return false;
1481       }
1482    }
1483    if (file > dev->file) {
1484       Dmsg1(100, "fsf %d\n", file-dev->file);
1485       if (!dev->fsf(file-dev->file)) {
1486          Dmsg1(100, "fsf failed! ERR=%s\n", strerror_dev(dev));
1487          return false;
1488       }
1489       Dmsg2(100, "wanted_file=%d at_file=%d\n", file, dev->file);
1490    }
1491    if (block < dev->block_num) {
1492       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1493       Dmsg0(100, "bsf_dev 1\n");
1494       bsf_dev(dev, 1);
1495       Dmsg0(100, "fsf_dev 1\n");
1496       dev->fsf(1);
1497       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", block, dev->block_num);
1498    }
1499    if (dev_cap(dev, CAP_POSITIONBLOCKS) && block > dev->block_num) {
1500       /* Ignore errors as Bacula can read to the correct block */
1501       Dmsg1(100, "fsr %d\n", block-dev->block_num);
1502       return dev->fsr(block-dev->block_num);
1503    }
1504    return true;
1505 }
1506
1507
1508
1509 /*
1510  * Write an end of file on the device
1511  *   Returns: 0 on success
1512  *            non-zero on failure
1513  */
1514 int
1515 weof_dev(DEVICE *dev, int num)
1516 {
1517    struct mtop mt_com;
1518    int stat;
1519    Dmsg0(29, "weof_dev\n");
1520    
1521    if (dev->fd < 0) {
1522       dev->dev_errno = EBADF;
1523       Mmsg0(dev->errmsg, _("Bad call to weof_dev. Device not open\n"));
1524       Emsg0(M_FATAL, 0, dev->errmsg);
1525       return -1;
1526    }
1527    dev->file_size = 0;
1528
1529    if (!dev->is_tape()) {
1530       return 0;
1531    }
1532    if (!dev->can_append()) {
1533       Mmsg0(dev->errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1534       Emsg0(M_FATAL, 0, dev->errmsg);
1535       return -1;
1536    }
1537       
1538    dev->state &= ~(ST_EOT | ST_EOF);  /* remove EOF/EOT flags */
1539    mt_com.mt_op = MTWEOF;
1540    mt_com.mt_count = num;
1541    stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1542    if (stat == 0) {
1543       dev->block_num = 0;
1544       dev->file += num;
1545       dev->file_addr = 0;
1546    } else {
1547       berrno be;
1548       clrerror_dev(dev, MTWEOF);
1549       if (stat == -1) {
1550          Mmsg2(dev->errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1551             dev->print_name(), be.strerror());
1552        }
1553    }
1554    return stat;
1555 }
1556
1557 /*
1558  * Return string message with last error in English
1559  *  Be careful not to call this routine from within dev.c
1560  *  while editing an Mmsg() or you will end up in a recursive
1561  *  loop creating a Segmentation Violation.
1562  */
1563 char *
1564 strerror_dev(DEVICE *dev)
1565 {
1566    return dev->errmsg;
1567 }
1568
1569
1570 /*
1571  * If implemented in system, clear the tape
1572  * error status.
1573  */
1574 void
1575 clrerror_dev(DEVICE *dev, int func)
1576 {
1577    const char *msg = NULL;
1578    struct mtget mt_stat;
1579    char buf[100];
1580
1581    dev->dev_errno = errno;         /* save errno */
1582    if (errno == EIO) {
1583       dev->VolCatInfo.VolCatErrors++;
1584    }
1585
1586    if (!dev->is_tape()) {
1587       return;
1588    }
1589    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1590       switch (func) {
1591       case -1:
1592          Emsg0(M_ABORT, 0, _("Got ENOTTY on read/write!\n"));
1593          break;
1594       case MTWEOF:
1595          msg = "WTWEOF";
1596          dev->capabilities &= ~CAP_EOF; /* turn off feature */
1597          break;
1598 #ifdef MTEOM
1599       case MTEOM:
1600          msg = "WTEOM";
1601          dev->capabilities &= ~CAP_EOM; /* turn off feature */
1602          break;
1603 #endif
1604       case MTFSF:
1605          msg = "MTFSF";
1606          dev->capabilities &= ~CAP_FSF; /* turn off feature */
1607          break;
1608       case MTBSF:
1609          msg = "MTBSF";
1610          dev->capabilities &= ~CAP_BSF; /* turn off feature */
1611          break;
1612       case MTFSR:
1613          msg = "MTFSR";
1614          dev->capabilities &= ~CAP_FSR; /* turn off feature */
1615          break;
1616       case MTBSR:
1617          msg = "MTBSR";
1618          dev->capabilities &= ~CAP_BSR; /* turn off feature */
1619          break;
1620       case MTREW:
1621          msg = "MTREW";
1622          break;
1623 #ifdef MTSETBLK
1624       case MTSETBLK:
1625          msg = "MTSETBLK";
1626          break;
1627 #endif
1628 #ifdef MTSETBSIZ 
1629       case MTSETBSIZ:
1630          msg = "MTSETBSIZ";
1631          break;
1632 #endif
1633 #ifdef MTSRSZ
1634       case MTSRSZ:
1635          msg = "MTSRSZ";
1636          break;
1637 #endif
1638       default:
1639          bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1640          msg = buf;
1641          break;
1642       }
1643       if (msg != NULL) {
1644          dev->dev_errno = ENOSYS;
1645          Mmsg1(dev->errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1646          Emsg0(M_ERROR, 0, dev->errmsg);
1647       }
1648    }
1649    /* On some systems such as NetBSD, this clears all errors */
1650    ioctl(dev->fd, MTIOCGET, (char *)&mt_stat);
1651
1652 /* Found on Linux */
1653 #ifdef MTIOCLRERR
1654 {
1655    struct mtop mt_com;
1656    mt_com.mt_op = MTIOCLRERR;
1657    mt_com.mt_count = 1;
1658    /* Clear any error condition on the tape */
1659    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1660    Dmsg0(200, "Did MTIOCLRERR\n");
1661 }
1662 #endif
1663
1664 /* Typically on FreeBSD */
1665 #ifdef MTIOCERRSTAT
1666 {
1667    /* Read and clear SCSI error status */
1668    union mterrstat mt_errstat;
1669    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev->dev_errno,
1670       strerror(dev->dev_errno));
1671    ioctl(dev->fd, MTIOCERRSTAT, (char *)&mt_errstat);
1672 }
1673 #endif
1674
1675 /* Clear Subsystem Exception OSF1 */
1676 #ifdef MTCSE
1677 {
1678    struct mtop mt_com;
1679    mt_com.mt_op = MTCSE;
1680    mt_com.mt_count = 1;
1681    /* Clear any error condition on the tape */
1682    ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
1683    Dmsg0(200, "Did MTCSE\n");
1684 }
1685 #endif
1686 }
1687
1688 /*
1689  * Flush buffer contents
1690  *  No longer used.
1691  */
1692 int flush_dev(DEVICE *dev)
1693 {
1694    return 1;
1695 }
1696
1697 static void do_close(DEVICE *dev)
1698 {
1699
1700    Dmsg1(29, "really close_dev %s\n", dev->print_name());
1701    if (dev->fd >= 0) {
1702       close(dev->fd);
1703    }
1704
1705    if (!unmount_dev(dev, 1)) {
1706       Dmsg1(0, "Cannot unmount device %s.\n", dev->print_name());
1707    }
1708    
1709    /* Remove the last part file if it is empty */
1710    if (dev->num_parts > 0) {
1711       struct stat statp;
1712       POOL_MEM archive_name(PM_FNAME);
1713       dev->part = dev->num_parts;
1714       Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", dev->VolCatInfo.VolCatName);
1715       make_spooled_dvd_filename(dev, archive_name);
1716       /* Check that the part file is empty */
1717       if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1718          Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1719          unlink(archive_name.c_str());
1720       }
1721    }
1722    
1723    /* Clean up device packet so it can be reused */
1724    dev->fd = -1;
1725    dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1726    dev->label_type = B_BACULA_LABEL;
1727    dev->file = dev->block_num = 0;
1728    dev->file_size = 0;
1729    dev->file_addr = 0;
1730    dev->part = 0;
1731    dev->num_parts = 0;
1732    dev->part_size = 0;
1733    dev->part_start = 0;
1734    dev->EndFile = dev->EndBlock = 0;
1735    memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
1736    free_volume(dev);
1737    memset(&dev->VolHdr, 0, sizeof(dev->VolHdr));
1738    if (dev->tid) {
1739       stop_thread_timer(dev->tid);
1740       dev->tid = 0;
1741    }
1742    dev->use_count = 0;
1743    dev->openmode = 0;
1744 }
1745
1746 /*
1747  * Close the device
1748  */
1749 void DEVICE::close()
1750 {
1751    /*if (fd >= 0 && use_count == 1) {*/
1752    /* No need to check if fd >= 0: it is checked again
1753     * in do_close, and do_close MUST be called for volumes
1754     * splitted in parts, even if fd == -1. */
1755    if (use_count == 1) {
1756       do_close(this);
1757    } else if (use_count > 0) {
1758       use_count--;
1759    }
1760
1761 #ifdef FULL_DEBUG
1762    ASSERT(use_count >= 0);
1763 #endif
1764 }
1765
1766
1767 bool truncate_dev(DCR *dcr) /* We need the DCR for DVD-writing */
1768 {
1769    DEVICE *dev = dcr->dev;
1770
1771    Dmsg1(100, "truncate_dev %s\n", dev->print_name());
1772    if (dev->is_tape()) {
1773       return true;                    /* we don't really truncate tapes */
1774       /* maybe we should rewind and write and eof ???? */
1775    }
1776    
1777    if (dev->is_dvd()) {
1778       return truncate_dvd_dev(dcr);
1779    }
1780    
1781    if (ftruncate(dev->fd, 0) != 0) {
1782       berrno be;
1783       Mmsg2(dev->errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
1784             dev->print_name(), be.strerror());
1785       return false;
1786    }
1787    return true;
1788 }
1789
1790 /* Return the resource name for the device */
1791 const char *DEVICE::name() const
1792 {
1793    return device->hdr.name;
1794 }
1795
1796 char *
1797 dev_vol_name(DEVICE *dev)
1798 {
1799    return dev->VolCatInfo.VolCatName;
1800 }
1801
1802 uint32_t dev_block(DEVICE *dev)
1803 {
1804    update_pos_dev(dev);
1805    return dev->block_num;
1806 }
1807
1808 uint32_t dev_file(DEVICE *dev)
1809 {
1810    update_pos_dev(dev);
1811    return dev->file;
1812 }
1813
1814 /*
1815  * Free memory allocated for the device
1816  */
1817 void
1818 term_dev(DEVICE *dev)
1819 {
1820    if (!dev) {
1821       dev->dev_errno = EBADF;
1822       Mmsg0(dev->errmsg, _("Bad call to term_dev. Device not open\n"));
1823       Emsg0(M_FATAL, 0, dev->errmsg);
1824       return;
1825    }
1826    Dmsg1(29, "term_dev: %s\n", dev->print_name());
1827    do_close(dev);
1828    if (dev->dev_name) {
1829       free_memory(dev->dev_name);
1830       dev->dev_name = NULL;
1831    }
1832    if (dev->prt_name) {
1833       free_memory(dev->prt_name);
1834       dev->prt_name = NULL;
1835    }
1836    if (dev->errmsg) {
1837       free_pool_memory(dev->errmsg);
1838       dev->errmsg = NULL;
1839    }
1840    pthread_mutex_destroy(&dev->mutex);
1841    pthread_cond_destroy(&dev->wait);
1842    pthread_cond_destroy(&dev->wait_next_vol);
1843    pthread_mutex_destroy(&dev->spool_mutex);
1844    rwl_destroy(&dev->lock);
1845    if (dev->attached_dcrs) {
1846       delete dev->attached_dcrs;
1847       dev->attached_dcrs = NULL;
1848    }
1849    if (dev->state & ST_MALLOC) {
1850       free_pool_memory((POOLMEM *)dev);
1851    }
1852 }
1853
1854 /*
1855  * This routine initializes the device wait timers
1856  */
1857 void init_device_wait_timers(DCR *dcr)
1858 {
1859    DEVICE *dev = dcr->dev;
1860    JCR *jcr = dcr->jcr;
1861
1862    /* ******FIXME******* put these on config variables */
1863    dev->min_wait = 60 * 60;
1864    dev->max_wait = 24 * 60 * 60;
1865    dev->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1866    dev->wait_sec = dev->min_wait;
1867    dev->rem_wait_sec = dev->wait_sec;
1868    dev->num_wait = 0;
1869    dev->poll = false;
1870    dev->BadVolName[0] = 0;
1871
1872    jcr->min_wait = 60 * 60;
1873    jcr->max_wait = 24 * 60 * 60;
1874    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1875    jcr->wait_sec = jcr->min_wait;
1876    jcr->rem_wait_sec = jcr->wait_sec;
1877    jcr->num_wait = 0;
1878
1879 }
1880
1881 void init_jcr_device_wait_timers(JCR *jcr)
1882 {
1883    /* ******FIXME******* put these on config variables */
1884    jcr->min_wait = 60 * 60;
1885    jcr->max_wait = 24 * 60 * 60;
1886    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
1887    jcr->wait_sec = jcr->min_wait;
1888    jcr->rem_wait_sec = jcr->wait_sec;
1889    jcr->num_wait = 0;
1890 }
1891
1892
1893 /*
1894  * The dev timers are used for waiting on a particular device 
1895  *
1896  * Returns: true if time doubled
1897  *          false if max time expired
1898  */
1899 bool double_dev_wait_time(DEVICE *dev)
1900 {
1901    dev->wait_sec *= 2;               /* double wait time */
1902    if (dev->wait_sec > dev->max_wait) {   /* but not longer than maxtime */
1903       dev->wait_sec = dev->max_wait;
1904    }
1905    dev->num_wait++;
1906    dev->rem_wait_sec = dev->wait_sec;
1907    if (dev->num_wait >= dev->max_num_wait) {
1908       return false;
1909    }
1910    return true;
1911 }
1912
1913
1914 void set_os_device_parameters(DEVICE *dev)
1915 {
1916 #ifdef HAVE_LINUX_OS
1917    struct mtop mt_com;
1918    if (dev->min_block_size == dev->max_block_size &&
1919        dev->min_block_size == 0) {    /* variable block mode */
1920       mt_com.mt_op = MTSETBLK;
1921       mt_com.mt_count = 0;
1922       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1923          clrerror_dev(dev, MTSETBLK);
1924       }
1925       mt_com.mt_op = MTSETDRVBUFFER;
1926       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
1927       if (!dev_cap(dev, CAP_TWOEOF)) {
1928          mt_com.mt_count |= MT_ST_TWO_FM;
1929       }
1930       if (dev_cap(dev, CAP_EOM)) {
1931          mt_com.mt_count |= MT_ST_FAST_MTEOM;
1932       }
1933       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1934          clrerror_dev(dev, MTSETBLK);
1935       }
1936    }
1937    return;
1938 #endif
1939
1940 #ifdef HAVE_NETBSD_OS
1941    struct mtop mt_com;
1942    if (dev->min_block_size == dev->max_block_size &&
1943        dev->min_block_size == 0) {    /* variable block mode */
1944       mt_com.mt_op = MTSETBSIZ;
1945       mt_com.mt_count = 0;
1946       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1947          clrerror_dev(dev, MTSETBSIZ);
1948       }
1949       /* Get notified at logical end of tape */
1950       mt_com.mt_op = MTEWARN;
1951       mt_com.mt_count = 1;
1952       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1953          clrerror_dev(dev, MTEWARN);
1954       }
1955    }
1956    return;
1957 #endif
1958
1959 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
1960    struct mtop mt_com;
1961    if (dev->min_block_size == dev->max_block_size &&
1962        dev->min_block_size == 0) {    /* variable block mode */
1963       mt_com.mt_op = MTSETBSIZ;
1964       mt_com.mt_count = 0;
1965       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1966          clrerror_dev(dev, MTSETBSIZ);
1967       }
1968    }
1969    return;
1970 #endif
1971
1972 #ifdef HAVE_SUN_OS
1973    struct mtop mt_com;
1974    if (dev->min_block_size == dev->max_block_size &&
1975        dev->min_block_size == 0) {    /* variable block mode */
1976       mt_com.mt_op = MTSRSZ;
1977       mt_com.mt_count = 0;
1978       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
1979          clrerror_dev(dev, MTSRSZ);
1980       }
1981    }
1982    return;
1983 #endif
1984 }
1985
1986 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
1987 {
1988    return dev_cap(dev, CAP_MTIOCGET) && 
1989           ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
1990           mt_stat->mt_fileno >= 0;
1991 }
1992
1993 static char *modes[] = {
1994    "CREATE_READ_WRITE",
1995    "OPEN_READ_WRITE",
1996    "OPEN_READ_ONLY",
1997    "OPEN_WRITE_ONLY"
1998 };
1999
2000
2001 static char *mode_to_str(int mode)  
2002 {
2003    return modes[mode-1];
2004 }