diff options
author | Bruno Haible <bruno@clisp.org> | 2011-09-22 14:16:31 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2011-09-22 14:16:31 +0200 |
commit | d8710037842f70e32a5b56c685437b51165d2f5b (patch) | |
tree | 3fd83a8b540e14e2944c1f621bf692d2dc925222 /lib/ftruncate.c | |
parent | f45922077ff338dc3d393892a13bed981d6f7701 (diff) | |
download | gnulib-d8710037842f70e32a5b56c685437b51165d2f5b.tar.gz |
ftruncate: Un-deprecate, concentrate on Win32 support.
* modules/ftruncate (Status, Notice): Remove sections.
(Depends-on): Add largefile.
* m4/ftruncate.m4 (gl_FUNC_FTRUNCATE): Drop failure message on
non-mingw platforms.
* lib/ftruncate.c: Remove code for the older platforms. For Win32,
include <io.h>.
* modules/perror-tests (Depends-on): Add ftruncate.
* doc/posix-functions/ftruncate.texi: Mention the MSVC problem and the
'ftruncate' module.
Diffstat (limited to 'lib/ftruncate.c')
-rw-r--r-- | lib/ftruncate.c | 79 |
1 files changed, 4 insertions, 75 deletions
diff --git a/lib/ftruncate.c b/lib/ftruncate.c index 33b69d8107..d5a3be144c 100644 --- a/lib/ftruncate.c +++ b/lib/ftruncate.c @@ -1,4 +1,4 @@ -/* ftruncate emulations that work on some System V's. +/* ftruncate emulations for native Windows. This file is in the public domain. */ #include <config.h> @@ -6,67 +6,9 @@ /* Specification. */ #include <unistd.h> -#include <sys/types.h> -#include <fcntl.h> +#if HAVE_CHSIZE -#ifdef F_CHSIZE - -int -ftruncate (int fd, off_t length) -{ - return fcntl (fd, F_CHSIZE, length); -} - -#else /* not F_CHSIZE */ -# ifdef F_FREESP - -/* By William Kucharski <kucharsk@netcom.com>. */ - -# include <sys/stat.h> -# include <errno.h> - -int -ftruncate (int fd, off_t length) -{ - struct flock fl; - struct stat filebuf; - - if (fstat (fd, &filebuf) < 0) - return -1; - - if (filebuf.st_size < length) - { - /* Extend file length. */ - if (lseek (fd, (length - 1), SEEK_SET) < 0) - return -1; - - /* Write a "0" byte. */ - if (write (fd, "", 1) != 1) - return -1; - } - else - { - - /* Truncate length. */ - - fl.l_whence = 0; - fl.l_len = 0; - fl.l_start = length; - fl.l_type = F_WRLCK; /* write lock on file space */ - - /* This relies on the *undocumented* F_FREESP argument to fcntl, - which truncates the file so that it ends at the position - indicated by fl.l_start. Will minor miracles never cease? */ - - if (fcntl (fd, F_FREESP, &fl) < 0) - return -1; - } - - return 0; -} - -# else /* not F_CHSIZE nor F_FREESP */ -# if HAVE_CHSIZE /* native Windows, e.g. mingw */ +# include <io.h> int ftruncate (int fd, off_t length) @@ -74,17 +16,4 @@ ftruncate (int fd, off_t length) return chsize (fd, length); } -# else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */ - -# include <errno.h> - -int -ftruncate (int fd, off_t length) -{ - errno = EIO; - return -1; -} - -# endif /* not HAVE_CHSIZE */ -# endif /* not F_FREESP */ -#endif /* not F_CHSIZE */ +#endif |