void seek_diag_details (char const *name, off_t offset) { if (ignore_failed_read_option) seek_warn_details (name, offset); else seek_error_details (name, offset); }
/* Move archive descriptor by COUNT records worth. If COUNT is positive we move forward, else we move negative. If it's a tape, MTIOCTOP had better work. If it's something else, we try to seek on it. If we can't seek, we lose! */ static void move_archive (off_t count) { if (count == 0) return; #ifdef MTIOCTOP { struct mtop operation; if (count < 0 ? (operation.mt_op = MTBSR, operation.mt_count = -count, operation.mt_count == -count) : (operation.mt_op = MTFSR, operation.mt_count = count, operation.mt_count == count)) { if (0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation)) return; if (errno == EIO && 0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation)) return; } } #endif /* MTIOCTOP */ { off_t position0 = rmtlseek (archive, (off_t) 0, SEEK_CUR); off_t increment = record_size * (off_t) count; off_t position = position0 + increment; if (increment / count != record_size || (position < position0) != (increment < 0) || (position = position < 0 ? 0 : position, rmtlseek (archive, position, SEEK_SET) != position)) seek_error_details (archive_name_array[0], position); return; } }