Back to index

glibc  2.9
Functions
gets_chk.c File Reference
#include "../libio/libioP.h"
#include <limits.h>

Go to the source code of this file.

Functions

char * __gets_chk (char *buf, size_t size)

Function Documentation

char* __gets_chk ( char *  buf,
size_t  size 
)

Definition at line 33 of file gets_chk.c.

{
  _IO_size_t count;
  int ch;
  char *retval;

  if (size == 0)
    __chk_fail ();

  _IO_acquire_lock (_IO_stdin);
  ch = _IO_getc_unlocked (_IO_stdin);
  if (ch == EOF)
    {
      retval = NULL;
      goto unlock_return;
    }
  if (ch == '\n')
    count = 0;
  else
    {
      /* This is very tricky since a file descriptor may be in the
        non-blocking mode. The error flag doesn't mean much in this
        case. We return an error only when there is a new error. */
      int old_error = _IO_stdin->_IO_file_flags & _IO_ERR_SEEN;
      _IO_stdin->_IO_file_flags &= ~_IO_ERR_SEEN;
      buf[0] = (char) ch;
      count = INTUSE(_IO_getline) (_IO_stdin, buf + 1, size - 1, '\n', 0) + 1;
      if (_IO_stdin->_IO_file_flags & _IO_ERR_SEEN)
       {
         retval = NULL;
         goto unlock_return;
       }
      else
       _IO_stdin->_IO_file_flags |= old_error;
    }
  if (count >= size)
    __chk_fail ();
  buf[count] = 0;
  retval = buf;
unlock_return:
  _IO_release_lock (_IO_stdin);
  return retval;
}

Here is the call graph for this function:

Here is the caller graph for this function: