1#include "libc.h"
2#include "stdio_impl.h"
3
4int 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