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 * and/or 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.
17 /* No user fns here. Pesch 15apr92. */
23 #include <sys/types.h>
24 #include <sys/unistd.h>
27 #define _DEFAULT_ASPRINTF_BUFSIZE 64
30 * Allocate a file buffer, or switch to unbuffered I/O.
31 * Per the ANSI C standard, ALL tty devices default to line buffered.
33 * As a side effect, we set __SOPT or __SNPT (en/dis-able fseek
34 * optimization) right after the _fstat() that finds the buffer size.
38 __smakebuf_r (struct _reent
*ptr
,
46 if (fp
->_flags
& __SNBF
)
48 fp
->_bf
._base
= fp
->_p
= fp
->_nbuf
;
52 flags
= __swhatbuf_r (ptr
, fp
, &size
, &couldbetty
);
53 if ((p
= _malloc_r (ptr
, size
)) == NULL
)
55 if (!(fp
->_flags
& __SSTR
))
57 fp
->_flags
= (fp
->_flags
& ~__SLBF
) | __SNBF
;
58 fp
->_bf
._base
= fp
->_p
= fp
->_nbuf
;
65 fp
->_bf
._base
= fp
->_p
= (unsigned char *) p
;
67 if (couldbetty
&& _isatty_r (ptr
, fp
->_file
))
68 fp
->_flags
= (fp
->_flags
& ~__SNBF
) | __SLBF
;
74 * Internal routine to determine `proper' buffering for a file.
77 __swhatbuf_r (struct _reent
*ptr
,
82 #ifdef _FSEEK_OPTIMIZATION
83 const int snpt
= __SNPT
;
88 #ifdef __USE_INTERNAL_STAT64
91 if (fp
->_file
< 0 || _fstat64_r (ptr
, fp
->_file
, &st
) < 0)
95 if (fp
->_file
< 0 || _fstat_r (ptr
, fp
->_file
, &st
) < 0)
99 /* Check if we are be called by asprintf family for initial buffer. */
100 if (fp
->_flags
& __SMBF
)
101 *bufsize
= _DEFAULT_ASPRINTF_BUFSIZE
;
107 /* could be a tty iff it is a character device */
108 *couldbetty
= S_ISCHR(st
.st_mode
);
110 if (st
.st_blksize
> 0)
113 * Optimise fseek() only if it is a regular file. (The test for
114 * __sseek is mainly paranoia.) It is safe to set _blksize
115 * unconditionally; it will only be used if __SOPT is also set.
117 *bufsize
= st
.st_blksize
;
118 fp
->_blksize
= st
.st_blksize
;
119 return ((st
.st_mode
& S_IFMT
) == S_IFREG
? __SOPT
: snpt
);