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