2 * Copyright (c) 1990, 2007 The Regents of the University of California.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 <<fclose>>---close a file
29 int fclose(FILE *<[fp]>);
30 int _fclose_r(struct _reent *<[reent]>, FILE *<[fp]>);
38 struct _reent *<[reent]>
42 If the file or stream identified by <[fp]> is open, <<fclose>> closes
43 it, after first ensuring that any pending data is written (by calling
46 The alternate function <<_fclose_r>> is a reentrant version.
47 The extra argument <[reent]> is a pointer to a reentrancy structure.
50 <<fclose>> returns <<0>> if successful (including when <[fp]> is
51 <<NULL>> or not an open file); otherwise, it returns <<EOF>>.
54 <<fclose>> is required by ANSI C.
56 Required OS subroutines: <<close>>, <<fstat>>, <<isatty>>, <<lseek>>,
57 <<read>>, <<sbrk>>, <<write>>.
68 _DEFUN(_fclose_r, (rptr, fp),
69 struct _reent *rptr _AND
75 return (0); /* on NULL */
77 __sfp_lock_acquire ();
79 CHECK_INIT (rptr, fp);
83 if (fp->_flags == 0) /* not open! */
86 __sfp_lock_release ();
89 /* Unconditionally flush to allow special handling for seekable read
90 files to reposition file to last byte processed as opposed to
91 last byte read ahead into the buffer. */
93 if (fp->_close != NULL && (*fp->_close) (fp->_cookie) < 0)
95 if (fp->_flags & __SMBF)
96 _free_r (rptr, (char *) fp->_bf._base);
101 fp->_flags = 0; /* release this FILE for reuse */
103 #ifndef __SINGLE_THREAD__
104 __lock_close_recursive (fp->_lock);
107 __sfp_lock_release ();
118 return _fclose_r(_REENT, fp);