* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)tapeio.c 5.1 6/7/85
* tapeio - tape device specific I/O routines
* ierr = topen (tlu, name, labelled)
* nbytes = tread (tlu, buffer)
* nbytes = twrite (tlu, buffer)
* ierr = tskipf (tlu, nfiles, nrecs)
* ierr = tstate (tlu, fileno, recno, err, eof, eot, tcsr)
#ifndef MTIOCGET /* 4.1+ defines this in ... */
#include "../libI77/f_errno.h"
char tu_name
[TU_NAMESIZE
]; /* device name */
int tu_fd
; /* file descriptor */
int tu_flags
; /* state flags */
int tu_file
; /* current tape file number */
int tu_rec
; /* current record number in file */
#ifdef MTWEOF /* this implies 4.1+ ... */
struct mtget mtget
; /* controller status */
* Open a tape unit for I/O
* ierror = topen(tlu, devnam, labled)
* ierror will be 0 for successful open; an error number otherwise.
* devnam is a character string
* labled should be .true. if the tape is labelled.
topen_(tlu
, name
, labelled
, len
)
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (tu
->tu_flags
& TU_OPEN
)
if (len
>= TU_NAMESIZE
) {
g_char(name
, len
, tu
->tu_name
);
if ((tu
->tu_fd
= open(tu
->tu_name
, 2)) < 0) {
if ((tu
->tu_fd
= open(tu
->tu_name
, 0)) < 0)
tu
->tu_flags
|= TU_READONLY
;
tu
->tu_file
= tu
->tu_rec
= 0;
tu
->tu_flags
|= TU_LABELLED
;
* Close a tape unit previously opened by topen_()
* tlu is a previously topened tape logical unit.
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
))
if (close(tu
->tu_fd
) < 0)
* Read from a tape logical unit
* ierr = tread(tlu, buffer)
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
)) {
if (tu
->tu_flags
& TU_WRITING
) {
if (tu
->tu_flags
& (TU_EOF
|TU_EOT
))
if ((nbytes
= read(tu
->tu_fd
, buffer
, (int)len
)) > 0)
tu
->tu_flags
|= TU_RDATA
;
if (nbytes
== 0 && len
!= 0) {
* Write to a tape logical unit
* ierr = twrite(tlu, buffer)
twrite_(tlu
, buffer
, len
)
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
)) {
if (tu
->tu_flags
& TU_READONLY
) {
if (tu
->tu_flags
& TU_EOT
) { /* must backspace over last EOF */
nf
= (long)tu
->tu_file
; /* should be number to skip */
trewin_(tlu
); /* KLUDGE!! */
tskipf_(tlu
, &nf
, &zero
);
nbytes
= write(tu
->tu_fd
, buffer
, (int)len
);
tu
->tu_flags
|= TU_WRITING
;
tu
->tu_flags
&= ~(TU_EOF
|TU_EOT
|TU_RDATA
);
char namebuf
[TU_NAMESIZE
];
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
)) {
labelled
= (tu
->tu_flags
& TU_LABELLED
);
for (p
= tu
->tu_name
, q
= namebuf
; *p
; p
++) {
if (*p
== 'n') /* norewind name */
if (isdigit(*p
)) { /* might be norewind minor dev */
munit
= (10 * munit
) + (*p
++ - '0');
*q
++ = (munit
& 03) + '0';
/* debug printf("rewinding [%s]\n", namebuf); /* */
if ((rfd
= open(namebuf
, 0)) < 0)
topen_(tlu
, tu
->tu_name
, &labelled
, (long)strlen(tu
->tu_name
));
tskipf_(tlu
, &one
, &zero
);
* NOTE: This is a kludge, to be fixed after 4.1a
tskipf_(tlu
, nfiles
, nrecs
)
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
)) {
if (tu
->tu_flags
& TU_WRITING
) {
if (tu
->tu_flags
& TU_EOT
) {
if (tu
->tu_flags
& TU_EOF
)
empty
= ((tu
->tu_flags
& TU_RDATA
) == 0);
while ((nb
= read(tu
->tu_fd
, dummybuf
, sizeof dummybuf
)) > 0)
tu
->tu_flags
&= ~TU_RDATA
;
if (tu
->tu_flags
& TU_EOT
)
if (tu
->tu_flags
& (TU_EOT
|TU_EOF
)) {
empty
= ((nb
= read(tu
->tu_fd
, dummybuf
, sizeof dummybuf
)) <= 0);
if (!(tu
->tu_flags
& TU_RDATA
))
tu
->tu_flags
|= TU_RDATA
;
* Return status of tape channel
tstate_(tlu
, fileno
, recno
, err
, eof
, eot
, tcsr
)
long *tlu
, *fileno
, *recno
, *err
, *eof
, *eot
, *tcsr
;
if (*tlu
< 0 || *tlu
>= TU_MAXTAPES
) {
if (!(tu
->tu_flags
& TU_OPEN
)) {
*fileno
= (long)tu
->tu_file
;
*recno
= (long)tu
->tu_rec
;
*err
= (long)((tu
->tu_flags
& TU_ERR
) != 0);
*eof
= (long)((tu
->tu_flags
& TU_EOF
) != 0);
*eot
= (long)((tu
->tu_flags
& TU_EOT
) != 0);
#ifdef MTWEOF /* implies 4.1+ system */
ioctl(tu
->tu_fd
, MTIOCGET
, &mtget
);
*tcsr
= (long)mtget
.mt_dsreg
& 0xffff;
ioctl(tu
->tu_fd
, MTIOCGET
, &csr
);