~youscribe/parted/3.1

« back to all changes in this revision

Viewing changes to lib/lseek.c

  • Committer: Guilhem Lettron
  • Date: 2012-10-22 14:37:59 UTC
  • Revision ID: guilhem+ubuntu@lettron.fr-20121022143759-m403kecgz13sknvp
3.1 from tarball

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* An lseek() function that detects pipes.
 
2
   Copyright (C) 2007, 2009-2012 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 <http://www.gnu.org/licenses/>.  */
 
16
 
 
17
#include <config.h>
 
18
 
 
19
/* Specification.  */
 
20
#include <unistd.h>
 
21
 
 
22
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 
23
/* Windows platforms.  */
 
24
/* Get GetFileType.  */
 
25
# include <windows.h>
 
26
/* Get _get_osfhandle.  */
 
27
# include "msvc-nothrow.h"
 
28
#else
 
29
# include <sys/stat.h>
 
30
#endif
 
31
#include <errno.h>
 
32
 
 
33
#undef lseek
 
34
 
 
35
off_t
 
36
rpl_lseek (int fd, off_t offset, int whence)
 
37
{
 
38
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
 
39
  /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals.  */
 
40
  HANDLE h = (HANDLE) _get_osfhandle (fd);
 
41
  if (h == INVALID_HANDLE_VALUE)
 
42
    {
 
43
      errno = EBADF;
 
44
      return -1;
 
45
    }
 
46
  if (GetFileType (h) != FILE_TYPE_DISK)
 
47
    {
 
48
      errno = ESPIPE;
 
49
      return -1;
 
50
    }
 
51
#else
 
52
  /* BeOS lseek mistakenly succeeds on pipes...  */
 
53
  struct stat statbuf;
 
54
  if (fstat (fd, &statbuf) < 0)
 
55
    return -1;
 
56
  if (!S_ISREG (statbuf.st_mode))
 
57
    {
 
58
      errno = ESPIPE;
 
59
      return -1;
 
60
    }
 
61
#endif
 
62
  return lseek (fd, offset, whence);
 
63
}