- while ((fd = ::open(dev_name, mode+nonblocking)) < 0) {
- berrno be;
- dev_errno = errno;
- Dmsg5(050, "Open omode=%d mode=%x nonblock=%d error errno=%d ERR=%s\n",
- omode, mode, nonblocking, errno, be.strerror());
- if (dev_errno == EINTR || dev_errno == EAGAIN) {
- Dmsg0(100, "Continue open\n");
- continue;
- }
- /* Busy wait for specified time (default = 5 mins) */
- if (dev_errno == EBUSY && timeout-- > 0) {
- Dmsg2(100, "Device %s busy. ERR=%s\n", print_name(), be.strerror());
- bmicrosleep(1, 0);
- continue;
+
+ /* UNIX Code */
+ /* If busy retry each second for max_open_wait seconds */
+ for ( ;; ) {
+ /* Try non-blocking open */
+ fd = ::open(dev_name, mode+O_NONBLOCK);
+ if (fd < 0) {
+ berrno be;
+ dev_errno = errno;
+ Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
+ print_name(), omode, mode, errno, be.strerror());
+ } else {
+ /* Tape open, now rewind it */
+ Dmsg0(050, "Rewind after open\n");
+ mt_com.mt_op = MTREW;
+ mt_com.mt_count = 1;
+ if (ioctl(fd, MTIOCTOP, (char *)&mt_com) < 0) {
+ berrno be;
+ dev_errno = errno; /* set error status from rewind */
+ ::close(fd);
+ clear_opened();
+ Dmsg2(100, "Rewind error on %s close: ERR=%s\n", print_name(),
+ be.strerror(dev_errno));
+ /* If we get busy, device is probably rewinding, try again */
+ if (dev_errno != EBUSY) {
+ break; /* error -- no medium */
+ }
+ } else {
+ /* Got fd and rewind worked, so we must have medium in drive */
+ ::close(fd);
+ fd = ::open(dev_name, mode); /* open normally */
+ if (fd < 0) {
+ berrno be;
+ dev_errno = errno;
+ Dmsg5(050, "Open error on %s omode=%d mode=%x errno=%d: ERR=%s\n",
+ print_name(), omode, mode, errno, be.strerror());
+ break;
+ }
+ dev_errno = 0;
+ lock_door();
+ set_os_device_parameters(dcr); /* do system dependent stuff */
+ break; /* Successfully opened and rewound */
+ }