]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
Fix dvd rewind
[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
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    Dmsg1(400, "Allocate dev=%s\n", dev->print_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    /* Link the dev and device structures together */
166    dev->device = device;
167    device->dev = dev;
168
169    if (dev->is_fifo()) {
170       dev->capabilities |= CAP_STREAM; /* set stream device */
171    }
172
173    /* If the device requires mount :
174     * - Check that the mount point is available 
175     * - Check that (un)mount commands are defined
176     */
177    if ((dev->is_file() || dev->is_dvd()) && dev->requires_mount()) {
178       if (!device->mount_point || stat(device->mount_point, &statp) < 0) {
179          berrno be;
180          dev->dev_errno = errno;
181          Jmsg2(jcr, M_ERROR, 0, _("Unable to stat mount point %s: ERR=%s\n"), 
182             device->mount_point, be.strerror());
183          return NULL;
184       }
185    }
186    if (dev->is_dvd()) {
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    }
194
195    if (dev->max_block_size > 1000000) {
196       Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
197          dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
198       dev->max_block_size = 0;
199    }
200    if (dev->max_block_size % TAPE_BSIZE != 0) {
201       Jmsg2(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size.\n"),
202          dev->max_block_size, dev->print_name());
203    }
204
205    dev->errmsg = get_pool_memory(PM_EMSG);
206    *dev->errmsg = 0;
207
208    if ((errstat = pthread_mutex_init(&dev->mutex, NULL)) != 0) {
209       berrno be;
210       dev->dev_errno = errstat;
211       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
212       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
213    }
214    if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
215       berrno be;
216       dev->dev_errno = errstat;
217       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
218       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
219    }
220    if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
221       berrno be;
222       dev->dev_errno = errstat;
223       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.strerror(errstat));
224       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
225    }
226    if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
227       berrno be;
228       dev->dev_errno = errstat;
229       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
230       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
231    }
232    if ((errstat = rwl_init(&dev->lock)) != 0) {
233       berrno be;
234       dev->dev_errno = errstat;
235       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.strerror(errstat));
236       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
237    }
238
239    dev->clear_opened();
240    dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
241    Dmsg2(29, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
242    
243    return dev;
244 }
245
246 /*
247  * Open the device with the operating system and
248  * initialize buffer pointers.
249  *
250  * Returns:  -1  on error
251  *           fd  on success
252  *
253  * Note, for a tape, the VolName is the name we give to the
254  *    volume (not really used here), but for a file, the
255  *    VolName represents the name of the file to be created/opened.
256  *    In the case of a file, the full name is the device name
257  *    (archive_name) with the VolName concatenated.
258  */
259 int
260 DEVICE::open(DCR *dcr, int omode)
261 {
262    int preserve = 0;
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         clear_opened();
269         Dmsg0(100, "Close fd for mode change.\n");
270         preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
271       }
272    }
273    if (dcr) {
274       bstrncpy(VolCatInfo.VolCatName, dcr->VolumeName, sizeof(VolCatInfo.VolCatName));
275    }
276
277    Dmsg4(29, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
278          print_name(), VolCatInfo.VolCatName, mode_to_str(omode));
279    state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
280    label_type = B_BACULA_LABEL;
281    if (is_tape() || is_fifo()) {
282       open_tape_device(dcr, omode);
283    } else if (is_dvd()) {
284       Dmsg1(100, "call open_dvd_device mode=%s\n", mode_to_str(omode));
285       open_dvd_device(dcr, omode);
286    } else {
287       Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
288       open_file_device(dcr, omode);
289    }
290    state |= preserve;                 /* reset any important state info */
291    Dmsg1(100, "preserve=0x%x\n", preserve);
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(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() || is_dvd()) {
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    clear_eof();         /* remove EOF flag */
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          set_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(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(-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(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(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(-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(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    }
1287    if (at_eot()) {
1288       Dmsg0(200, "ST_EOT set on exit FSF\n");
1289    }
1290    Dmsg1(200, "Return from FSF file=%d\n", file);
1291    return stat == 0;
1292 }
1293
1294 /*
1295  * Backward space a file
1296  *  Returns: false on failure
1297  *           true  on success
1298  */
1299 bool DEVICE::bsf(int num)
1300 {
1301    struct mtop mt_com;
1302    int stat;
1303
1304    if (fd < 0) {
1305       dev_errno = EBADF;
1306       Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
1307       Emsg0(M_FATAL, 0, errmsg);
1308       return false;
1309    }
1310
1311    if (!is_tape()) {
1312       Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1313          print_name());
1314       return false;
1315    }
1316    Dmsg0(29, "bsf\n");
1317    clear_eot();
1318    clear_eof();
1319    file -= num;
1320    file_addr = 0;
1321    file_size = 0;
1322    mt_com.mt_op = MTBSF;
1323    mt_com.mt_count = num;
1324    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1325    if (stat < 0) {
1326       berrno be;
1327       clrerror(MTBSF);
1328       Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1329          print_name(), be.strerror());
1330    }
1331    update_pos_dev(this);
1332    return stat == 0;
1333 }
1334
1335
1336 /*
1337  * Foward space num records
1338  *  Returns: false on failure
1339  *           true  on success
1340  */
1341 bool DEVICE::fsr(int num)
1342 {
1343    struct mtop mt_com;
1344    int stat;
1345
1346    if (fd < 0) {
1347       dev_errno = EBADF;
1348       Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1349       Emsg0(M_FATAL, 0, errmsg);
1350       return false;
1351    }
1352
1353    if (!is_tape()) {
1354       return false;
1355    }
1356    if (!has_cap(CAP_FSR)) {
1357       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1358       return false;
1359    }
1360
1361    Dmsg1(29, "fsr %d\n", num);
1362    mt_com.mt_op = MTFSR;
1363    mt_com.mt_count = num;
1364    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1365    if (stat == 0) {
1366       clear_eof();
1367       block_num += num;
1368    } else {
1369       berrno be;
1370       struct mtget mt_stat;
1371       clrerror(MTFSR);
1372       Dmsg1(100, "FSF fail: ERR=%s\n", be.strerror());
1373       if (dev_get_os_pos(this, &mt_stat)) {
1374          Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1375             block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1376          file = mt_stat.mt_fileno;
1377          block_num = mt_stat.mt_blkno;
1378       } else {
1379          if (at_eof()) {
1380             set_eot();
1381          } else {
1382             set_ateof();
1383          }
1384       }
1385       Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1386          num, print_name(), be.strerror());
1387    }
1388    update_pos_dev(this);
1389    return stat == 0;
1390 }
1391
1392 /*
1393  * Backward space a record
1394  *   Returns:  false on failure
1395  *             true  on success
1396  */
1397 bool DEVICE::bsr(int num)
1398 {
1399    struct mtop mt_com;
1400    int stat;
1401
1402    if (fd < 0) {
1403       dev_errno = EBADF;
1404       Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
1405       Emsg0(M_FATAL, 0, errmsg);
1406       return false;
1407    }
1408
1409    if (!is_tape()) {
1410       return false;
1411    }
1412
1413    if (!has_cap(CAP_BSR)) {
1414       Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
1415       return false;
1416    }
1417
1418    Dmsg0(29, "bsr_dev\n");
1419    block_num -= num;
1420    clear_eof();
1421    clear_eot();
1422    mt_com.mt_op = MTBSR;
1423    mt_com.mt_count = num;
1424    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1425    if (stat < 0) {
1426       berrno be;
1427       clrerror(MTBSR);
1428       Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1429          print_name(), be.strerror());
1430    }
1431    update_pos_dev(this);
1432    return stat == 0;
1433 }
1434
1435 /*
1436  * Reposition the device to file, block
1437  * Returns: false on failure
1438  *          true  on success
1439  */
1440 bool DEVICE::reposition(uint32_t rfile, uint32_t rblock)
1441 {
1442    if (fd < 0) {
1443       dev_errno = EBADF;
1444       Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
1445       Emsg0(M_FATAL, 0, errmsg);
1446       return false;
1447    }
1448
1449    if (!is_tape()) {
1450       off_t pos = (((off_t)rfile)<<32) + (off_t)rblock;
1451       Dmsg1(100, "===== lseek_dev to %d\n", (int)pos);
1452       if (lseek_dev(this, pos, SEEK_SET) == (off_t)-1) {
1453          berrno be;
1454          dev_errno = errno;
1455          Mmsg2(errmsg, _("lseek_dev error on %s. ERR=%s.\n"),
1456             print_name(), be.strerror());
1457          return false;
1458       }
1459       file = rfile;
1460       block_num = rblock;
1461       file_addr = pos;
1462       return true;
1463    }
1464    Dmsg4(100, "reposition from %u:%u to %u:%u\n",
1465       file, block_num, rfile, rblock);
1466    if (rfile < file) {
1467       Dmsg0(100, "Rewind\n");
1468       if (!rewind(NULL)) {
1469          return false;
1470       }
1471    }
1472    if (rfile > file) {
1473       Dmsg1(100, "fsf %d\n", rfile-file);
1474       if (!fsf(rfile-file)) {
1475          Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
1476          return false;
1477       }
1478       Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
1479    }
1480    if (rblock < block_num) {
1481       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1482       Dmsg0(100, "bsf 1\n");
1483       bsf(1);
1484       Dmsg0(100, "fsf_dev 1\n");
1485       fsf(1);
1486       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1487    }
1488    if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
1489       /* Ignore errors as Bacula can read to the correct block */
1490       Dmsg1(100, "fsr %d\n", rblock-block_num);
1491       return fsr(rblock-block_num);
1492    }
1493    return true;
1494 }
1495
1496
1497
1498 /*
1499  * Write an end of file on the device
1500  *   Returns: true on success
1501  *            false on failure
1502  */
1503 bool DEVICE::weof(int num)
1504 {
1505    struct mtop mt_com;
1506    int stat;
1507    Dmsg0(129, "weof_dev\n");
1508    
1509    if (fd < 0) {
1510       dev_errno = EBADF;
1511       Mmsg0(errmsg, _("Bad call to weof_dev. Device not open\n"));
1512       Emsg0(M_FATAL, 0, errmsg);
1513       return false;
1514    }
1515    file_size = 0;
1516
1517    if (!is_tape()) {
1518       return true;
1519    }
1520    if (!can_append()) {
1521       Mmsg0(errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1522       Emsg0(M_FATAL, 0, errmsg);
1523       return false;
1524    }
1525       
1526    clear_eof();
1527    clear_eot();
1528    mt_com.mt_op = MTWEOF;
1529    mt_com.mt_count = num;
1530    stat = ioctl(fd, MTIOCTOP, (char *)&mt_com);
1531    if (stat == 0) {
1532       block_num = 0;
1533       file += num;
1534       file_addr = 0;
1535    } else {
1536       berrno be;
1537       clrerror(MTWEOF);
1538       if (stat == -1) {
1539          Mmsg2(errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1540             print_name(), be.strerror());
1541        }
1542    }
1543    return stat == 0;
1544 }
1545
1546
1547 /*
1548  * If implemented in system, clear the tape
1549  * error status.
1550  */
1551 void DEVICE::clrerror(int func)
1552 {
1553    const char *msg = NULL;
1554    struct mtget mt_stat;
1555    char buf[100];
1556
1557    dev_errno = errno;         /* save errno */
1558    if (errno == EIO) {
1559       VolCatInfo.VolCatErrors++;
1560    }
1561
1562    if (!is_tape()) {
1563       return;
1564    }
1565    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1566       switch (func) {
1567       case -1:
1568          Emsg0(M_ABORT, 0, _("Got ENOTTY on read/write!\n"));
1569          break;
1570       case MTWEOF:
1571          msg = "WTWEOF";
1572          capabilities &= ~CAP_EOF; /* turn off feature */
1573          break;
1574 #ifdef MTEOM
1575       case MTEOM:
1576          msg = "WTEOM";
1577          capabilities &= ~CAP_EOM; /* turn off feature */
1578          break;
1579 #endif
1580       case MTFSF:
1581          msg = "MTFSF";
1582          capabilities &= ~CAP_FSF; /* turn off feature */
1583          break;
1584       case MTBSF:
1585          msg = "MTBSF";
1586          capabilities &= ~CAP_BSF; /* turn off feature */
1587          break;
1588       case MTFSR:
1589          msg = "MTFSR";
1590          capabilities &= ~CAP_FSR; /* turn off feature */
1591          break;
1592       case MTBSR:
1593          msg = "MTBSR";
1594          capabilities &= ~CAP_BSR; /* turn off feature */
1595          break;
1596       case MTREW:
1597          msg = "MTREW";
1598          break;
1599 #ifdef MTSETBLK
1600       case MTSETBLK:
1601          msg = "MTSETBLK";
1602          break;
1603 #endif
1604 #ifdef MTSETBSIZ 
1605       case MTSETBSIZ:
1606          msg = "MTSETBSIZ";
1607          break;
1608 #endif
1609 #ifdef MTSRSZ
1610       case MTSRSZ:
1611          msg = "MTSRSZ";
1612          break;
1613 #endif
1614 #ifdef MTLOAD
1615       case MTLOAD:
1616          msg = "MTLOAD";
1617          break;
1618 #endif
1619 #ifdef MTUNLOCK
1620       case MTUNLOCK:
1621          msg = "MTUNLOCK";
1622          break;
1623 #endif
1624       case MTOFFL:
1625          msg = "MTOFFL";
1626          break;
1627       default:
1628          bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1629          msg = buf;
1630          break;
1631       }
1632       if (msg != NULL) {
1633          dev_errno = ENOSYS;
1634          Mmsg1(errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1635          Emsg0(M_ERROR, 0, errmsg);
1636       }
1637    }
1638
1639    /*
1640     * Now we try different methods of clearing the error
1641     *  status on the drive so that it is not locked for
1642     *  further operations.
1643     */
1644
1645    /* On some systems such as NetBSD, this clears all errors */
1646    ioctl(fd, MTIOCGET, (char *)&mt_stat);
1647
1648 /* Found on Linux */
1649 #ifdef MTIOCLRERR
1650 {
1651    struct mtop mt_com;
1652    mt_com.mt_op = MTIOCLRERR;
1653    mt_com.mt_count = 1;
1654    /* Clear any error condition on the tape */
1655    ioctl(fd, MTIOCTOP, (char *)&mt_com);
1656    Dmsg0(200, "Did MTIOCLRERR\n");
1657 }
1658 #endif
1659
1660 /* Typically on FreeBSD */
1661 #ifdef MTIOCERRSTAT
1662 {
1663    /* Read and clear SCSI error status */
1664    union mterrstat mt_errstat;
1665    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
1666       strerror(dev_errno));
1667    ioctl(fd, MTIOCERRSTAT, (char *)&mt_errstat);
1668 }
1669 #endif
1670
1671 /* Clear Subsystem Exception OSF1 */
1672 #ifdef MTCSE
1673 {
1674    struct mtop mt_com;
1675    mt_com.mt_op = MTCSE;
1676    mt_com.mt_count = 1;
1677    /* Clear any error condition on the tape */
1678    ioctl(fd, MTIOCTOP, (char *)&mt_com);
1679    Dmsg0(200, "Did MTCSE\n");
1680 }
1681 #endif
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       Dmsg2(100, "device %s already closed vol=%s\n", print_name(),
1697          VolHdr.VolumeName);
1698       return;                         /* already closed */
1699    }
1700
1701    if (is_dvd() && !unmount_dvd(this, 1)) {
1702       Dmsg1(0, "Cannot unmount device %s.\n", print_name());
1703    }
1704    
1705    /* Remove the last part file if it is empty */
1706    if (num_parts > 0) {
1707       struct stat statp;
1708       POOL_MEM archive_name(PM_FNAME);
1709       part = num_parts;
1710       Dmsg1(100, "Call make_dvd_filename. Vol=%s\n", VolCatInfo.VolCatName);
1711       make_spooled_dvd_filename(this, archive_name);
1712       /* Check that the part file is empty */
1713       if ((stat(archive_name.c_str(), &statp) == 0) && (statp.st_size == 0)) {
1714          Dmsg1(100, "unlink(%s)\n", archive_name.c_str());
1715          unlink(archive_name.c_str());
1716       }
1717    }
1718    
1719    /* Clean up device packet so it can be reused */
1720    clear_opened();
1721    state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
1722    label_type = B_BACULA_LABEL;
1723    file = block_num = 0;
1724    file_size = 0;
1725    file_addr = 0;
1726    part = 0;
1727    num_parts = 0;
1728    part_size = 0;
1729    part_start = 0;
1730    EndFile = EndBlock = 0;
1731    free_volume(this);
1732    memset(&VolCatInfo, 0, sizeof(VolCatInfo));
1733    memset(&VolHdr, 0, sizeof(VolHdr));
1734    if (tid) {
1735       stop_thread_timer(tid);
1736       tid = 0;
1737    }
1738    openmode = 0;
1739 }
1740
1741
1742
1743 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
1744 {
1745    Dmsg1(100, "truncate_dev %s\n", print_name());
1746    if (is_tape()) {
1747       return true;                    /* we don't really truncate tapes */
1748       /* maybe we should rewind and write and eof ???? */
1749    }
1750    
1751    if (is_dvd()) {
1752       return truncate_dvd(dcr);
1753    }
1754    
1755    if (ftruncate(fd, 0) != 0) {
1756       berrno be;
1757       Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
1758             print_name(), be.strerror());
1759       return false;
1760    }
1761    return true;
1762 }
1763
1764 /* Mount the device.
1765  * If timeout, wait until the mount command returns 0.
1766  * If !timeout, try to mount the device only once.
1767  */
1768 bool DEVICE::mount(int timeout) 
1769 {
1770    Dmsg0(190, "Enter mount\n");
1771    if (is_mounted()) {
1772       return true;
1773    } else if (requires_mount()) {
1774       return do_mount(1, timeout);
1775    }       
1776    return true;
1777 }
1778
1779 /* Unmount the device
1780  * If timeout, wait until the unmount command returns 0.
1781  * If !timeout, try to unmount the device only once.
1782  */
1783 bool DEVICE::unmount(int timeout) 
1784 {
1785    Dmsg0(90, "Enter unmount_dvd\n");
1786    if (is_mounted()) {
1787       return do_mount(0, timeout);
1788    }
1789    return true;
1790 }
1791
1792 /* (Un)mount the device */
1793 bool DEVICE::do_mount(int mount, int dotimeout) 
1794 {
1795    POOL_MEM ocmd(PM_FNAME);
1796    POOLMEM *results;
1797    char *icmd;
1798    int status, timeout;
1799    
1800    sm_check(__FILE__, __LINE__, false);
1801    if (mount) {
1802       if (is_mounted()) {
1803          Dmsg0(200, "======= mount=1\n");
1804          return true;
1805       }
1806       icmd = device->mount_command;
1807    } else {
1808       if (!is_mounted()) {
1809          Dmsg0(200, "======= mount=0\n");
1810          return true;
1811       }
1812       icmd = device->unmount_command;
1813    }
1814    
1815    edit_mount_codes(ocmd, icmd);
1816    
1817    Dmsg2(000, "do_mount_dvd: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
1818
1819    if (dotimeout) {
1820       /* Try at most 1 time to (un)mount the device. This should perhaps be configurable. */
1821       timeout = 1;
1822    } else {
1823       timeout = 0;
1824    }
1825    results = get_memory(2000);
1826    results[0] = 0;
1827    /* If busy retry each second */
1828    while ((status = run_program_full_output(ocmd.c_str(), 
1829                        max_open_wait/2, results)) != 0) {
1830       /* Doesn't work with internationalisation (This is not a problem) */
1831       if (fnmatch("*is already mounted on", results, 0) == 0) {
1832          break;
1833       }
1834       if (timeout-- > 0) {
1835          /* Sometimes the device cannot be mounted because it is already mounted.
1836           * Try to unmount it, then remount it */
1837          if (mount) {
1838             Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
1839             do_mount(0, 0);
1840          }
1841          bmicrosleep(1, 0);
1842          continue;
1843       }
1844       Dmsg2(40, "Device %s cannot be mounted. ERR=%s\n", print_name(), results);
1845       Mmsg(errmsg, _("Device %s cannot be mounted. ERR=%s\n"), 
1846            print_name(), results);
1847       /*
1848        * Now, just to be sure it is not mounted, try to read the
1849        *  filesystem.
1850        */
1851       DIR* dp;
1852       struct dirent *entry, *result;
1853       int name_max;
1854       int count;
1855       
1856       name_max = pathconf(".", _PC_NAME_MAX);
1857       if (name_max < 1024) {
1858          name_max = 1024;
1859       }
1860          
1861       if (!(dp = opendir(device->mount_point))) {
1862          berrno be;
1863          dev_errno = errno;
1864          Dmsg3(29, "do_mount: failed to open dir %s (dev=%s), ERR=%s\n", 
1865                device->mount_point, print_name(), be.strerror());
1866          goto get_out;
1867       }
1868       
1869       entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
1870       count = 0;
1871       while (1) {
1872          if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
1873             dev_errno = EIO;
1874             Dmsg2(129, "do_mount: failed to find suitable file in dir %s (dev=%s)\n", 
1875                   device->mount_point, print_name());
1876             break;
1877          }
1878          if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
1879             count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
1880             break;
1881          } else {
1882             Dmsg2(129, "do_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
1883          }
1884       }
1885       free(entry);
1886       closedir(dp);
1887       
1888       Dmsg1(29, "do_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
1889       
1890       if (count > 0) {
1891          mount = 1;                      /* If we got more than ., .. and .keep */
1892          break;                          /*   there must be something mounted */
1893       }
1894 get_out:
1895       set_mounted(false);
1896       sm_check(__FILE__, __LINE__, false);
1897       free_pool_memory(results);
1898       Dmsg0(200, "============ mount=0\n");
1899       return false;
1900    }
1901    
1902    set_mounted(mount);              /* set/clear mounted flag */
1903    free_pool_memory(results);
1904    Dmsg1(200, "============ mount=%d\n", mount);
1905    return true;
1906 }
1907
1908 /*
1909  * Edit codes into (Un)MountCommand, Write(First)PartCommand
1910  *  %% = %
1911  *  %a = archive device name
1912  *  %e = erase (set if cannot mount and first part)
1913  *  %n = part number
1914  *  %m = mount point
1915  *  %v = last part name
1916  *
1917  *  omsg = edited output message
1918  *  imsg = input string containing edit codes (%x)
1919  *
1920  */
1921 void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
1922 {
1923    const char *p;
1924    const char *str;
1925    char add[20];
1926    
1927    POOL_MEM archive_name(PM_FNAME);
1928
1929    omsg.c_str()[0] = 0;
1930    Dmsg1(800, "edit_mount_codes: %s\n", imsg);
1931    for (p=imsg; *p; p++) {
1932       if (*p == '%') {
1933          switch (*++p) {
1934          case '%':
1935             str = "%";
1936             break;
1937          case 'a':
1938             str = dev_name;
1939             break;
1940          case 'e':
1941             if (num_parts == 0) {
1942                str = "1";
1943             } else {
1944                str = "0";
1945             }
1946             break;
1947          case 'n':
1948             bsnprintf(add, sizeof(add), "%d", part);
1949             str = add;
1950             break;
1951          case 'm':
1952             str = device->mount_point;
1953             break;
1954          case 'v':
1955             make_spooled_dvd_filename(this, archive_name);
1956             str = archive_name.c_str();
1957             break;
1958          default:
1959             add[0] = '%';
1960             add[1] = *p;
1961             add[2] = 0;
1962             str = add;
1963             break;
1964          }
1965       } else {
1966          add[0] = *p;
1967          add[1] = 0;
1968          str = add;
1969       }
1970       Dmsg1(1900, "add_str %s\n", str);
1971       pm_strcat(omsg, (char *)str);
1972       Dmsg1(1800, "omsg=%s\n", omsg.c_str());
1973    }
1974 }
1975
1976
1977 /* Return the resource name for the device */
1978 const char *DEVICE::name() const
1979 {
1980    return device->hdr.name;
1981 }
1982
1983 char *
1984 dev_vol_name(DEVICE *dev)
1985 {
1986    return dev->VolCatInfo.VolCatName;
1987 }
1988
1989 uint32_t dev_block(DEVICE *dev)
1990 {
1991    update_pos_dev(dev);
1992    return dev->block_num;
1993 }
1994
1995 uint32_t dev_file(DEVICE *dev)
1996 {
1997    update_pos_dev(dev);
1998    return dev->file;
1999 }
2000
2001 /*
2002  * Free memory allocated for the device
2003  */
2004 void DEVICE::term(void)
2005 {
2006    Dmsg1(900, "term dev: %s\n", print_name());
2007    close();
2008    if (dev_name) {
2009       free_memory(dev_name);
2010       dev_name = NULL;
2011    }
2012    if (prt_name) {
2013       free_memory(prt_name);
2014       prt_name = NULL;
2015    }
2016    if (errmsg) {
2017       free_pool_memory(errmsg);
2018       errmsg = NULL;
2019    }
2020    pthread_mutex_destroy(&mutex);
2021    pthread_cond_destroy(&wait);
2022    pthread_cond_destroy(&wait_next_vol);
2023    pthread_mutex_destroy(&spool_mutex);
2024    rwl_destroy(&lock);
2025    if (attached_dcrs) {
2026       delete attached_dcrs;
2027       attached_dcrs = NULL;
2028    }
2029    if (device) {
2030       device->dev = NULL;
2031    }
2032    free((char *)this);
2033 }
2034
2035 /*
2036  * This routine initializes the device wait timers
2037  */
2038 void init_device_wait_timers(DCR *dcr)
2039 {
2040    DEVICE *dev = dcr->dev;
2041    JCR *jcr = dcr->jcr;
2042
2043    /* ******FIXME******* put these on config variables */
2044    dev->min_wait = 60 * 60;
2045    dev->max_wait = 24 * 60 * 60;
2046    dev->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2047    dev->wait_sec = dev->min_wait;
2048    dev->rem_wait_sec = dev->wait_sec;
2049    dev->num_wait = 0;
2050    dev->poll = false;
2051    dev->BadVolName[0] = 0;
2052
2053    jcr->min_wait = 60 * 60;
2054    jcr->max_wait = 24 * 60 * 60;
2055    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2056    jcr->wait_sec = jcr->min_wait;
2057    jcr->rem_wait_sec = jcr->wait_sec;
2058    jcr->num_wait = 0;
2059
2060 }
2061
2062 void init_jcr_device_wait_timers(JCR *jcr)
2063 {
2064    /* ******FIXME******* put these on config variables */
2065    jcr->min_wait = 60 * 60;
2066    jcr->max_wait = 24 * 60 * 60;
2067    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2068    jcr->wait_sec = jcr->min_wait;
2069    jcr->rem_wait_sec = jcr->wait_sec;
2070    jcr->num_wait = 0;
2071 }
2072
2073
2074 /*
2075  * The dev timers are used for waiting on a particular device 
2076  *
2077  * Returns: true if time doubled
2078  *          false if max time expired
2079  */
2080 bool double_dev_wait_time(DEVICE *dev)
2081 {
2082    dev->wait_sec *= 2;               /* double wait time */
2083    if (dev->wait_sec > dev->max_wait) {   /* but not longer than maxtime */
2084       dev->wait_sec = dev->max_wait;
2085    }
2086    dev->num_wait++;
2087    dev->rem_wait_sec = dev->wait_sec;
2088    if (dev->num_wait >= dev->max_num_wait) {
2089       return false;
2090    }
2091    return true;
2092 }
2093
2094
2095 void set_os_device_parameters(DEVICE *dev)
2096 {
2097 #ifdef HAVE_LINUX_OS
2098    struct mtop mt_com;
2099    if (dev->min_block_size == dev->max_block_size &&
2100        dev->min_block_size == 0) {    /* variable block mode */
2101       mt_com.mt_op = MTSETBLK;
2102       mt_com.mt_count = 0;
2103       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2104          dev->clrerror(MTSETBLK);
2105       }
2106       mt_com.mt_op = MTSETDRVBUFFER;
2107       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
2108       if (!dev->has_cap(CAP_TWOEOF)) {
2109          mt_com.mt_count |= MT_ST_TWO_FM;
2110       }
2111       if (dev->has_cap(CAP_EOM)) {
2112          mt_com.mt_count |= MT_ST_FAST_MTEOM;
2113       }
2114       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2115          dev->clrerror(MTSETBLK);
2116       }
2117    }
2118    return;
2119 #endif
2120
2121 #ifdef HAVE_NETBSD_OS
2122    struct mtop mt_com;
2123    if (dev->min_block_size == dev->max_block_size &&
2124        dev->min_block_size == 0) {    /* variable block mode */
2125       mt_com.mt_op = MTSETBSIZ;
2126       mt_com.mt_count = 0;
2127       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2128          dev->clrerror(MTSETBSIZ);
2129       }
2130       /* Get notified at logical end of tape */
2131       mt_com.mt_op = MTEWARN;
2132       mt_com.mt_count = 1;
2133       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2134          dev->clrerror(MTEWARN);
2135       }
2136    }
2137    return;
2138 #endif
2139
2140 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
2141    struct mtop mt_com;
2142    if (dev->min_block_size == dev->max_block_size &&
2143        dev->min_block_size == 0) {    /* variable block mode */
2144       mt_com.mt_op = MTSETBSIZ;
2145       mt_com.mt_count = 0;
2146       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2147          dev->clrerror(MTSETBSIZ);
2148       }
2149    }
2150    return;
2151 #endif
2152
2153 #ifdef HAVE_SUN_OS
2154    struct mtop mt_com;
2155    if (dev->min_block_size == dev->max_block_size &&
2156        dev->min_block_size == 0) {    /* variable block mode */
2157       mt_com.mt_op = MTSRSZ;
2158       mt_com.mt_count = 0;
2159       if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
2160          dev->clrerror(MTSRSZ);
2161       }
2162    }
2163    return;
2164 #endif
2165 }
2166
2167 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
2168 {
2169    return dev->has_cap(CAP_MTIOCGET) && 
2170           ioctl(dev->fd, MTIOCGET, (char *)mt_stat) == 0 &&
2171           mt_stat->mt_fileno >= 0;
2172 }
2173
2174 static char *modes[] = {
2175    "CREATE_READ_WRITE",
2176    "OPEN_READ_WRITE",
2177    "OPEN_READ_ONLY",
2178    "OPEN_WRITE_ONLY"
2179 };
2180
2181
2182 static char *mode_to_str(int mode)  
2183 {
2184    return modes[mode-1];
2185 }