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