xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/close.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include <stdlib.h>
33e12c5d1SDavid du Colombier #include <unistd.h>
43e12c5d1SDavid du Colombier #include <errno.h>
53e12c5d1SDavid du Colombier #include "sys9.h"
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier int
close(int d)83e12c5d1SDavid du Colombier close(int d)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier 	int n;
113e12c5d1SDavid du Colombier 	Fdinfo *f;
123e12c5d1SDavid du Colombier 
133e12c5d1SDavid du Colombier 	n = -1;
143e12c5d1SDavid du Colombier 	f = &_fdinfo[d];
153e12c5d1SDavid du Colombier 	if(d<0 || d>=OPEN_MAX || !(f->flags&FD_ISOPEN))
163e12c5d1SDavid du Colombier 		errno = EBADF;
173e12c5d1SDavid du Colombier 	else{
18*219b2ee8SDavid du Colombier 		if(f->flags&(FD_BUFFERED|FD_BUFFEREDX)) {
193e12c5d1SDavid du Colombier 			if(f->flags&FD_BUFFERED)
20*219b2ee8SDavid du Colombier 				_closebuf(d);
213e12c5d1SDavid du Colombier 			f->flags &= ~FD_BUFFERED;
22*219b2ee8SDavid du Colombier 		}
233e12c5d1SDavid du Colombier 		n = _CLOSE(d);
243e12c5d1SDavid du Colombier 		if(n < 0)
253e12c5d1SDavid du Colombier 			_syserrno();
263e12c5d1SDavid du Colombier 		_fdinfo[d].flags = 0;
273e12c5d1SDavid du Colombier 		_fdinfo[d].oflags = 0;
283e12c5d1SDavid du Colombier 		if(_fdinfo[d].name){
293e12c5d1SDavid du Colombier 			free(_fdinfo[d].name);
303e12c5d1SDavid du Colombier 			_fdinfo[d].name = 0;
313e12c5d1SDavid du Colombier 		}
323e12c5d1SDavid du Colombier 	}
333e12c5d1SDavid du Colombier 	return n;
343e12c5d1SDavid du Colombier }
35