Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_FS_1_19910112 - c/old/lib/close.c
There are 10 other files named close.c in the archive. Click here to see a list.
/* -------------------- */
/*	close file      */
/* -------------------- */

#include <c-env.h>

entry close;
#ifdef SYS_T20+SYS_10X
entry _rljfn;		/* access(), stat() */
#endif

#include <urtio.h>

static _close();

close(f)
{
    int i;

    if (_uioch[f] == UIO_UNASS)
	return -1;			/* say it was bad */
    i = _close(_uioch[f]);
    _uioch[f] = UIO_UNASS;
    return i ? 0 : -1;
}
#ifdef SYS_T20+SYS_10X
#asm
; *************************************************************
;	close file, returns success or failure in AC1
;	  argument 1: JFN of file
; *************************************************************
	SEARCH MONSYM
.CLOSE:	MOVE	1,-1(17)	;Get JFN
	CAIE	1,.PRIIN	;Is it primary input
	 CAIN	1,.PRIOU	; or primary output?
	  JRST	.CLOS1		;Yes, have to reset i/o first
.CLOS0:	JUMPLE	1,$RETN		;Bad file, dont even try
	CLOSF%			;Normal file, just close
	 ERJMPA	$RETF
	JRST	$RETT

; Here to close primary input or output
.CLOS1:	MOVEI	1,.FHSLF	;On ourself
	GPJFN%			; get primary i/o redirection
	HRRZ	3,-1(17)	;Now get what we wanted closed
	CAIE	3,.PRIIN	;Is it input?
	 JRST	.CLOS2		;No, must be output
	HLRE	3,2		;Get input from left half
	HRROS	2		;Make become terminal again
	JRST	.CLOS3		;Rejoin common code

; Here to close primary output
.CLOS2:	HRRE	3,2		;Want to close output, get the JFN
	HLLOS	2		;Make become terminal again
.CLOS3:	SPJFN%			;Redirect primary input
	MOVE	1,3		;Get JFN back
	JRST	.CLOS0		;Go close it

; *************************************************************
;	Misc support
;	_rljfn(jfn)
;	int jfn;
; *************************************************************
;
.rljfn:
	MOVE 1,-1(17)		; Get JFN argument
	RLJFN%
	 ERJMPA $RETF		; Lost
	JRST $RETT		; Won
#endasm
#endif /* T20+10X */
#if SYS_WAITS
#asm
; *************************************************************
;	close file
; *************************************************************
;
.CLOSE:	MOVE	1,-1(17)
	ANDI	1,17
	LSH	1,27			; shift channel # into ac field
	IOR	1,[CLOSE 0,0]
	MOVEM	1,.+1
	CLOSE	0,0
	JRST	$RETT
#endasm
#endif /* WAITS */
#if SYS_ITS
#asm
; _close(chan)

.CLOSE:	.CALL [SETZ
		SIXBIT /CLOSE/
		SETZ -1(17)]
	 JRST $RETN
	JRST $RETZ		; Why not?
#endasm
#endif /* ITS */