]> git.lizzy.rs Git - plan9front.git/blob - sys/src/ape/lib/ap/plan9/close.c
ape: fix thread race with close() and select()
[plan9front.git] / sys / src / ape / lib / ap / plan9 / close.c
1 #include "lib.h"
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include "sys9.h"
6
7 int
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                 _fdinfo[d].flags = 0;
24                 _fdinfo[d].oflags = 0;
25                 if(_fdinfo[d].name){
26                         free(_fdinfo[d].name);
27                         _fdinfo[d].name = 0;
28                 }
29                 n = _CLOSE(d);
30                 if(n < 0)
31                         _syserrno();
32         }
33         return n;
34 }