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