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