| #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; | |
| } |