#include "libc.h" | |
#include "stdio_impl.h" | |
int fclose(FILE* f) { | |
int r; | |
int perm; | |
FLOCK(f); | |
if (!(perm = f->flags & F_PERM)) { | |
FILE** head = __ofl_lock(); | |
if (f->prev) | |
f->prev->next = f->next; | |
if (f->next) | |
f->next->prev = f->prev; | |
if (*head == f) | |
*head = f->next; | |
__ofl_unlock(); | |
} | |
r = fflush(f); | |
r |= f->close(f); | |
if (f->getln_buf) | |
free(f->getln_buf); | |
if (!perm) | |
free(f); | |
else | |
FUNLOCK(f); | |
return r; | |
} |