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