#include "stdio_impl.h" | |
#include "libc.h" | |
static void dummy(FILE *f) { } | |
weak_alias(dummy, __unlist_locked_file); | |
int fclose(FILE *f) | |
{ | |
int r; | |
int perm; | |
FLOCK(f); | |
__unlist_locked_file(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; | |
} |