]> sourceware.org Git - glibc.git/blame - libio/filedoalloc.c
Post-cleanup 2: minimize _G_config.h.
[glibc.git] / libio / filedoalloc.c
CommitLineData
688903eb 1/* Copyright (C) 1993-2018 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
96aa2d94 3
41bdb6e2
AJ
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
96aa2d94 8
41bdb6e2
AJ
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
40a55d20 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
96aa2d94 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>.
96aa2d94 17
41bdb6e2
AJ
18 As a special exception, if you link the code in this file with
19 files compiled with a GNU compiler to produce an executable,
20 that does not cause the resulting executable to be covered by
21 the GNU Lesser General Public License. This exception does not
22 however invalidate any other reasons why the executable file
23 might be covered by the GNU Lesser General Public License.
24 This exception applies to code released by its copyright holders
25 in files containing the exception. */
96aa2d94
RM
26
27/*
aeb25823
AJ
28 Copyright (C) 1990 The Regents of the University of California.
29 All rights reserved.
30
31 Redistribution and use in source and binary forms, with or without
32 modification, are permitted provided that the following conditions
33 are met:
34
35 1. Redistributions of source code must retain the above copyright
36 notice, this list of conditions and the following disclaimer.
37 2. Redistributions in binary form must reproduce the above copyright
38 notice, this list of conditions and the following disclaimer in the
39 documentation and/or other materials provided with the distribution.
40 4. Neither the name of the University nor the names of its contributors
41 may be used to endorse or promote products derived from this software
42 without specific prior written permission.
aec84f53 43
aeb25823
AJ
44 THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 SUCH DAMAGE.*/
96aa2d94
RM
55
56/* Modified for GNU iostream by Per Bothner 1991, 1992. */
57
96aa2d94 58#include "libioP.h"
abc40bb2 59#include <device-nrs.h>
96aa2d94 60#include <sys/stat.h>
96aa2d94 61#include <stdlib.h>
68dbb3a6 62#include <unistd.h>
68dbb3a6 63
abc40bb2 64/* Return the result of isatty, without changing errno. */
aec84f53
UD
65static int
66local_isatty (int fd)
67{
68 int save_errno = errno;
abc40bb2 69 int res = __isatty (fd);
aec84f53
UD
70 __set_errno (save_errno);
71 return res;
72}
73
abc40bb2
FW
74/* Allocate a file buffer, or switch to unbuffered I/O. Streams for
75 TTY devices default to line buffered. */
96aa2d94 76int
9d46370c 77_IO_file_doallocate (_IO_FILE *fp)
96aa2d94 78{
40a55d20 79 _IO_size_t size;
40a55d20 80 char *p;
c8450f70 81 struct stat64 st;
96aa2d94 82
91099cf4
UD
83 size = _IO_BUFSIZ;
84 if (fp->_fileno >= 0 && __builtin_expect (_IO_SYSSTAT (fp, &st), 0) >= 0)
96aa2d94 85 {
91099cf4
UD
86 if (S_ISCHR (st.st_mode))
87 {
88 /* Possibly a tty. */
89 if (
90#ifdef DEV_TTY_P
11c0b1e3 91 DEV_TTY_P (&st) ||
96aa2d94 92#endif
aec84f53 93 local_isatty (fp->_fileno))
91099cf4
UD
94 fp->_flags |= _IO_LINE_BUF;
95 }
63fb8f9a 96#if defined _STATBUF_ST_BLKSIZE
705a79f8 97 if (st.st_blksize > 0 && st.st_blksize < _IO_BUFSIZ)
91099cf4 98 size = st.st_blksize;
96aa2d94
RM
99#endif
100 }
8a29509d
PP
101 p = malloc (size);
102 if (__glibc_unlikely (p == NULL))
103 return EOF;
d18ea0c5 104 _IO_setb (fp, p, p + size, 1);
96aa2d94
RM
105 return 1;
106}
d18ea0c5 107libc_hidden_def (_IO_file_doallocate)
This page took 0.486515 seconds and 5 git commands to generate.