* * $Id: eprwnd.F,v 1.2 1996/04/11 12:34:10 mclareni Exp $ * * $Log: eprwnd.F,v $ * Revision 1.2 1996/04/11 12:34:10 mclareni * F. Ranjard's protection for rewinding with a wrong file descriptor * * Revision 1.1.1.1 1996/03/08 15:21:44 mclareni * Epio * * #include "epio/pilot.h" SUBROUTINE EPRWND(LUNIT,IBUF,IERR) C. C. REWINDING AN OUTPUT UNIT CLOSES THE UNIT AND WRITES AN END OF FILE C. MARK (ROUTINE EPEOF). AFTER A REWIND OPERATION (AND ONLY IN THAT C. CASE) THE USER MAY SWITCH FROM READING TO WRITING OR VICE VERSA. C. C. THE PHYS. HEADER IS RESET TO THE STANDARD HEADER AFTER A REWIND. C. THE BLOCK AND RECORD COUNTS ARE RESET TO ZERO. C. C. INPUT: C. C. LUNIT LOGICAL UNIT C. C. IBUF USER PROVIDED UNIT BUFFER. MUST NOT BE TOUCHED BY USER. C. C. OUTPUT: C. C. IERR ERROR FLAG. SEE SEPARATE LIST. #if defined(CERNLIB_APOLLO) %INCLUDE '/sys/ins/base.ins.ftn' %INCLUDE '/sys/ins/error.ins.ftn' %INCLUDE '/sys/ins/streams.ins.ftn' INTEGER*2 STREAM_$ID,ERROR_$RETURNED INTEGER STATUS_$RETURNED,ATT_$REC_4(16) EQUIVALENCE (ATT_$REC_4,STREAM_$ID) #endif #include "epio/epiocom.inc" DIMENSION IBUF(2) C--- CHECK WHETHER SAME USER UNIT AS LAST TIME IF(LASTUT.EQ.LUNIT) GOTO 1551 C--- NEW UNIT - GET REF CALL EPUNIT(LUNIT,IERR) IF(IERR.EQ.0) GOTO 1552 GOTO 77777 1551 IERR=0 IF(LREF.NE.0) GOTO 1552 IERR=13 CALL EPERRH(LUNIT,IERR) GOTO 77777 1552 CONTINUE C--- CLOSE IF OUTPUT UNIT IF(LIST(ISTART+16).NE.1) GOTO 10 CALL EPCLOS(LUNIT,IBUF,IERR) IF(IERR.NE.0) GOTO 77777 IF(LIST(ISTART+33).NE.2)CALL EPEOF(LUNIT,IERR) 10 CONTINUE IF(IERR.NE.0) GOTO 77777 #if defined(CERNLIB_IBM)||defined(CERNLIB_NORD) CALL IORWND(LUNIT,IRETCD) IF(IRETCD.EQ.0) GOTO 11 IERR=11 CALL EPERRH(LUNIT,IERR) GOTO 77777 11 CONTINUE #endif #if defined(CERNLIB_CDC)||defined(CERNLIB_CRAY)||defined(CERNLIB_STF77)||defined(CERNLIB_STF77VX) IF(LIST(ISTART+33).EQ.0)REWIND LUNIT IF(LIST(ISTART+33).EQ.2 .AND. LIST(ISTART+25).NE.0) 1 call cfrew(LIST(ISTART+25),0) #endif #if defined(CERNLIB_VAX) IF(LIST(ISTART+25).NE.0)THEN C C REWIND QIO MAGTAPE HERE C CALL EPMTREW(IERR) IF(IERR.NE.1)THEN WRITE(NOUTUT,1001) IERR 1001 FORMAT(/' +++ EP I/O PACKAGE VAX MAGTAPE ERROR ',Z10,' HEX ') IERR = 12 CALL EPERRH(LIST(ISTART+10),IERR) ELSE IERR = 0 ENDIF C ELSE REWIND LUNIT ENDIF #endif #if defined(CERNLIB_APOLLO) C C SEE WETHER THE UNIT HAS BEEN OPEN AT ALL, C OTHERWISE DO NOTHING C IF(LIST(ISTART+25).NE.0) THEN STREAM_$ID=INT2(LIST(ISTART+25)) C C SEE WHETHER THIS IS A TAPE UNIT C CALL STREAM_$INQUIRE ( 1 STREAM_$IRM_OTYPE, 2 STREAM_$USE_STRID, 3 STREAM_$ID, 4 ERROR_$MASK, 5 STATUS_$RETURNED) IF (STATUS_$RETURNED .NE. STATUS_$OK) 1 CALL ERROR_$PRINT(STATUS_$RETURNED) IF(ATT_$REC_4(14).NE.16#314) THEN * * THIS IS A DISK FILE, JUST REWIND * CALL STREAM_$SEEK( 1 STREAM_$ID, 2 STREAM_$REC, 3 STREAM_$ABSOLUTE, 4 1, 5 STATUS_$RETURNED) IF(STATUS_$RETURNED.NE.STATUS_$OK) THEN SUBS_$RETURNED=ERROR_$SUBSYS(STATUS_$RETURNED) IF(LSHFT(ERROR_$SUBSYS(STATUS_$RETURNED),8) + .NE.STREAM_$SUBS) WRITE(NOUTUT,1000) 1000 FORMAT(' +++ EPIO/DOMAIN: Not a stream I/O error ???') CALL ERROR_$PRINT(STATUS_$RETURNED) END IF ELSE * * THIS IS A MAG TAPE, AND WE WANT TO CLOSE THE STREAM * CALL STREAM_$CLOSE(STREAM_$ID,STATUS_$RETURNED) LIST(ISTART+25)=0 IF(STATUS_$RETURNED.NE.STATUS_$OK) THEN SUBS_$RETURNED=ERROR_$SUBSYS(STATUS_$RETURNED) IF(LSHFT(ERROR_$SUBSYS(STATUS_$RETURNED),8) + .NE.STREAM_$SUBS) WRITE(NOUTUT,1000) CALL ERROR_$PRINT(STATUS_$RETURNED) END IF END IF END IF #endif #if defined(CERNLIB_UNIVAC) LUNFD=LIST(ISTART+24) IOAD=LIST(ISTART+25) IF(IOAD.GE.0) LIST(ISTART+25)=0 IF(IOAD.LT.0) CALL TIOREW(LUNFD,ISTAT) #endif C--- RESET STATUS WORDS AS NECESSARY LIST(ISTART+11)=0 LIST(ISTART+12)=0 C C THE CHANNEL NUMBER AND RAB ADDRESS FOR THE VAX MUST BE REMEMBERED C THEREFORE WE DONT ZERO ALL THE WAY TO NWUNIT C THE SAME HOLDS FOR UNIVAC, AND ALSO FOR THE APOLLO STREAM_$ID CALL UZERO(LIST,ISTART+14,ISTART+23) 77777 RETURN END