1 #include "libc.h"
2 #include "stdio_impl.h"
3 
fclose(FILE * f)4 int fclose(FILE* f) {
5     int r;
6     int perm;
7 
8     FLOCK(f);
9 
10     if (!(perm = f->flags & F_PERM)) {
11         FILE** head = __ofl_lock();
12         if (f->prev)
13             f->prev->next = f->next;
14         if (f->next)
15             f->next->prev = f->prev;
16         if (*head == f)
17             *head = f->next;
18         __ofl_unlock();
19     }
20 
21     r = fflush(f);
22     r |= f->close(f);
23 
24     if (f->getln_buf)
25         free(f->getln_buf);
26     if (!perm)
27         free(f);
28     else
29         FUNLOCK(f);
30 
31     return r;
32 }
33