Index: fusl/src/stdio/fclose.c |
diff --git a/fusl/src/stdio/fclose.c b/fusl/src/stdio/fclose.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d687a8779b64f2d46b8790165c695b9612d3cc0a |
--- /dev/null |
+++ b/fusl/src/stdio/fclose.c |
@@ -0,0 +1,32 @@ |
+#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; |
+} |