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