(root)/
m4-1.4.19/
lib/
lseek.c
       1  /* An lseek() function that detects pipes.
       2     Copyright (C) 2007, 2009-2021 Free Software Foundation, Inc.
       3  
       4     This program is free software; you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation; either version 3, or (at your option)
       7     any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License along
      15     with this program; if not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  /* Specification.  */
      20  #include <unistd.h>
      21  
      22  #if defined _WIN32 && ! defined __CYGWIN__
      23  /* Windows platforms.  */
      24  /* Get GetFileType.  */
      25  # include <windows.h>
      26  /* Get _get_osfhandle.  */
      27  # if GNULIB_MSVC_NOTHROW
      28  #  include "msvc-nothrow.h"
      29  # else
      30  #  include <io.h>
      31  # endif
      32  #else
      33  # include <sys/stat.h>
      34  #endif
      35  #include <errno.h>
      36  
      37  #undef lseek
      38  
      39  off_t
      40  rpl_lseek (int fd, off_t offset, int whence)
      41  {
      42  #if defined _WIN32 && ! defined __CYGWIN__
      43    /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals.  */
      44    HANDLE h = (HANDLE) _get_osfhandle (fd);
      45    if (h == INVALID_HANDLE_VALUE)
      46      {
      47        errno = EBADF;
      48        return -1;
      49      }
      50    if (GetFileType (h) != FILE_TYPE_DISK)
      51      {
      52        errno = ESPIPE;
      53        return -1;
      54      }
      55  #else
      56    /* BeOS lseek mistakenly succeeds on pipes...  */
      57    struct stat statbuf;
      58    if (fstat (fd, &statbuf) < 0)
      59      return -1;
      60    if (!S_ISREG (statbuf.st_mode))
      61      {
      62        errno = ESPIPE;
      63        return -1;
      64      }
      65  #endif
      66  #if _GL_WINDOWS_64_BIT_OFF_T || (defined __MINGW32__ && defined _FILE_OFFSET_BITS && (_FILE_OFFSET_BITS == 64))
      67    return _lseeki64 (fd, offset, whence);
      68  #else
      69    return lseek (fd, offset, whence);
      70  #endif
      71  }