BOOL StatusTape( DWORD *drive_status // O - Status of drive. ) { if( gb_Tape_Handle != NULL ){ GetTapeStatus( gb_Tape_Handle ); DisplayDriverError( GetLastError( ) ) ; *drive_status = GetLastError( ); } printf( "StatusTape(): status = %lx\n", *drive_status ) ; return SUCCESS ; }
static DWORD w32_get_tape_status ( HANDLE hFile ) { // *************************************************************** // PROGRAMMING NOTE: it is THIS LOOP (retrieving the status // of the tape drive) that takes UP TO *10* SECONDS TO COMPLETE // if there is no tape mounted on the drive whereas it completes // immediately when there IS a tape mounted! I have no idea why // Windows behave so unusually/inefficiently in this way! - Fish // *************************************************************** DWORD dwTapeStatus; // (NOTE: see also: KB 111837: "ERROR_BUS_RESET May Be Benign") do dwTapeStatus = GetTapeStatus( hFile ); while (ERROR_BUS_RESET == dwTapeStatus); return dwTapeStatus; }
int win32_tape_device::tape_get(struct mtget *mt_get) { TAPE_POSITION_INFO pos_info; BOOL result; if (m_fd < 3 || m_fd >= (int)(NUMBER_HANDLE_ENTRIES + 3) || TapeHandleTable[m_fd - 3].OSHandle == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } PTAPE_HANDLE_INFO pHandleInfo = &TapeHandleTable[m_fd - 3]; if (GetTapePositionInfo(pHandleInfo->OSHandle, &pos_info) != NO_ERROR) { return -1; } DWORD density = 0; DWORD blocksize = 0; result = GetDensityBlockSize(pHandleInfo->OSHandle, &density, &blocksize); if (result != NO_ERROR) { TAPE_GET_DRIVE_PARAMETERS drive_params; DWORD size; size = sizeof(drive_params); result = GetTapeParameters(pHandleInfo->OSHandle, GET_TAPE_DRIVE_INFORMATION, &size, &drive_params); if (result == NO_ERROR) { blocksize = drive_params.DefaultBlockSize; } } mt_get->mt_type = MT_ISSCSI2; /* * Partition # */ mt_get->mt_resid = pos_info.PartitionBlockValid ? pos_info.Partition : (ULONG)-1; /* * Density / Block Size */ mt_get->mt_dsreg = ((density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK) | ((blocksize << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK); mt_get->mt_gstat = 0x00010000; /* Immediate report mode.*/ if (pHandleInfo->bEOF) { mt_get->mt_gstat |= 0x80000000; /* GMT_EOF */ } if (pos_info.PartitionBlockValid && pos_info.BlockNumber == 0) { mt_get->mt_gstat |= 0x40000000; /* GMT_BOT */ } if (pHandleInfo->bEOT) { mt_get->mt_gstat |= 0x20000000; /* GMT_EOT */ } if (pHandleInfo->bEOD) { mt_get->mt_gstat |= 0x08000000; /* GMT_EOD */ } TAPE_GET_MEDIA_PARAMETERS media_params; DWORD size = sizeof(media_params); result = GetTapeParameters(pHandleInfo->OSHandle, GET_TAPE_MEDIA_INFORMATION, &size, &media_params); if (result == NO_ERROR && media_params.WriteProtected) { mt_get->mt_gstat |= 0x04000000; /* GMT_WR_PROT */ } result = GetTapeStatus(pHandleInfo->OSHandle); if (result != NO_ERROR) { if (result == ERROR_NO_MEDIA_IN_DRIVE) { mt_get->mt_gstat |= 0x00040000; /* GMT_DR_OPEN */ } } else { mt_get->mt_gstat |= 0x01000000; /* GMT_ONLINE */ } /* * Recovered Error Count */ mt_get->mt_erreg = 0; /* * File Number */ mt_get->mt_fileno = (__daddr_t)pHandleInfo->ulFile; /* * Block Number */ mt_get->mt_blkno = (__daddr_t)(pHandleInfo->bBlockValid ? pos_info.BlockNumber - pHandleInfo->ullFileStart : (ULONGLONG)-1); return 0; }