xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/close.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include "lib.h"
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include "sys9.h"
6 
7 int
close(int d)8 close(int d)
9 {
10 	int n;
11 	Fdinfo *f;
12 
13 	n = -1;
14 	f = &_fdinfo[d];
15 	if(d<0 || d>=OPEN_MAX || !(f->flags&FD_ISOPEN))
16 		errno = EBADF;
17 	else{
18 		if(f->flags&(FD_BUFFERED|FD_BUFFEREDX)) {
19 			if(f->flags&FD_BUFFERED)
20 				_closebuf(d);
21 			f->flags &= ~FD_BUFFERED;
22 		}
23 		n = _CLOSE(d);
24 		if(n < 0)
25 			_syserrno();
26 		_fdinfo[d].flags = 0;
27 		_fdinfo[d].oflags = 0;
28 		if(_fdinfo[d].name){
29 			free(_fdinfo[d].name);
30 			_fdinfo[d].name = 0;
31 		}
32 	}
33 	return n;
34 }
35