示例#1
0
int
_IO_new_fgetpos64 (FILE *fp, __fpos64_t *posp)
{
  off64_t pos;
  int result = 0;
  CHECK_FILE (fp, EOF);
  _IO_acquire_lock (fp);
  pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
  if (_IO_in_backup (fp) && pos != _IO_pos_BAD)
    {
      if (fp->_mode <= 0)
	pos -= fp->_IO_save_end - fp->_IO_save_base;
    }
  if (pos == _IO_pos_BAD)
    {
      /* ANSI explicitly requires setting errno to a positive value on
	 failure.  */
      if (errno == 0)
	__set_errno (EIO);
      result = EOF;
    }
  else
    {
      posp->__pos = pos;
      if (fp->_mode > 0 && __libio_codecvt_encoding (fp->_codecvt) < 0)
	/* This is a stateful encoding, safe the state.  */
	posp->__state = fp->_wide_data->_IO_state;
    }
  _IO_release_lock (fp);
  return result;
}
示例#2
0
long int
_IO_ftell (_IO_FILE *fp)
{
    _IO_off64_t pos;
    CHECK_FILE (fp, -1L);
    _IO_acquire_lock (fp);
    pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
    if (_IO_in_backup (fp) && pos != _IO_pos_BAD)
    {
        if (_IO_vtable_offset (fp) != 0 || fp->_mode <= 0)
            pos -= fp->_IO_save_end - fp->_IO_save_base;
    }
    _IO_release_lock (fp);
    if (pos == _IO_pos_BAD)
    {
#ifdef EIO
        if (errno == 0)
            __set_errno (EIO);
#endif
        return -1L;
    }
    if ((_IO_off64_t) (long int) pos != pos)
    {
#ifdef EOVERFLOW
        __set_errno (EOVERFLOW);
#endif
        return -1L;
    }
    return pos;
}
示例#3
0
int
_IO_new_fgetpos (_IO_FILE *fp, _IO_fpos_t *posp)
{
  _IO_off64_t pos;
  int result = 0;
  CHECK_FILE (fp, EOF);
  _IO_acquire_lock (fp);
  pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
  if (_IO_in_backup (fp) && pos != _IO_pos_BAD)
    {
      if (fp->_mode <= 0)
	pos -= fp->_IO_save_end - fp->_IO_save_base;
    }
  if (pos == _IO_pos_BAD)
    {
      /* ANSI explicitly requires setting errno to a positive value on
	 failure.  */
#ifdef EIO
      if (errno == 0)
	__set_errno (EIO);
#endif
      result = EOF;
    }
  else if ((_IO_off64_t) (__typeof (posp->__pos)) pos != pos)
    {
#ifdef EOVERFLOW
      __set_errno (EOVERFLOW);
#endif
      result = EOF;
    }
  else
    {
      posp->__pos = pos;
      if (fp->_mode > 0
	  && (*fp->_codecvt->__codecvt_do_encoding) (fp->_codecvt) < 0)
	/* This is a stateful encoding, safe the state.  */
	posp->__state = fp->_wide_data->_IO_state;
    }

  _IO_release_lock (fp);
  return result;
}
示例#4
0
文件: ftello64.c 项目: siddhesh/glibc
off64_t
ftello64 (_IO_FILE *fp)
{
  _IO_off64_t pos;
  CHECK_FILE (fp, -1L);
  _IO_acquire_lock (fp);
  pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
  if (_IO_in_backup (fp) && pos != _IO_pos_BAD)
    {
      if (fp->_mode <= 0)
	pos -= fp->_IO_save_end - fp->_IO_save_base;
    }
  _IO_release_lock (fp);
  if (pos == _IO_pos_BAD)
    {
#ifdef EIO
      if (errno == 0)
	__set_errno (EIO);
#endif
      return -1L;
    }
  return pos;
}
示例#5
0
int
attribute_compat_text_section
_IO_old_fgetpos64 (_IO_FILE *fp, _IO_fpos64_t *posp)
{
  _IO_off64_t pos;
  CHECK_FILE (fp, EOF);
  _IO_acquire_lock (fp);
  pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
  if (_IO_in_backup (fp) && pos != _IO_pos_BAD)
    pos -= fp->_IO_save_end - fp->_IO_save_base;
  _IO_release_lock (fp);
  if (pos == _IO_pos_BAD)
    {
      /* ANSI explicitly requires setting errno to a positive value on
	 failure.  */
#ifdef EIO
      if (errno == 0)
	__set_errno (EIO);
#endif
      return EOF;
    }
  posp->__pos = pos;
  return 0;
}