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