]>
Commit | Line | Data |
---|---|---|
2b778ceb | 1 | /* Copyright (C) 1993-2021 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 | 15 | License along with the GNU C Library; if not, see |
5a82c748 | 16 | <https://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 | #include "libioP.h" | |
28 | ||
29 | #define _IOFBF 0 /* Fully buffered. */ | |
30 | #define _IOLBF 1 /* Line buffered. */ | |
31 | #define _IONBF 2 /* No buffering. */ | |
32 | ||
33 | int | |
9964a145 | 34 | _IO_setvbuf (FILE *fp, char *buf, int mode, size_t size) |
96aa2d94 | 35 | { |
7c713e28 | 36 | int result; |
96aa2d94 | 37 | CHECK_FILE (fp, EOF); |
0261d33f | 38 | _IO_acquire_lock (fp); |
96aa2d94 RM |
39 | switch (mode) |
40 | { | |
41 | case _IOFBF: | |
df6c012b | 42 | fp->_flags &= ~(_IO_LINE_BUF|_IO_UNBUFFERED); |
96aa2d94 RM |
43 | if (buf == NULL) |
44 | { | |
45 | if (fp->_IO_buf_base == NULL) | |
46 | { | |
47 | /* There is no flag to distinguish between "fully buffered | |
48 | mode has been explicitly set" as opposed to "line | |
49 | buffering has not been explicitly set". In both | |
50 | cases, _IO_LINE_BUF is off. If this is a tty, and | |
51 | _IO_filedoalloc later gets called, it cannot know if | |
52 | it should set the _IO_LINE_BUF flag (because that is | |
53 | the default), or not (because we have explicitly asked | |
54 | for fully buffered mode). So we make sure a buffer | |
55 | gets allocated now, and explicitly turn off line | |
56 | buffering. | |
57 | ||
58 | A possibly cleaner alternative would be to add an | |
59 | extra flag, but then flags are a finite resource. */ | |
60 | if (_IO_DOALLOCATE (fp) < 0) | |
7c713e28 RM |
61 | { |
62 | result = EOF; | |
63 | goto unlock_return; | |
64 | } | |
df6c012b | 65 | fp->_flags &= ~_IO_LINE_BUF; |
96aa2d94 | 66 | } |
7c713e28 RM |
67 | result = 0; |
68 | goto unlock_return; | |
96aa2d94 RM |
69 | } |
70 | break; | |
71 | case _IOLBF: | |
df6c012b ZW |
72 | fp->_flags &= ~_IO_UNBUFFERED; |
73 | fp->_flags |= _IO_LINE_BUF; | |
96aa2d94 | 74 | if (buf == NULL) |
7c713e28 RM |
75 | { |
76 | result = 0; | |
77 | goto unlock_return; | |
78 | } | |
96aa2d94 RM |
79 | break; |
80 | case _IONBF: | |
df6c012b ZW |
81 | fp->_flags &= ~_IO_LINE_BUF; |
82 | fp->_flags |= _IO_UNBUFFERED; | |
96aa2d94 RM |
83 | buf = NULL; |
84 | size = 0; | |
85 | break; | |
86 | default: | |
7c713e28 RM |
87 | result = EOF; |
88 | goto unlock_return; | |
96aa2d94 | 89 | } |
7c713e28 | 90 | result = _IO_SETBUF (fp, buf, size) == NULL ? EOF : 0; |
f0d8cfd7 | 91 | |
7c713e28 | 92 | unlock_return: |
0261d33f | 93 | _IO_release_lock (fp); |
7c713e28 | 94 | return result; |
96aa2d94 | 95 | } |
d18ea0c5 | 96 | libc_hidden_def (_IO_setvbuf) |
d3b7d2ac RM |
97 | |
98 | weak_alias (_IO_setvbuf, setvbuf) |