
1: /* Copyright (C) 1993, 1996, 1997, 1998, 2002, 2003, 2004 2: Free Software Foundation, Inc. 3: This file is part of the GNU C Library. 4: 5: The GNU C Library is free software; you can redistribute it and/or 6: modify it under the terms of the GNU Lesser General Public 7: License as published by the Free Software Foundation; either 8: version 2.1 of the License, or (at your option) any later version. 9: 10: The GNU C Library is distributed in the hope that it will be useful, 11: but WITHOUT ANY WARRANTY; without even the implied warranty of 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13: Lesser General Public License for more details. 14: 15: You should have received a copy of the GNU Lesser General Public 16: License along with the GNU C Library; if not, write to the Free 17: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18: 02111-1307 USA. 19: 20: As a special exception, if you link the code in this file with 21: files compiled with a GNU compiler to produce an executable, 22: that does not cause the resulting executable to be covered by 23: the GNU Lesser General Public License. This exception does not 24: however invalidate any other reasons why the executable file 25: might be covered by the GNU Lesser General Public License. 26: This exception applies to code released by its copyright holders 27: in files containing the exception. */ 28: 29: #include "../libio/libioP.h" 30: #include <limits.h> 31: 32: char * 33: __gets_chk (char *buf, size_t size) 34: { 35: _IO_size_t count; 36: int ch; 37: char *retval; 38: 39: if (size == 0) 40: __chk_fail (); 41: 42: _IO_acquire_lock (_IO_stdin); 43: ch = _IO_getc_unlocked (_IO_stdin); 44: if (ch == EOF) 45: { 46: retval = NULL; 47: goto unlock_return; 48: } 49: if (ch == '\n') 50: count = 0; 51: else 52: { 53: /* This is very tricky since a file descriptor may be in the 54: non-blocking mode. The error flag doesn't mean much in this 55: case. We return an error only when there is a new error. */ 56: int old_error = _IO_stdin->_IO_file_flags & _IO_ERR_SEEN; 57: _IO_stdin->_IO_file_flags &= ~_IO_ERR_SEEN; 58: buf[0] = (char) ch; 59: count = INTUSE(_IO_getline) (_IO_stdin, buf + 1, size - 1, '\n', 0) + 1; 60: if (_IO_stdin->_IO_file_flags & _IO_ERR_SEEN) 61: { 62: retval = NULL; 63: goto unlock_return; 64: } 65: else 66: _IO_stdin->_IO_file_flags |= old_error; 67: } 68: if (count >= size) 69: __chk_fail (); 70: buf[count] = 0; 71: retval = buf; 72: unlock_return: 73: _IO_release_lock (_IO_stdin); 74: return retval; 75: } 76: 77: link_warning (__gets_chk, "the `gets' function is dangerous and should not be used.")