]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/stored/dev.c
7c6d57bcf84ae6e930c1db6e0166ff18d3f4d565
[bacula/bacula] / bacula / src / stored / dev.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2012 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version three of the GNU Affero General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU Affero General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  *
30  *   dev.c  -- low level operations on device (storage device)
31  *
32  *              Kern Sibbald, MM
33  *
34  *     NOTE!!!! None of these routines are reentrant. You must
35  *        use dev->r_dlock() and dev->unlock() at a higher level,
36  *        or use the xxx_device() equivalents.  By moving the
37  *        thread synchronization to a higher level, we permit
38  *        the higher level routines to "seize" the device and
39  *        to carry out operations without worrying about who
40  *        set what lock (i.e. race conditions).
41  *
42  *     Note, this is the device dependent code, and may have
43  *           to be modified for each system, but is meant to
44  *           be as "generic" as possible.
45  *
46  *     The purpose of this code is to develop a SIMPLE Storage
47  *     daemon. More complicated coding (double buffering, writer
48  *     thread, ...) is left for a later version.
49  *
50  */
51
52 /*
53  * Handling I/O errors and end of tape conditions are a bit tricky.
54  * This is how it is currently done when writing.
55  * On either an I/O error or end of tape,
56  * we will stop writing on the physical device (no I/O recovery is
57  * attempted at least in this daemon). The state flag will be sent
58  * to include ST_EOT, which is ephemeral, and ST_WEOT, which is
59  * persistent. Lots of routines clear ST_EOT, but ST_WEOT is
60  * cleared only when the problem goes away.  Now when ST_WEOT
61  * is set all calls to write_block_to_device() call the fix_up
62  * routine. In addition, all threads are blocked
63  * from writing on the tape by calling lock_dev(), and thread other
64  * than the first thread to hit the EOT will block on a condition
65  * variable. The first thread to hit the EOT will continue to
66  * be able to read and write the tape (he sort of tunnels through
67  * the locking mechanism -- see lock_dev() for details).
68  *
69  * Now presumably somewhere higher in the chain of command
70  * (device.c), someone will notice the EOT condition and
71  * get a new tape up, get the tape label read, and mark
72  * the label for rewriting. Then this higher level routine
73  * will write the unwritten buffer to the new volume.
74  * Finally, he will release
75  * any blocked threads by doing a broadcast on the condition
76  * variable.  At that point, we should be totally back in
77  * business with no lost data.
78  */
79
80
81 #include "bacula.h"
82 #include "stored.h"
83
84 #ifndef O_NONBLOCK 
85 #define O_NONBLOCK 0
86 #endif
87
88 /* Forward referenced functions */
89 void set_os_device_parameters(DCR *dcr);   
90 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat);
91 static const char *mode_to_str(int mode);
92 static DEVICE *m_init_dev(JCR *jcr, DEVRES *device, bool new_init);
93
94 /*
95  * Allocate and initialize the DEVICE structure
96  * Note, if dev is non-NULL, it is already allocated,
97  * thus we neither allocate it nor free it. This allows
98  * the caller to put the packet in shared memory.
99  *
100  *  Note, for a tape, the device->device_name is the device name
101  *     (e.g. /dev/nst0), and for a file, the device name
102  *     is the directory in which the file will be placed.
103  *
104  */
105 DEVICE *
106 init_dev(JCR *jcr, DEVRES *device)
107 {
108    DEVICE *dev = m_init_dev(jcr, device, false);
109    return dev;
110 }
111
112 static DEVICE *
113 m_init_dev(JCR *jcr, DEVRES *device, bool new_init)
114 {
115    struct stat statp;
116    int errstat;
117    DCR *dcr = NULL;
118    DEVICE *dev;
119    uint32_t max_bs;
120
121
122    /* If no device type specified, try to guess */
123    if (!device->dev_type) {
124       /* Check that device is available */
125       if (stat(device->device_name, &statp) < 0) {
126          berrno be;
127          Jmsg2(jcr, M_ERROR, 0, _("Unable to stat device %s: ERR=%s\n"), 
128             device->device_name, be.bstrerror());
129          return NULL;
130       }
131       if (S_ISDIR(statp.st_mode)) {
132          device->dev_type = B_FILE_DEV;
133       } else if (S_ISCHR(statp.st_mode)) {
134          device->dev_type = B_TAPE_DEV;
135       } else if (S_ISFIFO(statp.st_mode)) {
136          device->dev_type = B_FIFO_DEV;
137 #ifdef USE_VTAPE
138       /* must set DeviceType = Vtape 
139        * in normal mode, autodetection is disabled
140        */
141       } else if (S_ISREG(statp.st_mode)) { 
142          device->dev_type = B_VTAPE_DEV;
143 #endif
144       } else if (!(device->cap_bits & CAP_REQMOUNT)) {
145          Jmsg2(jcr, M_ERROR, 0, _("%s is an unknown device type. Must be tape or directory\n"
146                " or have RequiresMount=yes for DVD. st_mode=%x\n"),
147             device->device_name, statp.st_mode);
148          return NULL;
149       } else {
150          device->dev_type = B_DVD_DEV;
151       }
152    }
153    switch (device->dev_type) {
154    case B_DVD_DEV:
155       Jmsg0(jcr, M_FATAL, 0, _("DVD support is now deprecated\n"));
156       return NULL;
157    case B_VTAPE_DEV:
158       dev = New(vtape);
159       break;
160 #ifdef USE_FTP
161    case B_FTP_DEV:
162       dev = New(ftp_device);
163       break;
164 #endif
165 #ifdef HAVE_WIN32
166 /* TODO: defined in src/win32/stored/mtops.cpp */
167    case B_TAPE_DEV:
168       dev = New(win32_tape_device);
169       break;
170    case B_FILE_DEV:
171       dev = New(win32_file_device);
172       break;
173 #else
174    case B_TAPE_DEV:
175    case B_FILE_DEV:
176    case B_FIFO_DEV:
177       dev = New(DEVICE);
178       break;
179 #endif
180    default:
181          return NULL;
182    }
183    dev->clear_slot();         /* unknown */
184
185    /* Copy user supplied device parameters from Resource */
186    dev->dev_name = get_memory(strlen(device->device_name)+1);
187    pm_strcpy(dev->dev_name, device->device_name);
188    dev->prt_name = get_memory(strlen(device->device_name) + strlen(device->hdr.name) + 20);
189    /* We edit "Resource-name" (physical-name) */
190    Mmsg(dev->prt_name, "\"%s\" (%s)", device->hdr.name, device->device_name);
191    Dmsg1(400, "Allocate dev=%s\n", dev->print_name());
192    dev->capabilities = device->cap_bits;
193    dev->min_block_size = device->min_block_size;
194    dev->max_block_size = device->max_block_size;
195    dev->max_volume_size = device->max_volume_size;
196    dev->max_file_size = device->max_file_size;
197    dev->max_concurrent_jobs = device->max_concurrent_jobs;
198    dev->volume_capacity = device->volume_capacity;
199    dev->max_rewind_wait = device->max_rewind_wait;
200    dev->max_open_wait = device->max_open_wait;
201    dev->max_open_vols = device->max_open_vols;
202    dev->vol_poll_interval = device->vol_poll_interval;
203    dev->max_spool_size = device->max_spool_size;
204    dev->drive_index = device->drive_index;
205    dev->autoselect = device->autoselect;
206    dev->dev_type = device->dev_type;
207    dev->device = device;
208    if (dev->is_tape()) { /* No parts on tapes */
209       dev->max_part_size = 0;
210    } else {
211       dev->max_part_size = device->max_part_size;
212    }
213    /* Sanity check */
214    if (dev->vol_poll_interval && dev->vol_poll_interval < 60) {
215       dev->vol_poll_interval = 60;
216    }
217    device->dev = dev;
218
219    if (dev->is_fifo()) {
220       dev->capabilities |= CAP_STREAM; /* set stream device */
221    }
222
223    /* If the device requires mount :
224     * - Check that the mount point is available 
225     * - Check that (un)mount commands are defined
226     */
227    if (dev->is_file() && dev->requires_mount()) {
228       if (!device->mount_point || stat(device->mount_point, &statp) < 0) {
229          berrno be;
230          dev->dev_errno = errno;
231          Jmsg2(jcr, M_ERROR_TERM, 0, _("Unable to stat mount point %s: ERR=%s\n"), 
232             device->mount_point, be.bstrerror());
233       }
234    
235       if (!device->mount_command || !device->unmount_command) {
236          Jmsg0(jcr, M_ERROR_TERM, 0, _("Mount and unmount commands must defined for a device which requires mount.\n"));
237       }
238    }
239
240    /* Sanity check */
241    if (dev->max_block_size == 0) {
242       max_bs = DEFAULT_BLOCK_SIZE;
243    } else {
244       max_bs = dev->max_block_size;
245    }
246    if (dev->min_block_size > max_bs) {
247       Jmsg(jcr, M_ERROR_TERM, 0, _("Min block size > max on device %s\n"), 
248            dev->print_name());
249    }
250    if (dev->max_block_size > 4096000) {
251       Jmsg3(jcr, M_ERROR, 0, _("Block size %u on device %s is too large, using default %u\n"),
252          dev->max_block_size, dev->print_name(), DEFAULT_BLOCK_SIZE);
253       dev->max_block_size = 0;
254    }
255    if (dev->max_block_size % TAPE_BSIZE != 0) {
256       Jmsg3(jcr, M_WARNING, 0, _("Max block size %u not multiple of device %s block size=%d.\n"),
257          dev->max_block_size, dev->print_name(), TAPE_BSIZE);
258    }
259    if (dev->max_volume_size != 0 && dev->max_volume_size < (dev->max_block_size << 4)) {
260       Jmsg(jcr, M_ERROR_TERM, 0, _("Max Vol Size < 8 * Max Block Size for device %s\n"), 
261            dev->print_name());
262    }
263
264    dev->errmsg = get_pool_memory(PM_EMSG);
265    *dev->errmsg = 0;
266
267    if ((errstat = pthread_mutex_init(&dev->m_mutex, NULL)) != 0) {
268       berrno be;
269       dev->dev_errno = errstat;
270       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
271       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
272    }
273    if ((errstat = pthread_cond_init(&dev->wait, NULL)) != 0) {
274       berrno be;
275       dev->dev_errno = errstat;
276       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.bstrerror(errstat));
277       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
278    }
279    if ((errstat = pthread_cond_init(&dev->wait_next_vol, NULL)) != 0) {
280       berrno be;
281       dev->dev_errno = errstat;
282       Mmsg1(dev->errmsg, _("Unable to init cond variable: ERR=%s\n"), be.bstrerror(errstat));
283       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
284    }
285    if ((errstat = pthread_mutex_init(&dev->spool_mutex, NULL)) != 0) {
286       berrno be;
287       dev->dev_errno = errstat;
288       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
289       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
290    }
291    if ((errstat = pthread_mutex_init(&dev->acquire_mutex, NULL)) != 0) {
292       berrno be;
293       dev->dev_errno = errstat;
294       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
295       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
296    }
297    /* Ensure that we respect this order in P/V operations */
298    bthread_mutex_set_priority(&dev->m_mutex,       PRIO_SD_DEV_ACCESS);
299    bthread_mutex_set_priority(&dev->spool_mutex,   PRIO_SD_DEV_SPOOL);
300    bthread_mutex_set_priority(&dev->acquire_mutex, PRIO_SD_DEV_ACQUIRE);
301    if ((errstat = pthread_mutex_init(&dev->read_acquire_mutex, NULL)) != 0) {
302       berrno be;
303       dev->dev_errno = errstat;
304       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
305       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
306    }
307 #ifdef xxx
308    if ((errstat = rwl_init(&dev->lock)) != 0) {
309       berrno be;
310       dev->dev_errno = errstat;
311       Mmsg1(dev->errmsg, _("Unable to init mutex: ERR=%s\n"), be.bstrerror(errstat));
312       Jmsg0(jcr, M_ERROR_TERM, 0, dev->errmsg);
313    }
314 #endif
315
316    dev->clear_opened();
317    dev->attached_dcrs = New(dlist(dcr, &dcr->dev_link));
318    Dmsg2(100, "init_dev: tape=%d dev_name=%s\n", dev->is_tape(), dev->dev_name);
319    dev->initiated = true;
320    
321    return dev;
322 }
323
324 /* default primitives are designed for file */
325 int DEVICE::d_open(const char *pathname, int flags)
326 {
327    return ::open(pathname, flags);
328 }
329
330 int DEVICE::d_close(int fd)
331 {
332    return ::close(fd);
333 }
334
335 int DEVICE::d_ioctl(int fd, ioctl_req_t request, char *mt_com)
336 {
337    return ::ioctl(fd, request, mt_com);
338 }
339
340 ssize_t DEVICE::d_read(int fd, void *buffer, size_t count)
341 {
342    return ::read(fd, buffer, count);
343 }
344
345 ssize_t DEVICE::d_write(int fd, const void *buffer, size_t count)
346 {
347    return ::write(fd, buffer, count);
348 }
349
350 /*
351  * Open the device with the operating system and
352  * initialize buffer pointers.
353  *
354  * Returns:  true on success
355  *           false on error
356  *
357  * Note, for a tape, the VolName is the name we give to the
358  *    volume (not really used here), but for a file, the
359  *    VolName represents the name of the file to be created/opened.
360  *    In the case of a file, the full name is the device name
361  *    (archive_name) with the VolName concatenated.
362  */
363 bool
364 DEVICE::open(DCR *dcr, int omode)
365 {
366    int preserve = 0;
367    if (is_open()) {
368       if (openmode == omode) {
369          return true;
370       } else {
371          d_close(m_fd);
372          clear_opened();
373          Dmsg0(100, "Close fd for mode change.\n");
374          preserve = state & (ST_LABEL|ST_APPEND|ST_READ);
375       }
376    }
377    if (dcr) {
378       dcr->setVolCatName(dcr->VolumeName);
379       VolCatInfo = dcr->VolCatInfo;    /* structure assign */
380    }
381
382    Dmsg4(100, "open dev: type=%d dev_name=%s vol=%s mode=%s\n", dev_type,
383          print_name(), getVolCatName(), mode_to_str(omode));
384    state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
385    label_type = B_BACULA_LABEL;
386
387    if (is_tape() || is_fifo()) {
388       open_tape_device(dcr, omode);
389    } else if (is_ftp()) {
390       open_device(dcr, omode);
391    } else {
392       Dmsg1(100, "call open_file_device mode=%s\n", mode_to_str(omode));
393       open_file_device(dcr, omode);
394    }
395    state |= preserve;                 /* reset any important state info */
396    Dmsg2(100, "preserve=0x%x fd=%d\n", preserve, m_fd);
397    return m_fd >= 0;
398 }
399
400 void DEVICE::set_mode(int new_mode) 
401 {
402    switch (new_mode) {
403    case CREATE_READ_WRITE:
404       mode = O_CREAT | O_RDWR | O_BINARY;
405       break;
406    case OPEN_READ_WRITE:
407       mode = O_RDWR | O_BINARY;
408       break;
409    case OPEN_READ_ONLY:
410       mode = O_RDONLY | O_BINARY;
411       break;
412    case OPEN_WRITE_ONLY:
413       mode = O_WRONLY | O_BINARY;
414       break;
415    default:
416       Emsg0(M_ABORT, 0, _("Illegal mode given to open dev.\n"));
417    }
418 }
419
420 /*
421  */
422 void DEVICE::open_tape_device(DCR *dcr, int omode) 
423 {
424    file_size = 0;
425    int timeout = max_open_wait;
426 #if !defined(HAVE_WIN32)
427    struct mtop mt_com;
428    utime_t start_time = time(NULL);
429 #endif
430
431    mount(1);                          /* do mount if required */
432
433    Dmsg0(100, "Open dev: device is tape\n");
434
435    get_autochanger_loaded_slot(dcr);
436
437    openmode = omode;
438    set_mode(omode);
439
440    if (timeout < 1) {
441       timeout = 1;
442    }
443    errno = 0;
444    if (is_fifo() && timeout) {
445       /* Set open timer */
446       tid = start_thread_timer(dcr->jcr, pthread_self(), timeout);
447    }
448    Dmsg2(100, "Try open %s mode=%s\n", print_name(), mode_to_str(omode));
449 #if defined(HAVE_WIN32)
450
451    /*   Windows Code */
452    if ((m_fd = d_open(dev_name, mode)) < 0) {
453       dev_errno = errno;
454    }
455
456 #else
457
458    /*  UNIX  Code */
459    /* If busy retry each second for max_open_wait seconds */
460    for ( ;; ) {
461       /* Try non-blocking open */
462       m_fd = d_open(dev_name, mode+O_NONBLOCK);
463       if (m_fd < 0) {
464          berrno be;
465          dev_errno = errno;
466          Dmsg5(100, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n", 
467               print_name(), omode, mode, errno, be.bstrerror());
468       } else {
469          /* Tape open, now rewind it */
470          Dmsg0(100, "Rewind after open\n");
471          mt_com.mt_op = MTREW;
472          mt_com.mt_count = 1;
473          /* rewind only if dev is a tape */
474          if (is_tape() && (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0)) {
475             berrno be;
476             dev_errno = errno;           /* set error status from rewind */
477             d_close(m_fd);
478             clear_opened();
479             Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
480                   be.bstrerror(dev_errno));
481             /* If we get busy, device is probably rewinding, try again */
482             if (dev_errno != EBUSY) {
483                break;                    /* error -- no medium */
484             }
485          } else {
486             /* Got fd and rewind worked, so we must have medium in drive */
487             d_close(m_fd);
488             m_fd = d_open(dev_name, mode);  /* open normally */
489             if (m_fd < 0) {
490                berrno be;
491                dev_errno = errno;
492                Dmsg5(100, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n", 
493                      print_name(), omode, mode, errno, be.bstrerror());
494                break;
495             }
496             dev_errno = 0;
497             lock_door();
498             set_os_device_parameters(dcr);       /* do system dependent stuff */
499             break;                               /* Successfully opened and rewound */
500          }
501       }
502       bmicrosleep(5, 0);
503       /* Exceed wait time ? */
504       if (time(NULL) - start_time >= max_open_wait) {
505          break;                       /* yes, get out */
506       }
507    }
508 #endif
509
510    if (!is_open()) {
511       berrno be;
512       Mmsg2(errmsg, _("Unable to open device %s: ERR=%s\n"),
513             print_name(), be.bstrerror(dev_errno));
514       Dmsg1(100, "%s", errmsg);
515    }
516
517    /* Stop any open() timer we started */
518    if (tid) {
519       stop_thread_timer(tid);
520       tid = 0;
521    }
522    Dmsg1(100, "open dev: tape %d opened\n", m_fd);
523 }
524
525 void DEVICE::open_device(DCR *dcr, int omode)
526 {
527    /* do nothing waiting to split open_file/tape_device */
528 }
529
530 /*
531  * Open a file device.
532  */
533 void DEVICE::open_file_device(DCR *dcr, int omode) 
534 {
535    POOL_MEM archive_name(PM_FNAME);
536
537    get_autochanger_loaded_slot(dcr);
538
539    /*
540     * Handle opening of File Archive (not a tape)
541     */     
542
543    pm_strcpy(archive_name, dev_name);
544    /*  
545     * If this is a virtual autochanger (i.e. changer_res != NULL)
546     *  we simply use the device name, assuming it has been
547     *  appropriately setup by the "autochanger".
548     */
549    if (!device->changer_res || device->changer_command[0] == 0) {
550       if (VolCatInfo.VolCatName[0] == 0) {
551          Mmsg(errmsg, _("Could not open file device %s. No Volume name given.\n"),
552             print_name());
553          clear_opened();
554          return;
555       }
556
557       if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
558          pm_strcat(archive_name, "/");
559       }
560       pm_strcat(archive_name, getVolCatName());
561    }
562
563    mount(1);                          /* do mount if required */
564          
565    openmode = omode;
566    set_mode(omode);
567    /* If creating file, give 0640 permissions */
568    Dmsg3(100, "open disk: mode=%s open(%s, 0x%x, 0640)\n", mode_to_str(omode), 
569          archive_name.c_str(), mode);
570    /* Use system open() */
571    if ((m_fd = ::open(archive_name.c_str(), mode, 0640)) < 0) {
572       berrno be;
573       dev_errno = errno;
574       Mmsg2(errmsg, _("Could not open: %s, ERR=%s\n"), archive_name.c_str(), 
575             be.bstrerror());
576       Dmsg1(100, "open failed: %s", errmsg);
577    }
578    if (m_fd >= 0) {
579       dev_errno = 0;
580       file = 0;
581       file_addr = 0;
582    }
583    Dmsg4(100, "open dev: disk fd=%d opened, part=%d/%d, part_size=%u\n", 
584       m_fd, part, num_dvd_parts, part_size);
585 }
586
587 /*
588  * Rewind the device.
589  *  Returns: true  on success
590  *           false on failure
591  */
592 bool DEVICE::rewind(DCR *dcr)
593 {
594    struct mtop mt_com;
595    unsigned int i;
596    bool first = true;
597
598    Dmsg3(400, "rewind res=%d fd=%d %s\n", num_reserved(), m_fd, print_name());
599    state &= ~(ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
600    block_num = file = 0;
601    file_size = 0;
602    file_addr = 0;
603    if (m_fd < 0) {
604       return false;
605    }
606    if (is_tape()) {
607       mt_com.mt_op = MTREW;
608       mt_com.mt_count = 1;
609       /* If we get an I/O error on rewind, it is probably because
610        * the drive is actually busy. We loop for (about 5 minutes)
611        * retrying every 5 seconds.
612        */
613       for (i=max_rewind_wait; ; i -= 5) {
614          if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
615             berrno be;
616             clrerror(MTREW);
617             if (i == max_rewind_wait) {
618                Dmsg1(200, "Rewind error, %s. retrying ...\n", be.bstrerror());
619             }
620             /*
621              * This is a gross hack, because if the user has the
622              *   device mounted (i.e. open), then uses mtx to load
623              *   a tape, the current open file descriptor is invalid.
624              *   So, we close the drive and re-open it.
625              */
626             if (first && dcr) {
627                int open_mode = openmode;
628                d_close(m_fd);
629                clear_opened();
630                open(dcr, open_mode);
631                if (m_fd < 0) {
632                   return false;
633                }
634                first = false;
635                continue;
636             }
637 #ifdef HAVE_SUN_OS
638             if (dev_errno == EIO) {         
639                Mmsg1(errmsg, _("No tape loaded or drive offline on %s.\n"), print_name());
640                return false;
641             }
642 #else
643             if (dev_errno == EIO && i > 0) {
644                Dmsg0(200, "Sleeping 5 seconds.\n");
645                bmicrosleep(5, 0);
646                continue;
647             }
648 #endif
649             Mmsg2(errmsg, _("Rewind error on %s. ERR=%s.\n"),
650                print_name(), be.bstrerror());
651             return false;
652          }
653          break;
654       }
655    } else if (is_file()) {
656       if (lseek(dcr, (boffset_t)0, SEEK_SET) < 0) {
657          berrno be;
658          dev_errno = errno;
659          Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
660             print_name(), be.bstrerror());
661          return false;
662       }
663    }
664    return true;
665 }
666
667
668 /*
669  * Called to indicate that we have just read an
670  *  EOF from the device.
671  */
672 void DEVICE::set_ateof() 
673
674    set_eof();
675    if (is_tape()) {
676       file++;
677    }
678    file_addr = 0;
679    file_size = 0;
680    block_num = 0;
681 }
682
683 /*
684  * Called to indicate we are now at the end of the tape, and
685  *   writing is not possible.
686  */
687 void DEVICE::set_ateot() 
688 {
689    /* Make tape effectively read-only */
690    state |= (ST_EOF|ST_EOT|ST_WEOT);
691    clear_append();
692 }
693
694 /*
695  * Position device to end of medium (end of data)
696  *  Returns: true  on succes
697  *           false on error
698  */
699 bool DEVICE::eod(DCR *dcr)
700 {
701    struct mtop mt_com;
702    bool ok = true;
703    boffset_t pos;
704    int32_t os_file;
705
706    if (m_fd < 0) {
707       dev_errno = EBADF;
708       Mmsg1(errmsg, _("Bad call to eod. Device %s not open\n"), print_name());
709       return false;
710    }
711
712 #if defined (__digital__) && defined (__unix__)
713    return fsf(VolCatInfo.VolCatFiles);
714 #endif
715
716    Dmsg0(100, "Enter eod\n");
717    if (at_eot()) {
718       return true;
719    }
720    clear_eof();         /* remove EOF flag */
721    block_num = file = 0;
722    file_size = 0;
723    file_addr = 0;
724    if (is_fifo()) {
725       return true;
726    }
727    if (!is_tape()) {
728       pos = lseek(dcr, (boffset_t)0, SEEK_END);
729       Dmsg1(200, "====== Seek to %lld\n", pos);
730       if (pos >= 0) {
731          update_pos(dcr);
732          set_eot();
733          return true;
734       }
735       dev_errno = errno;
736       berrno be;
737       Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
738              print_name(), be.bstrerror());
739       Dmsg0(100, errmsg);
740       return false;
741    }
742 #ifdef MTEOM
743    if (has_cap(CAP_FASTFSF) && !has_cap(CAP_EOM)) {
744       Dmsg0(100,"Using FAST FSF for EOM\n");
745       /* If unknown position, rewind */
746       if (get_os_tape_file() < 0) {
747         if (!rewind(NULL)) {
748           Dmsg0(100, "Rewind error\n");
749           return false;
750         }
751       }
752       mt_com.mt_op = MTFSF;
753       /*
754        * ***FIXME*** fix code to handle case that INT16_MAX is
755        *   not large enough.
756        */
757       mt_com.mt_count = INT16_MAX;    /* use big positive number */
758       if (mt_com.mt_count < 0) {
759          mt_com.mt_count = INT16_MAX; /* brain damaged system */
760       }
761    }
762
763    if (has_cap(CAP_MTIOCGET) && (has_cap(CAP_FASTFSF) || has_cap(CAP_EOM))) {
764       if (has_cap(CAP_EOM)) {
765          Dmsg0(100,"Using EOM for EOM\n");
766          mt_com.mt_op = MTEOM;
767          mt_com.mt_count = 1;
768       }
769
770       if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
771          berrno be;
772          clrerror(mt_com.mt_op);
773          Dmsg1(50, "ioctl error: %s\n", be.bstrerror());
774          update_pos(dcr);
775          Mmsg2(errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
776             print_name(), be.bstrerror());
777          Dmsg0(100, errmsg);
778          return false;
779       }
780
781       os_file = get_os_tape_file();
782       if (os_file < 0) {
783          berrno be;
784          clrerror(-1);
785          Mmsg2(errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
786             print_name(), be.bstrerror());
787          Dmsg0(100, errmsg);
788          return false;
789       }
790       Dmsg1(100, "EOD file=%d\n", os_file);
791       set_ateof();
792       file = os_file;
793    } else {
794 #else
795    {
796 #endif
797       /*
798        * Rewind then use FSF until EOT reached
799        */
800       if (!rewind(NULL)) {
801          Dmsg0(100, "Rewind error.\n");
802          return false;
803       }
804       /*
805        * Move file by file to the end of the tape
806        */
807       int file_num;
808       for (file_num=file; !at_eot(); file_num++) {
809          Dmsg0(200, "eod: doing fsf 1\n");
810          if (!fsf(1)) {
811             Dmsg0(100, "fsf error.\n");
812             return false;
813          }
814          /*
815           * Avoid infinite loop by ensuring we advance.
816           */
817          if (!at_eot() && file_num == (int)file) {
818             Dmsg1(100, "fsf did not advance from file %d\n", file_num);
819             set_ateof();
820             os_file = get_os_tape_file();
821             if (os_file >= 0) {
822                Dmsg2(100, "Adjust file from %d to %d\n", file_num, os_file);
823                file = os_file;
824             }       
825             break;
826          }
827       }
828    }
829    /*
830     * Some drivers leave us after second EOF when doing
831     * MTEOM, so we must backup so that appending overwrites
832     * the second EOF.
833     */
834    if (has_cap(CAP_BSFATEOM)) {
835       /* Backup over EOF */
836       ok = bsf(1);
837       /* If BSF worked and fileno is known (not -1), set file */
838       os_file = get_os_tape_file();
839       if (os_file >= 0) {
840          Dmsg2(100, "BSFATEOF adjust file from %d to %d\n", file , os_file);
841          file = os_file;
842       } else {
843          file++;                       /* wing it -- not correct on all OSes */
844       }
845    } else {
846       update_pos(dcr);                 /* update position */
847    }
848    Dmsg1(200, "EOD dev->file=%d\n", file);
849    return ok;
850 }
851
852 /*
853  * Set the position of the device -- only for files and DVD
854  *   For other devices, there is no generic way to do it.
855  *  Returns: true  on succes
856  *           false on error
857  */
858 bool DEVICE::update_pos(DCR *dcr)
859 {
860    boffset_t pos;
861    bool ok = true;
862
863    if (!is_open()) {
864       dev_errno = EBADF;
865       Mmsg0(errmsg, _("Bad device call. Device not open\n"));
866       Emsg1(M_FATAL, 0, "%s", errmsg);
867       return false;
868    }
869
870    if (is_file()) {
871       file = 0;
872       file_addr = 0;
873       pos = lseek(dcr, (boffset_t)0, SEEK_CUR);
874       if (pos < 0) {
875          berrno be;
876          dev_errno = errno;
877          Pmsg1(000, _("Seek error: ERR=%s\n"), be.bstrerror());
878          Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
879                print_name(), be.bstrerror());
880          ok = false;
881       } else {
882          file_addr = pos;
883          block_num = (uint32_t)pos;
884          file = (uint32_t)(pos >> 32);
885       }
886    }
887    return ok;
888 }
889
890 /*
891  * Return the status of the device.  This was meant
892  * to be a generic routine. Unfortunately, it doesn't
893  * seem possible (at least I do not know how to do it
894  * currently), which means that for the moment, this
895  * routine has very little value.
896  *
897  *   Returns: status
898  */
899 uint32_t status_dev(DEVICE *dev)
900 {
901    struct mtget mt_stat;
902    uint32_t stat = 0;
903
904    if (dev->state & (ST_EOT | ST_WEOT)) {
905       stat |= BMT_EOD;
906       Pmsg0(-20, " EOD");
907    }
908    if (dev->state & ST_EOF) {
909       stat |= BMT_EOF;
910       Pmsg0(-20, " EOF");
911    }
912    if (dev->is_tape()) {
913       stat |= BMT_TAPE;
914       Pmsg0(-20,_(" Bacula status:"));
915       Pmsg2(-20,_(" file=%d block=%d\n"), dev->file, dev->block_num);
916       if (dev->d_ioctl(dev->fd(), MTIOCGET, (char *)&mt_stat) < 0) {
917          berrno be;
918          dev->dev_errno = errno;
919          Mmsg2(dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
920             dev->print_name(), be.bstrerror());
921          return 0;
922       }
923       Pmsg0(-20, _(" Device status:"));
924
925 #if defined(HAVE_LINUX_OS)
926       if (GMT_EOF(mt_stat.mt_gstat)) {
927          stat |= BMT_EOF;
928          Pmsg0(-20, " EOF");
929       }
930       if (GMT_BOT(mt_stat.mt_gstat)) {
931          stat |= BMT_BOT;
932          Pmsg0(-20, " BOT");
933       }
934       if (GMT_EOT(mt_stat.mt_gstat)) {
935          stat |= BMT_EOT;
936          Pmsg0(-20, " EOT");
937       }
938       if (GMT_SM(mt_stat.mt_gstat)) {
939          stat |= BMT_SM;
940          Pmsg0(-20, " SM");
941       }
942       if (GMT_EOD(mt_stat.mt_gstat)) {
943          stat |= BMT_EOD;
944          Pmsg0(-20, " EOD");
945       }
946       if (GMT_WR_PROT(mt_stat.mt_gstat)) {
947          stat |= BMT_WR_PROT;
948          Pmsg0(-20, " WR_PROT");
949       }
950       if (GMT_ONLINE(mt_stat.mt_gstat)) {
951          stat |= BMT_ONLINE;
952          Pmsg0(-20, " ONLINE");
953       }
954       if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
955          stat |= BMT_DR_OPEN;
956          Pmsg0(-20, " DR_OPEN");
957       }
958       if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
959          stat |= BMT_IM_REP_EN;
960          Pmsg0(-20, " IM_REP_EN");
961       }
962 #elif defined(HAVE_WIN32)
963       if (GMT_EOF(mt_stat.mt_gstat)) {
964          stat |= BMT_EOF;
965          Pmsg0(-20, " EOF");
966       }
967       if (GMT_BOT(mt_stat.mt_gstat)) {
968          stat |= BMT_BOT;
969          Pmsg0(-20, " BOT");
970       }
971       if (GMT_EOT(mt_stat.mt_gstat)) {
972          stat |= BMT_EOT;
973          Pmsg0(-20, " EOT");
974       }
975       if (GMT_EOD(mt_stat.mt_gstat)) {
976          stat |= BMT_EOD;
977          Pmsg0(-20, " EOD");
978       }
979       if (GMT_WR_PROT(mt_stat.mt_gstat)) {
980          stat |= BMT_WR_PROT;
981          Pmsg0(-20, " WR_PROT");
982       }
983       if (GMT_ONLINE(mt_stat.mt_gstat)) {
984          stat |= BMT_ONLINE;
985          Pmsg0(-20, " ONLINE");
986       }
987       if (GMT_DR_OPEN(mt_stat.mt_gstat)) {
988          stat |= BMT_DR_OPEN;
989          Pmsg0(-20, " DR_OPEN");
990       }
991       if (GMT_IM_REP_EN(mt_stat.mt_gstat)) {
992          stat |= BMT_IM_REP_EN;
993          Pmsg0(-20, " IM_REP_EN");
994       }
995
996 #endif /* !SunOS && !OSF */
997       if (dev->has_cap(CAP_MTIOCGET)) {
998          Pmsg2(-20, _(" file=%d block=%d\n"), mt_stat.mt_fileno, mt_stat.mt_blkno);
999       } else {
1000          Pmsg2(-20, _(" file=%d block=%d\n"), -1, -1);
1001       }
1002    } else {
1003       stat |= BMT_ONLINE | BMT_BOT;
1004    }
1005    return stat;
1006 }
1007
1008
1009 /*
1010  * Load medium in device
1011  *  Returns: true  on success
1012  *           false on failure
1013  */
1014 bool load_dev(DEVICE *dev)
1015 {
1016 #ifdef MTLOAD
1017    struct mtop mt_com;
1018 #endif
1019
1020    if (dev->fd() < 0) {
1021       dev->dev_errno = EBADF;
1022       Mmsg0(dev->errmsg, _("Bad call to load_dev. Device not open\n"));
1023       Emsg0(M_FATAL, 0, dev->errmsg);
1024       return false;
1025    }
1026    if (!(dev->is_tape())) {
1027       return true;
1028    }
1029 #ifndef MTLOAD
1030    Dmsg0(200, "stored: MTLOAD command not available\n");
1031    berrno be;
1032    dev->dev_errno = ENOTTY;           /* function not available */
1033    Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1034          dev->print_name(), be.bstrerror());
1035    return false;
1036 #else
1037
1038    dev->block_num = dev->file = 0;
1039    dev->file_size = 0;
1040    dev->file_addr = 0;
1041    mt_com.mt_op = MTLOAD;
1042    mt_com.mt_count = 1;
1043    if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
1044       berrno be;
1045       dev->dev_errno = errno;
1046       Mmsg2(dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
1047          dev->print_name(), be.bstrerror());
1048       return false;
1049    }
1050    return true;
1051 #endif
1052 }
1053
1054 /*
1055  * Rewind device and put it offline
1056  *  Returns: true  on success
1057  *           false on failure
1058  */
1059 bool DEVICE::offline()
1060 {
1061    struct mtop mt_com;
1062
1063    if (!is_tape()) {
1064       return true;                    /* device not open */
1065    }
1066
1067    state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT);  /* remove EOF/EOT flags */
1068    block_num = file = 0;
1069    file_size = 0;
1070    file_addr = 0;
1071    unlock_door();
1072    mt_com.mt_op = MTOFFL;
1073    mt_com.mt_count = 1;
1074    if (d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com) < 0) {
1075       berrno be;
1076       dev_errno = errno;
1077       Mmsg2(errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
1078          print_name(), be.bstrerror());
1079       return false;
1080    }
1081    Dmsg1(100, "Offlined device %s\n", print_name());
1082    return true;
1083 }
1084
1085 bool DEVICE::offline_or_rewind()
1086 {
1087    if (m_fd < 0) {
1088       return false;
1089    }
1090    if (has_cap(CAP_OFFLINEUNMOUNT)) {
1091       return offline();
1092    } else {
1093    /*
1094     * Note, this rewind probably should not be here (it wasn't
1095     *  in prior versions of Bacula), but on FreeBSD, this is
1096     *  needed in the case the tape was "frozen" due to an error
1097     *  such as backspacing after writing and EOF. If it is not
1098     *  done, all future references to the drive get and I/O error.
1099     */
1100       clrerror(MTREW);
1101       return rewind(NULL);
1102    }
1103 }
1104
1105 /*
1106  * Foward space a file
1107  *   Returns: true  on success
1108  *            false on failure
1109  */
1110 bool DEVICE::fsf(int num)
1111 {
1112    int32_t os_file = 0;
1113    struct mtop mt_com;
1114    int stat = 0;
1115
1116    if (!is_open()) {
1117       dev_errno = EBADF;
1118       Mmsg0(errmsg, _("Bad call to fsf. Device not open\n"));
1119       Emsg0(M_FATAL, 0, errmsg);
1120       return false;
1121    }
1122
1123    if (!is_tape()) {
1124       return true;
1125    }
1126
1127    if (at_eot()) {
1128       dev_errno = 0;
1129       Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1130       return false;
1131    }
1132    if (at_eof()) {
1133       Dmsg0(200, "ST_EOF set on entry to FSF\n");
1134    }
1135
1136    Dmsg0(100, "fsf\n");
1137    block_num = 0;
1138    /*
1139     * If Fast forward space file is set, then we
1140     *  use MTFSF to forward space and MTIOCGET
1141     *  to get the file position. We assume that
1142     *  the SCSI driver will ensure that we do not
1143     *  forward space past the end of the medium.
1144     */
1145    if (has_cap(CAP_FSF) && has_cap(CAP_MTIOCGET) && has_cap(CAP_FASTFSF)) {
1146       int my_errno = 0;
1147       mt_com.mt_op = MTFSF;
1148       mt_com.mt_count = num;
1149       stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1150       if (stat < 0) {
1151          my_errno = errno;            /* save errno */
1152       } else if ((os_file=get_os_tape_file()) < 0) {
1153          my_errno = errno;            /* save errno */
1154       }
1155       if (my_errno != 0) {
1156          berrno be;
1157          set_eot();
1158          Dmsg0(200, "Set ST_EOT\n");
1159          clrerror(MTFSF);
1160          Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1161             print_name(), be.bstrerror(my_errno));
1162          Dmsg1(200, "%s", errmsg);
1163          return false;
1164       }
1165
1166       Dmsg1(200, "fsf file=%d\n", os_file);
1167       set_ateof();
1168       file = os_file;
1169       return true;
1170
1171    /*
1172     * Here if CAP_FSF is set, and virtually all drives
1173     *  these days support it, we read a record, then forward
1174     *  space one file. Using this procedure, which is slow,
1175     *  is the only way we can be sure that we don't read
1176     *  two consecutive EOF marks, which means End of Data.
1177     */
1178    } else if (has_cap(CAP_FSF)) {
1179       POOLMEM *rbuf;
1180       int rbuf_len;
1181       Dmsg0(200, "FSF has cap_fsf\n");
1182       if (max_block_size == 0) {
1183          rbuf_len = DEFAULT_BLOCK_SIZE;
1184       } else {
1185          rbuf_len = max_block_size;
1186       }
1187       rbuf = get_memory(rbuf_len);
1188       mt_com.mt_op = MTFSF;
1189       mt_com.mt_count = 1;
1190       while (num-- && !at_eot()) {
1191          Dmsg0(100, "Doing read before fsf\n");
1192          if ((stat = this->read((char *)rbuf, rbuf_len)) < 0) {
1193             if (errno == ENOMEM) {     /* tape record exceeds buf len */
1194                stat = rbuf_len;        /* This is OK */
1195             /*
1196              * On IBM drives, they return ENOSPC at EOM
1197              *  instead of EOF status
1198              */
1199             } else if (at_eof() && errno == ENOSPC) {
1200                stat = 0;
1201             } else {
1202                berrno be;
1203                set_eot();
1204                clrerror(-1);
1205                Dmsg2(100, "Set ST_EOT read errno=%d. ERR=%s\n", dev_errno,
1206                   be.bstrerror());
1207                Mmsg2(errmsg, _("read error on %s. ERR=%s.\n"),
1208                   print_name(), be.bstrerror());
1209                Dmsg1(100, "%s", errmsg);
1210                break;
1211             }
1212          }
1213          if (stat == 0) {                /* EOF */
1214             Dmsg1(100, "End of File mark from read. File=%d\n", file+1);
1215             /* Two reads of zero means end of tape */
1216             if (at_eof()) {
1217                set_eot();
1218                Dmsg0(100, "Set ST_EOT\n");
1219                break;
1220             } else {
1221                set_ateof();
1222                continue;
1223             }
1224          } else {                        /* Got data */
1225             clear_eot();
1226             clear_eof();
1227          }
1228
1229          Dmsg0(100, "Doing MTFSF\n");
1230          stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1231          if (stat < 0) {                 /* error => EOT */
1232             berrno be;
1233             set_eot();
1234             Dmsg0(100, "Set ST_EOT\n");
1235             clrerror(MTFSF);
1236             Mmsg2(errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
1237                print_name(), be.bstrerror());
1238             Dmsg0(100, "Got < 0 for MTFSF\n");
1239             Dmsg1(100, "%s", errmsg);
1240          } else {
1241             set_ateof();
1242          }
1243       }
1244       free_memory(rbuf);
1245
1246    /*
1247     * No FSF, so use FSR to simulate it
1248     */
1249    } else {
1250       Dmsg0(200, "Doing FSR for FSF\n");
1251       while (num-- && !at_eot()) {
1252          fsr(INT32_MAX);    /* returns -1 on EOF or EOT */
1253       }
1254       if (at_eot()) {
1255          dev_errno = 0;
1256          Mmsg1(errmsg, _("Device %s at End of Tape.\n"), print_name());
1257          stat = -1;
1258       } else {
1259          stat = 0;
1260       }
1261    }
1262    Dmsg1(200, "Return %d from FSF\n", stat);
1263    if (at_eof()) {
1264       Dmsg0(200, "ST_EOF set on exit FSF\n");
1265    }
1266    if (at_eot()) {
1267       Dmsg0(200, "ST_EOT set on exit FSF\n");
1268    }
1269    Dmsg1(200, "Return from FSF file=%d\n", file);
1270    return stat == 0;
1271 }
1272
1273 /*
1274  * Backward space a file
1275  *  Returns: false on failure
1276  *           true  on success
1277  */
1278 bool DEVICE::bsf(int num)
1279 {
1280    struct mtop mt_com;
1281    int stat;
1282
1283    if (!is_open()) {
1284       dev_errno = EBADF;
1285       Mmsg0(errmsg, _("Bad call to bsf. Device not open\n"));
1286       Emsg0(M_FATAL, 0, errmsg);
1287       return false;
1288    }
1289
1290    if (!is_tape()) {
1291       Mmsg1(errmsg, _("Device %s cannot BSF because it is not a tape.\n"),
1292          print_name());
1293       return false;
1294    }
1295
1296    Dmsg0(100, "bsf\n");
1297    clear_eot();
1298    clear_eof();
1299    file -= num;
1300    file_addr = 0;
1301    file_size = 0;
1302    mt_com.mt_op = MTBSF;
1303    mt_com.mt_count = num;
1304    stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1305    if (stat < 0) {
1306       berrno be;
1307       clrerror(MTBSF);
1308       Mmsg2(errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
1309          print_name(), be.bstrerror());
1310    }
1311    return stat == 0;
1312 }
1313
1314
1315 /*
1316  * Foward space num records
1317  *  Returns: false on failure
1318  *           true  on success
1319  */
1320 bool DEVICE::fsr(int num)
1321 {
1322    struct mtop mt_com;
1323    int stat;
1324
1325    if (!is_open()) {
1326       dev_errno = EBADF;
1327       Mmsg0(errmsg, _("Bad call to fsr. Device not open\n"));
1328       Emsg0(M_FATAL, 0, errmsg);
1329       return false;
1330    }
1331
1332    if (!is_tape()) {
1333       return false;
1334    }
1335
1336    if (!has_cap(CAP_FSR)) {
1337       Mmsg1(errmsg, _("ioctl MTFSR not permitted on %s.\n"), print_name());
1338       return false;
1339    }
1340
1341    Dmsg1(100, "fsr %d\n", num);
1342    mt_com.mt_op = MTFSR;
1343    mt_com.mt_count = num;
1344    stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1345    if (stat == 0) {
1346       clear_eof();
1347       block_num += num;
1348    } else {
1349       berrno be;
1350       struct mtget mt_stat;
1351       clrerror(MTFSR);
1352       Dmsg1(100, "FSF fail: ERR=%s\n", be.bstrerror());
1353       if (dev_get_os_pos(this, &mt_stat)) {
1354          Dmsg4(100, "Adjust from %d:%d to %d:%d\n", file,
1355             block_num, mt_stat.mt_fileno, mt_stat.mt_blkno);
1356          file = mt_stat.mt_fileno;
1357          block_num = mt_stat.mt_blkno;
1358       } else {
1359          if (at_eof()) {
1360             set_eot();
1361          } else {
1362             set_ateof();
1363          }
1364       }
1365       Mmsg3(errmsg, _("ioctl MTFSR %d error on %s. ERR=%s.\n"),
1366          num, print_name(), be.bstrerror());
1367    }
1368    return stat == 0;
1369 }
1370
1371 /*
1372  * Backward space a record
1373  *   Returns:  false on failure
1374  *             true  on success
1375  */
1376 bool DEVICE::bsr(int num)
1377 {
1378    struct mtop mt_com;
1379    int stat;
1380
1381    if (!is_open()) {
1382       dev_errno = EBADF;
1383       Mmsg0(errmsg, _("Bad call to bsr_dev. Device not open\n"));
1384       Emsg0(M_FATAL, 0, errmsg);
1385       return false;
1386    }
1387
1388    if (!is_tape()) {
1389       return false;
1390    }
1391
1392    if (!has_cap(CAP_BSR)) {
1393       Mmsg1(errmsg, _("ioctl MTBSR not permitted on %s.\n"), print_name());
1394       return false;
1395    }
1396
1397    Dmsg0(100, "bsr_dev\n");
1398    block_num -= num;
1399    clear_eof();
1400    clear_eot();
1401    mt_com.mt_op = MTBSR;
1402    mt_com.mt_count = num;
1403    stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1404    if (stat < 0) {
1405       berrno be;
1406       clrerror(MTBSR);
1407       Mmsg2(errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
1408          print_name(), be.bstrerror());
1409    }
1410    return stat == 0;
1411 }
1412
1413 void DEVICE::lock_door()
1414 {
1415 #ifdef MTLOCK
1416    struct mtop mt_com;
1417    if (!is_tape()) return;
1418    mt_com.mt_op = MTLOCK;
1419    mt_com.mt_count = 1;
1420    d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1421 #endif
1422 }
1423
1424 void DEVICE::unlock_door()
1425 {
1426 #ifdef MTUNLOCK
1427    struct mtop mt_com;
1428    if (!is_tape()) return;
1429    mt_com.mt_op = MTUNLOCK;
1430    mt_com.mt_count = 1;
1431    d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1432 #endif
1433 }
1434
1435 void DEVICE::set_slot(int32_t slot)
1436
1437    m_slot = slot; 
1438    if (vol) vol->clear_slot();
1439 }
1440
1441 void DEVICE::clear_slot()
1442
1443    m_slot = -1; 
1444    if (vol) vol->set_slot(-1);
1445 }
1446
1447  
1448
1449 /*
1450  * Reposition the device to file, block
1451  * Returns: false on failure
1452  *          true  on success
1453  */
1454 bool DEVICE::reposition(DCR *dcr, uint32_t rfile, uint32_t rblock)
1455 {
1456    if (!is_open()) {
1457       dev_errno = EBADF;
1458       Mmsg0(errmsg, _("Bad call to reposition. Device not open\n"));
1459       Emsg0(M_FATAL, 0, errmsg);
1460       return false;
1461    }
1462
1463    if (!is_tape()) {
1464       boffset_t pos = (((boffset_t)rfile)<<32) | rblock;
1465       Dmsg1(100, "===== lseek to %d\n", (int)pos);
1466       if (lseek(dcr, pos, SEEK_SET) == (boffset_t)-1) {
1467          berrno be;
1468          dev_errno = errno;
1469          Mmsg2(errmsg, _("lseek error on %s. ERR=%s.\n"),
1470             print_name(), be.bstrerror());
1471          return false;
1472       }
1473       file = rfile;
1474       block_num = rblock;
1475       file_addr = pos;
1476       return true;
1477    }
1478
1479    /* After this point, we are tape only */
1480    Dmsg4(100, "reposition from %u:%u to %u:%u\n", file, block_num, rfile, rblock);
1481    if (rfile < file) {
1482       Dmsg0(100, "Rewind\n");
1483       if (!rewind(NULL)) {
1484          return false;
1485       }
1486    }
1487    if (rfile > file) {
1488       Dmsg1(100, "fsf %d\n", rfile-file);
1489       if (!fsf(rfile-file)) {
1490          Dmsg1(100, "fsf failed! ERR=%s\n", bstrerror());
1491          return false;
1492       }
1493       Dmsg2(100, "wanted_file=%d at_file=%d\n", rfile, file);
1494    }
1495    if (rblock < block_num) {
1496       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1497       Dmsg0(100, "bsf 1\n");
1498       bsf(1);
1499       Dmsg0(100, "fsf 1\n");
1500       fsf(1);
1501       Dmsg2(100, "wanted_blk=%d at_blk=%d\n", rblock, block_num);
1502    }
1503    if (has_cap(CAP_POSITIONBLOCKS) && rblock > block_num) {
1504       /* Ignore errors as Bacula can read to the correct block */
1505       Dmsg1(100, "fsr %d\n", rblock-block_num);
1506       return fsr(rblock-block_num);
1507    } else {
1508       while (rblock > block_num) {
1509          if (!dcr->read_block_from_dev(NO_BLOCK_NUMBER_CHECK)) {
1510             berrno be;
1511             dev_errno = errno;
1512             Dmsg2(30, "Failed to find requested block on %s: ERR=%s",
1513                print_name(), be.bstrerror());
1514             return false;
1515          }
1516          Dmsg2(300, "moving forward wanted_blk=%d at_blk=%d\n", rblock, block_num);
1517       }
1518    }
1519    return true;
1520 }
1521
1522
1523
1524 /*
1525  * Write an end of file on the device
1526  *   Returns: true on success
1527  *            false on failure
1528  */
1529 bool DEVICE::weof(int num)
1530 {
1531    struct mtop mt_com;
1532    int stat;
1533    Dmsg1(129, "=== weof_dev=%s\n", print_name());
1534    
1535    if (!is_open()) {
1536       dev_errno = EBADF;
1537       Mmsg0(errmsg, _("Bad call to weof_dev. Device not open\n"));
1538       Emsg0(M_FATAL, 0, errmsg);
1539       return false;
1540    }
1541    file_size = 0;
1542
1543    if (!is_tape()) {
1544       return true;
1545    }
1546    if (!can_append()) {
1547       Mmsg0(errmsg, _("Attempt to WEOF on non-appendable Volume\n"));
1548       Emsg0(M_FATAL, 0, errmsg);
1549       return false;
1550    }
1551       
1552    clear_eof();
1553    clear_eot();
1554    mt_com.mt_op = MTWEOF;
1555    mt_com.mt_count = num;
1556    stat = d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1557    if (stat == 0) {
1558       block_num = 0;
1559       file += num;
1560       file_addr = 0;
1561    } else {
1562       berrno be;
1563       clrerror(MTWEOF);
1564       if (stat == -1) {
1565          Mmsg2(errmsg, _("ioctl MTWEOF error on %s. ERR=%s.\n"),
1566             print_name(), be.bstrerror());
1567        }
1568    }
1569    return stat == 0;
1570 }
1571
1572
1573 /*
1574  * If implemented in system, clear the tape
1575  * error status.
1576  */
1577 void DEVICE::clrerror(int func)
1578 {
1579    const char *msg = NULL;
1580    char buf[100];
1581
1582    dev_errno = errno;         /* save errno */
1583    if (errno == EIO) {
1584       VolCatInfo.VolCatErrors++;
1585    }
1586
1587    if (!is_tape()) {
1588       return;
1589    }
1590
1591    if (errno == ENOTTY || errno == ENOSYS) { /* Function not implemented */
1592       switch (func) {
1593       case -1:
1594          break;                  /* ignore message printed later */
1595       case MTWEOF:
1596          msg = "WTWEOF";
1597          clear_cap(CAP_EOF);     /* turn off feature */
1598          break;
1599 #ifdef MTEOM
1600       case MTEOM:
1601          msg = "WTEOM";
1602          clear_cap(CAP_EOM);     /* turn off feature */
1603          break;
1604 #endif
1605       case MTFSF:
1606          msg = "MTFSF";
1607          clear_cap(CAP_FSF);     /* turn off feature */
1608          break;
1609       case MTBSF:
1610          msg = "MTBSF";
1611          clear_cap(CAP_BSF);     /* turn off feature */
1612          break;
1613       case MTFSR:
1614          msg = "MTFSR";
1615          clear_cap(CAP_FSR);     /* turn off feature */
1616          break;
1617       case MTBSR:
1618          msg = "MTBSR";
1619          clear_cap(CAP_BSR);     /* turn off feature */
1620          break;
1621       case MTREW:
1622          msg = "MTREW";
1623          break;
1624 #ifdef MTSETBLK
1625       case MTSETBLK:
1626          msg = "MTSETBLK";
1627          break;
1628 #endif
1629 #ifdef MTSETDRVBUFFER
1630       case MTSETDRVBUFFER:
1631          msg = "MTSETDRVBUFFER";
1632          break;
1633 #endif
1634 #ifdef MTRESET
1635       case MTRESET:
1636          msg = "MTRESET";
1637          break;
1638 #endif
1639
1640 #ifdef MTSETBSIZ 
1641       case MTSETBSIZ:
1642          msg = "MTSETBSIZ";
1643          break;
1644 #endif
1645 #ifdef MTSRSZ
1646       case MTSRSZ:
1647          msg = "MTSRSZ";
1648          break;
1649 #endif
1650 #ifdef MTLOAD
1651       case MTLOAD:
1652          msg = "MTLOAD";
1653          break;
1654 #endif
1655 #ifdef MTUNLOCK
1656       case MTUNLOCK:
1657          msg = "MTUNLOCK";
1658          break;
1659 #endif
1660       case MTOFFL:
1661          msg = "MTOFFL";
1662          break;
1663       default:
1664          bsnprintf(buf, sizeof(buf), _("unknown func code %d"), func);
1665          msg = buf;
1666          break;
1667       }
1668       if (msg != NULL) {
1669          dev_errno = ENOSYS;
1670          Mmsg1(errmsg, _("I/O function \"%s\" not supported on this device.\n"), msg);
1671          Emsg0(M_ERROR, 0, errmsg);
1672       }
1673    }
1674
1675    /*
1676     * Now we try different methods of clearing the error
1677     *  status on the drive so that it is not locked for
1678     *  further operations.
1679     */
1680
1681    /* On some systems such as NetBSD, this clears all errors */
1682    get_os_tape_file();
1683
1684 /* Found on Solaris */
1685 #ifdef MTIOCLRERR
1686 {
1687    d_ioctl(m_fd, MTIOCLRERR);
1688    Dmsg0(200, "Did MTIOCLRERR\n");
1689 }
1690 #endif
1691
1692 /* Typically on FreeBSD */
1693 #ifdef MTIOCERRSTAT
1694 {
1695   berrno be;
1696    /* Read and clear SCSI error status */
1697    union mterrstat mt_errstat;
1698    Dmsg2(200, "Doing MTIOCERRSTAT errno=%d ERR=%s\n", dev_errno,
1699       be.bstrerror(dev_errno));
1700    d_ioctl(m_fd, MTIOCERRSTAT, (char *)&mt_errstat);
1701 }
1702 #endif
1703
1704 /* Clear Subsystem Exception TRU64 */
1705 #ifdef MTCSE
1706 {
1707    struct mtop mt_com;
1708    mt_com.mt_op = MTCSE;
1709    mt_com.mt_count = 1;
1710    /* Clear any error condition on the tape */
1711    d_ioctl(m_fd, MTIOCTOP, (char *)&mt_com);
1712    Dmsg0(200, "Did MTCSE\n");
1713 }
1714 #endif
1715 }
1716
1717
1718 /*
1719  * Set to unload the current volume in the drive
1720  */
1721 void DEVICE::set_unload()
1722 {
1723    if (!m_unload && VolHdr.VolumeName[0] != 0) {
1724        m_unload = true;
1725        memcpy(UnloadVolName, VolHdr.VolumeName, sizeof(UnloadVolName));
1726    }
1727 }
1728
1729
1730 /*
1731  * Clear volume header
1732  */
1733 void DEVICE::clear_volhdr()
1734 {
1735    Dmsg1(100, "Clear volhdr vol=%s\n", VolHdr.VolumeName);
1736    memset(&VolHdr, 0, sizeof(VolHdr));
1737    setVolCatInfo(false);
1738 }
1739
1740
1741 /*
1742  * Close the device
1743  */
1744 void DEVICE::close()
1745 {
1746    Dmsg1(100, "close_dev %s\n", print_name());
1747    offline_or_rewind();
1748
1749    if (!is_open()) {
1750       Dmsg2(100, "device %s already closed vol=%s\n", print_name(),
1751          VolHdr.VolumeName);
1752       return;                         /* already closed */
1753    }
1754
1755    switch (dev_type) {
1756    case B_VTL_DEV:
1757    case B_VTAPE_DEV:
1758    case B_TAPE_DEV:
1759       unlock_door();
1760       /* Fall through wanted */
1761    default:
1762       d_close(m_fd);
1763       break;
1764    }
1765
1766    unmount(1);                        /* do unmount if required */
1767
1768    /* Clean up device packet so it can be reused */
1769    clear_opened();
1770    /*
1771     * Be careful not to clear items needed by the DVD driver
1772     *    when it is closing a single part.
1773     */
1774    state &= ~(ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF|
1775               ST_MOUNTED|ST_MEDIA|ST_SHORT);
1776    label_type = B_BACULA_LABEL;
1777    file = block_num = 0;
1778    file_size = 0;
1779    file_addr = 0;
1780    EndFile = EndBlock = 0;
1781    openmode = 0;
1782    clear_volhdr();
1783    memset(&VolCatInfo, 0, sizeof(VolCatInfo));
1784    if (tid) {
1785       stop_thread_timer(tid);
1786       tid = 0;
1787    }
1788 }
1789
1790 /*
1791  * This call closes the device, but it is used in DVD handling
1792  *  where we close one part and then open the next part. The
1793  *  difference between close_part() and close() is that close_part()
1794  *  saves the state information of the device (e.g. the Volume lable,
1795  *  the Volume Catalog record, ...  This permits opening and closing
1796  *  the Volume parts multiple times without losing track of what the    
1797  *  main Volume parameters are.
1798  */
1799 void DEVICE::close_part(DCR * /*dcr*/)
1800 {
1801    VOLUME_LABEL saveVolHdr;
1802    VOLUME_CAT_INFO saveVolCatInfo;     /* Volume Catalog Information */
1803
1804
1805    saveVolHdr = VolHdr;               /* structure assignment */
1806    saveVolCatInfo = VolCatInfo;       /* structure assignment */
1807    close();                           /* close current part */
1808    VolHdr = saveVolHdr;               /* structure assignment */
1809    VolCatInfo = saveVolCatInfo;       /* structure assignment */
1810 }
1811
1812 boffset_t DEVICE::lseek(DCR *dcr, boffset_t offset, int whence)
1813 {
1814    switch (dev_type) {
1815    case B_FILE_DEV:
1816 #if defined(HAVE_WIN32)
1817       return ::_lseeki64(m_fd, (__int64)offset, whence);
1818 #else
1819       return ::lseek(m_fd, offset, whence);
1820 #endif
1821    }
1822    return -1;
1823 }
1824
1825 /*
1826  * Truncate a volume.
1827  */
1828 bool DEVICE::truncate(DCR *dcr) /* We need the DCR for DVD-writing */
1829 {
1830    struct stat st;
1831    DEVICE *dev = this;
1832
1833    Dmsg1(100, "truncate %s\n", print_name());
1834    switch (dev_type) {
1835    case B_VTL_DEV:
1836    case B_VTAPE_DEV:
1837    case B_TAPE_DEV:
1838       /* maybe we should rewind and write and eof ???? */
1839       return true;                    /* we don't really truncate tapes */
1840    case B_FILE_DEV:
1841       for ( ;; ) {
1842          if (ftruncate(dev->m_fd, 0) != 0) {
1843             berrno be;
1844             Mmsg2(errmsg, _("Unable to truncate device %s. ERR=%s\n"), 
1845                   print_name(), be.bstrerror());
1846             return false;
1847          }
1848
1849          /*
1850           * Check for a successful ftruncate() and issue a work-around for devices 
1851           * (mostly cheap NAS) that don't support truncation. 
1852           * Workaround supplied by Martin Schmid as a solution to bug #1011.
1853           * 1. close file
1854           * 2. delete file
1855           * 3. open new file with same mode
1856           * 4. change ownership to original
1857           */
1858
1859          if (fstat(dev->m_fd, &st) != 0) {
1860             berrno be;
1861             Mmsg2(errmsg, _("Unable to stat device %s. ERR=%s\n"), 
1862                   print_name(), be.bstrerror());
1863             return false;
1864          }
1865              
1866          if (st.st_size != 0) {             /* ftruncate() didn't work */
1867             POOL_MEM archive_name(PM_FNAME);
1868                    
1869             pm_strcpy(archive_name, dev_name);
1870             if (!IsPathSeparator(archive_name.c_str()[strlen(archive_name.c_str())-1])) {
1871                pm_strcat(archive_name, "/");
1872             }
1873             pm_strcat(archive_name, dcr->VolumeName);
1874                       
1875             Mmsg2(errmsg, _("Device %s doesn't support ftruncate(). Recreating file %s.\n"), 
1876                   print_name(), archive_name.c_str());
1877
1878             /* Close file and blow it away */
1879             ::close(dev->m_fd);
1880             ::unlink(archive_name.c_str());
1881                       
1882             /* Recreate the file -- of course, empty */
1883             dev->set_mode(CREATE_READ_WRITE);
1884             if ((dev->m_fd = ::open(archive_name.c_str(), mode, st.st_mode)) < 0) {
1885                berrno be;
1886                dev_errno = errno;
1887                Mmsg2(errmsg, _("Could not reopen: %s, ERR=%s\n"), archive_name.c_str(), 
1888                      be.bstrerror());
1889                Dmsg1(100, "reopen failed: %s", errmsg);
1890                Emsg0(M_FATAL, 0, errmsg);
1891                return false;
1892             }
1893                       
1894             /* Reset proper owner */
1895             chown(archive_name.c_str(), st.st_uid, st.st_gid);  
1896          }
1897          break;
1898       }
1899       return true;
1900    }
1901    return false;
1902 }
1903
1904 /*
1905  * Mount the device.
1906  * If timeout, wait until the mount command returns 0.
1907  * If !timeout, try to mount the device only once.
1908  */
1909 bool DEVICE::mount(int timeout) 
1910 {
1911    Dmsg0(190, "Enter mount\n");
1912
1913    if (is_mounted()) {
1914       return true;
1915    }
1916
1917    switch (dev_type) {
1918    case B_VTL_DEV:
1919    case B_VTAPE_DEV:
1920    case B_TAPE_DEV:
1921       if (device->mount_command) {
1922          return do_tape_mount(1, timeout);
1923       }
1924       break;
1925    case B_FILE_DEV:
1926       if (requires_mount() && device->mount_command) {
1927          return do_file_mount(1, timeout);
1928       }
1929       break;
1930    default:
1931       break;
1932    }
1933
1934    return true;
1935 }
1936
1937 /*
1938  * Unmount the device
1939  * If timeout, wait until the unmount command returns 0.
1940  * If !timeout, try to unmount the device only once.
1941  */
1942 bool DEVICE::unmount(int timeout) 
1943 {
1944    Dmsg0(100, "Enter unmount\n");
1945
1946    if (!is_mounted()) {
1947       return true;
1948    }
1949
1950    switch (dev_type) {
1951    case B_VTL_DEV:
1952    case B_VTAPE_DEV:
1953    case B_TAPE_DEV:
1954       if (device->unmount_command) {
1955          return do_tape_mount(0, timeout);
1956       }
1957       break;
1958    case B_FILE_DEV:
1959    case B_DVD_DEV:
1960       if (requires_mount() && device->unmount_command) {
1961          return do_file_mount(0, timeout);
1962       }
1963       break;
1964    default:
1965       break;
1966    }
1967
1968    return true;
1969 }
1970
1971 /*
1972  * (Un)mount the device (for tape devices)
1973  */
1974 bool DEVICE::do_tape_mount(int mount, int dotimeout)
1975 {
1976    POOL_MEM ocmd(PM_FNAME);
1977    POOLMEM *results;
1978    char *icmd;
1979    int status, tries;
1980    berrno be;
1981
1982    Dsm_check(200);
1983    if (mount) {
1984       icmd = device->mount_command;
1985    } else {
1986       icmd = device->unmount_command;
1987    }
1988
1989    edit_mount_codes(ocmd, icmd);
1990
1991    Dmsg2(100, "do_tape_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
1992
1993    if (dotimeout) {
1994       /* Try at most 10 times to (un)mount the device. This should perhaps be configurable. */
1995       tries = 10;
1996    } else {
1997       tries = 1;
1998    }
1999    results = get_memory(4000);
2000
2001    /* If busy retry each second */
2002    Dmsg1(100, "do_tape_mount run_prog=%s\n", ocmd.c_str());
2003    while ((status = run_program_full_output(ocmd.c_str(), max_open_wait/2, results)) != 0) {
2004       if (tries-- > 0) {
2005          continue;
2006       }
2007
2008       Dmsg5(100, "Device %s cannot be %smounted. stat=%d result=%s ERR=%s\n", print_name(),
2009            (mount ? "" : "un"), status, results, be.bstrerror(status));
2010       Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2011            print_name(), (mount ? "" : "un"), be.bstrerror(status));
2012
2013       set_mounted(false);
2014       free_pool_memory(results);
2015       Dmsg0(200, "============ mount=0\n");
2016       Dsm_check(200);
2017       return false;
2018    }
2019
2020    set_mounted(mount);              /* set/clear mounted flag */
2021    free_pool_memory(results);
2022    Dmsg1(200, "============ mount=%d\n", mount);
2023    return true;
2024 }
2025
2026 /*
2027  * (Un)mount the device (either a FILE or DVD device)
2028  */
2029 bool DEVICE::do_file_mount(int mount, int dotimeout) 
2030 {
2031    POOL_MEM ocmd(PM_FNAME);
2032    POOLMEM *results;
2033    DIR* dp;
2034    char *icmd;
2035    struct dirent *entry, *result;
2036    int status, tries, name_max, count;
2037    berrno be;
2038
2039    Dsm_check(200);
2040    if (mount) {
2041       icmd = device->mount_command;
2042    } else {
2043       icmd = device->unmount_command;
2044    }
2045    
2046    clear_freespace_ok();
2047    edit_mount_codes(ocmd, icmd);
2048    
2049    Dmsg2(100, "do_file_mount: cmd=%s mounted=%d\n", ocmd.c_str(), !!is_mounted());
2050
2051    if (dotimeout) {
2052       /* Try at most 10 times to (un)mount the device. This should perhaps be configurable. */
2053       tries = 10;
2054    } else {
2055       tries = 1;
2056    }
2057    results = get_memory(4000);
2058
2059    /* If busy retry each second */
2060    Dmsg1(100, "do_file_mount run_prog=%s\n", ocmd.c_str());
2061    while ((status = run_program_full_output(ocmd.c_str(), max_open_wait/2, results)) != 0) {
2062       /* Doesn't work with internationalization (This is not a problem) */
2063       if (mount && fnmatch("*is already mounted on*", results, 0) == 0) {
2064          break;
2065       }
2066       if (!mount && fnmatch("* not mounted*", results, 0) == 0) {
2067          break;
2068       }
2069       if (tries-- > 0) {
2070          /* Sometimes the device cannot be mounted because it is already mounted.
2071           * Try to unmount it, then remount it */
2072          if (mount) {
2073             Dmsg1(400, "Trying to unmount the device %s...\n", print_name());
2074             do_file_mount(0, 0);
2075          }
2076          bmicrosleep(1, 0);
2077          continue;
2078       }
2079       Dmsg5(100, "Device %s cannot be %smounted. stat=%d result=%s ERR=%s\n", print_name(),
2080            (mount ? "" : "un"), status, results, be.bstrerror(status));
2081       Mmsg(errmsg, _("Device %s cannot be %smounted. ERR=%s\n"),
2082            print_name(), (mount ? "" : "un"), be.bstrerror(status));
2083
2084       /*
2085        * Now, just to be sure it is not mounted, try to read the filesystem.
2086        */
2087       name_max = pathconf(".", _PC_NAME_MAX);
2088       if (name_max < 1024) {
2089          name_max = 1024;
2090       }
2091          
2092       if (!(dp = opendir(device->mount_point))) {
2093          berrno be;
2094          dev_errno = errno;
2095          Dmsg3(100, "do_file_mount: failed to open dir %s (dev=%s), ERR=%s\n", 
2096                device->mount_point, print_name(), be.bstrerror());
2097          goto get_out;
2098       }
2099       
2100       entry = (struct dirent *)malloc(sizeof(struct dirent) + name_max + 1000);
2101       count = 0;
2102       while (1) {
2103          if ((readdir_r(dp, entry, &result) != 0) || (result == NULL)) {
2104             dev_errno = EIO;
2105             Dmsg2(129, "do_file_mount: failed to find suitable file in dir %s (dev=%s)\n", 
2106                   device->mount_point, print_name());
2107             break;
2108          }
2109          if ((strcmp(result->d_name, ".")) && (strcmp(result->d_name, "..")) && (strcmp(result->d_name, ".keep"))) {
2110             count++; /* result->d_name != ., .. or .keep (Gentoo-specific) */
2111             break;
2112          } else {
2113             Dmsg2(129, "do_file_mount: ignoring %s in %s\n", result->d_name, device->mount_point);
2114          }
2115       }
2116       free(entry);
2117       closedir(dp);
2118       
2119       Dmsg1(100, "do_file_mount: got %d files in the mount point (not counting ., .. and .keep)\n", count);
2120       
2121       if (count > 0) {
2122          /* If we got more than ., .. and .keep */
2123          /*   there must be something mounted */
2124          if (mount) {
2125             Dmsg1(100, "Did Mount by count=%d\n", count);
2126             break;
2127          } else {
2128             /* An unmount request. We failed to unmount - report an error */
2129             set_mounted(true);
2130             free_pool_memory(results);
2131             Dmsg0(200, "== error mount=1 wanted unmount\n");
2132             return false;
2133          }
2134       }
2135 get_out:
2136       set_mounted(false);
2137       free_pool_memory(results);
2138       Dmsg0(200, "============ mount=0\n");
2139       Dsm_check(200);
2140       return false;
2141    }
2142    
2143    set_mounted(mount);              /* set/clear mounted flag */
2144    free_pool_memory(results);
2145    /* Do not check free space when unmounting */
2146    if (mount && !update_freespace()) {
2147       return false;
2148    }
2149    Dmsg1(200, "============ mount=%d\n", mount);
2150    return true;
2151 }
2152
2153 /*
2154  * Edit codes into (Un)MountCommand, Write(First)PartCommand
2155  *  %% = %
2156  *  %a = archive device name
2157  *  %e = erase (set if cannot mount and first part)
2158  *  %n = part number
2159  *  %m = mount point
2160  *  %v = last part name
2161  *
2162  *  omsg = edited output message
2163  *  imsg = input string containing edit codes (%x)
2164  *
2165  */
2166 void DEVICE::edit_mount_codes(POOL_MEM &omsg, const char *imsg)
2167 {
2168    const char *p;
2169    const char *str;
2170    char add[20];
2171    
2172    POOL_MEM archive_name(PM_FNAME);
2173
2174    omsg.c_str()[0] = 0;
2175    Dmsg1(800, "edit_mount_codes: %s\n", imsg);
2176    for (p=imsg; *p; p++) {
2177       if (*p == '%') {
2178          switch (*++p) {
2179          case '%':
2180             str = "%";
2181             break;
2182          case 'a':
2183             str = dev_name;
2184             break;
2185          case 'e':
2186             if (num_dvd_parts == 0) {
2187                if (truncating || blank_dvd) {
2188                   str = "2";
2189                } else {
2190                   str = "1";
2191                }
2192             } else {
2193                str = "0";
2194             }
2195             break;
2196          case 'n':
2197             bsnprintf(add, sizeof(add), "%d", part);
2198             str = add;
2199             break;
2200          case 'm':
2201             str = device->mount_point;
2202             break;
2203          case 'v':
2204             make_spooled_dvd_filename(this, archive_name);
2205             str = archive_name.c_str();
2206             break;
2207          default:
2208             add[0] = '%';
2209             add[1] = *p;
2210             add[2] = 0;
2211             str = add;
2212             break;
2213          }
2214       } else {
2215          add[0] = *p;
2216          add[1] = 0;
2217          str = add;
2218       }
2219       Dmsg1(1900, "add_str %s\n", str);
2220       pm_strcat(omsg, (char *)str);
2221       Dmsg1(1800, "omsg=%s\n", omsg.c_str());
2222    }
2223 }
2224
2225 /* return the last timer interval (ms) 
2226  * or 0 if something goes wrong
2227  */
2228 btime_t DEVICE::get_timer_count()
2229 {
2230    btime_t temp = last_timer;
2231    last_timer = get_current_btime();
2232    temp = last_timer - temp;   /* get elapsed time */
2233    return (temp>0)?temp:0;     /* take care of skewed clock */
2234 }
2235
2236 /* read from fd */
2237 ssize_t DEVICE::read(void *buf, size_t len)
2238 {
2239    ssize_t read_len ;
2240
2241    get_timer_count();
2242
2243    read_len = d_read(m_fd, buf, len);
2244
2245    last_tick = get_timer_count();
2246
2247    DevReadTime += last_tick;
2248    VolCatInfo.VolReadTime += last_tick;
2249
2250    if (read_len > 0) {          /* skip error */
2251       DevReadBytes += read_len;
2252    }
2253
2254    return read_len;   
2255 }
2256
2257 /* write to fd */
2258 ssize_t DEVICE::write(const void *buf, size_t len)
2259 {
2260    ssize_t write_len ;
2261
2262    get_timer_count();
2263
2264    write_len = d_write(m_fd, buf, len);
2265
2266    last_tick = get_timer_count();
2267
2268    DevWriteTime += last_tick;
2269    VolCatInfo.VolWriteTime += last_tick;
2270
2271    if (write_len > 0) {         /* skip error */
2272       DevWriteBytes += write_len;
2273    }
2274
2275    return write_len;   
2276 }
2277
2278 /* Return the resource name for the device */
2279 const char *DEVICE::name() const
2280 {
2281    return device->hdr.name;
2282 }
2283
2284 /* Returns file position on tape or -1 */
2285 int32_t DEVICE::get_os_tape_file()
2286 {
2287    struct mtget mt_stat;
2288
2289    if (has_cap(CAP_MTIOCGET) &&
2290        d_ioctl(m_fd, MTIOCGET, (char *)&mt_stat) == 0) {
2291       return mt_stat.mt_fileno;
2292    }
2293    return -1;
2294 }
2295
2296 char *
2297 dev_vol_name(DEVICE *dev)
2298 {
2299    return dev->getVolCatName();
2300 }
2301
2302
2303 /*
2304  * Free memory allocated for the device
2305  */
2306 void DEVICE::term(void)
2307 {
2308    DEVICE *dev = NULL;
2309    Dmsg1(900, "term dev: %s\n", print_name());
2310    close();
2311    if (dev_name) {
2312       free_memory(dev_name);
2313       dev_name = NULL;
2314    }
2315    if (prt_name) {
2316       free_memory(prt_name);
2317       prt_name = NULL;
2318    }
2319    if (errmsg) {
2320       free_pool_memory(errmsg);
2321       errmsg = NULL;
2322    }
2323    pthread_mutex_destroy(&m_mutex);
2324    pthread_cond_destroy(&wait);
2325    pthread_cond_destroy(&wait_next_vol);
2326    pthread_mutex_destroy(&spool_mutex);
2327 // rwl_destroy(&lock);
2328    if (attached_dcrs) {
2329       delete attached_dcrs;
2330       attached_dcrs = NULL;
2331    }
2332    if (device) {
2333       device->dev = NULL;
2334    }
2335    delete this;
2336    if (dev) {
2337       dev->term();
2338    }
2339 }
2340
2341 /*
2342  * This routine initializes the device wait timers
2343  */
2344 void init_device_wait_timers(DCR *dcr)
2345 {
2346    DEVICE *dev = dcr->dev;
2347    JCR *jcr = dcr->jcr;
2348
2349    /* ******FIXME******* put these on config variables */
2350    dev->min_wait = 60 * 60;
2351    dev->max_wait = 24 * 60 * 60;
2352    dev->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2353    dev->wait_sec = dev->min_wait;
2354    dev->rem_wait_sec = dev->wait_sec;
2355    dev->num_wait = 0;
2356    dev->poll = false;
2357
2358    jcr->min_wait = 60 * 60;
2359    jcr->max_wait = 24 * 60 * 60;
2360    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2361    jcr->wait_sec = jcr->min_wait;
2362    jcr->rem_wait_sec = jcr->wait_sec;
2363    jcr->num_wait = 0;
2364
2365 }
2366
2367 void init_jcr_device_wait_timers(JCR *jcr)
2368 {
2369    /* ******FIXME******* put these on config variables */
2370    jcr->min_wait = 60 * 60;
2371    jcr->max_wait = 24 * 60 * 60;
2372    jcr->max_num_wait = 9;              /* 5 waits =~ 1 day, then 1 day at a time */
2373    jcr->wait_sec = jcr->min_wait;
2374    jcr->rem_wait_sec = jcr->wait_sec;
2375    jcr->num_wait = 0;
2376 }
2377
2378
2379 /*
2380  * The dev timers are used for waiting on a particular device 
2381  *
2382  * Returns: true if time doubled
2383  *          false if max time expired
2384  */
2385 bool double_dev_wait_time(DEVICE *dev)
2386 {
2387    dev->wait_sec *= 2;               /* double wait time */
2388    if (dev->wait_sec > dev->max_wait) {   /* but not longer than maxtime */
2389       dev->wait_sec = dev->max_wait;
2390    }
2391    dev->num_wait++;
2392    dev->rem_wait_sec = dev->wait_sec;
2393    if (dev->num_wait >= dev->max_num_wait) {
2394       return false;
2395    }
2396    return true;
2397 }
2398
2399
2400 void set_os_device_parameters(DCR *dcr)
2401 {
2402    DEVICE *dev = dcr->dev;
2403
2404    if (strcmp(dev->dev_name, "/dev/null") == 0) {
2405       return;                            /* no use trying to set /dev/null */
2406    }
2407
2408 #if defined(HAVE_LINUX_OS) || defined(HAVE_WIN32)
2409    struct mtop mt_com;
2410
2411    Dmsg0(100, "In set_os_device_parameters\n");
2412 #if defined(MTSETBLK) 
2413    if (dev->min_block_size == dev->max_block_size &&
2414        dev->min_block_size == 0) {    /* variable block mode */
2415       mt_com.mt_op = MTSETBLK;
2416       mt_com.mt_count = 0;
2417       Dmsg0(100, "Set block size to zero\n");
2418       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2419          dev->clrerror(MTSETBLK);
2420       }
2421    }
2422 #endif
2423 #if defined(MTSETDRVBUFFER)
2424    if (getuid() == 0) {          /* Only root can do this */
2425       mt_com.mt_op = MTSETDRVBUFFER;
2426       mt_com.mt_count = MT_ST_CLEARBOOLEANS;
2427       if (!dev->has_cap(CAP_TWOEOF)) {
2428          mt_com.mt_count |= MT_ST_TWO_FM;
2429       }
2430       if (dev->has_cap(CAP_EOM)) {
2431          mt_com.mt_count |= MT_ST_FAST_MTEOM;
2432       }
2433       Dmsg0(100, "MTSETDRVBUFFER\n");
2434       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2435          dev->clrerror(MTSETDRVBUFFER);
2436       }
2437    }
2438 #endif
2439    return;
2440 #endif
2441
2442 #ifdef HAVE_NETBSD_OS
2443    struct mtop mt_com;
2444    if (dev->min_block_size == dev->max_block_size &&
2445        dev->min_block_size == 0) {    /* variable block mode */
2446       mt_com.mt_op = MTSETBSIZ;
2447       mt_com.mt_count = 0;
2448       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2449          dev->clrerror(MTSETBSIZ);
2450       }
2451       /* Get notified at logical end of tape */
2452       mt_com.mt_op = MTEWARN;
2453       mt_com.mt_count = 1;
2454       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2455          dev->clrerror(MTEWARN);
2456       }
2457    }
2458    return;
2459 #endif
2460
2461 #if HAVE_FREEBSD_OS || HAVE_OPENBSD_OS
2462    struct mtop mt_com;
2463    if (dev->min_block_size == dev->max_block_size &&
2464        dev->min_block_size == 0) {    /* variable block mode */
2465       mt_com.mt_op = MTSETBSIZ;
2466       mt_com.mt_count = 0;
2467       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2468          dev->clrerror(MTSETBSIZ);
2469       }
2470    }
2471 #if defined(MTIOCSETEOTMODEL) 
2472    uint32_t neof;
2473    if (dev->has_cap(CAP_TWOEOF)) {
2474       neof = 2;
2475    } else {
2476       neof = 1;
2477    }
2478    if (dev->d_ioctl(dev->fd(), MTIOCSETEOTMODEL, (caddr_t)&neof) < 0) {
2479       berrno be;
2480       dev->dev_errno = errno;         /* save errno */
2481       Mmsg2(dev->errmsg, _("Unable to set eotmodel on device %s: ERR=%s\n"),
2482             dev->print_name(), be.bstrerror(dev->dev_errno));
2483       Jmsg(dcr->jcr, M_FATAL, 0, dev->errmsg);
2484    }
2485 #endif
2486    return;
2487 #endif
2488
2489 #ifdef HAVE_SUN_OS
2490    struct mtop mt_com;
2491    if (dev->min_block_size == dev->max_block_size &&
2492        dev->min_block_size == 0) {    /* variable block mode */
2493       mt_com.mt_op = MTSRSZ;
2494       mt_com.mt_count = 0;
2495       if (dev->d_ioctl(dev->fd(), MTIOCTOP, (char *)&mt_com) < 0) {
2496          dev->clrerror(MTSRSZ);
2497       }
2498    }
2499    return;
2500 #endif
2501 }
2502
2503 static bool dev_get_os_pos(DEVICE *dev, struct mtget *mt_stat)
2504 {
2505    Dmsg0(100, "dev_get_os_pos\n");
2506    return dev->has_cap(CAP_MTIOCGET) && 
2507           dev->d_ioctl(dev->fd(), MTIOCGET, (char *)mt_stat) == 0 &&
2508           mt_stat->mt_fileno >= 0;
2509 }
2510
2511 static const char *modes[] = {
2512    "CREATE_READ_WRITE",
2513    "OPEN_READ_WRITE",
2514    "OPEN_READ_ONLY",
2515    "OPEN_WRITE_ONLY"
2516 };
2517
2518
2519 static const char *mode_to_str(int mode)  
2520 {
2521    static char buf[100];
2522    if (mode < 1 || mode > 4) {
2523       bsnprintf(buf, sizeof(buf), "BAD mode=%d", mode);
2524       return buf;
2525     }
2526    return modes[mode-1];
2527 }