OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [gold/] [ftruncate.c] - Diff between revs 816 and 818

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 816 Rev 818
/* ftruncate emulations that work on some System V's.
/* ftruncate emulations that work on some System V's.
   This file is in the public domain.  */
   This file is in the public domain.  */
 
 
#include <config.h>
#include <config.h>
 
 
/* Specification.  */
/* Specification.  */
#include <unistd.h>
#include <unistd.h>
 
 
#include <sys/types.h>
#include <sys/types.h>
#include <fcntl.h>
#include <fcntl.h>
 
 
extern int ftruncate (int, off_t);
extern int ftruncate (int, off_t);
 
 
#ifdef F_CHSIZE
#ifdef F_CHSIZE
 
 
int
int
ftruncate (int fd, off_t length)
ftruncate (int fd, off_t length)
{
{
  return fcntl (fd, F_CHSIZE, length);
  return fcntl (fd, F_CHSIZE, length);
}
}
 
 
#else /* not F_CHSIZE */
#else /* not F_CHSIZE */
# ifdef F_FREESP
# ifdef F_FREESP
 
 
/* By William Kucharski <kucharsk@netcom.com>.  */
/* By William Kucharski <kucharsk@netcom.com>.  */
 
 
#  include <sys/stat.h>
#  include <sys/stat.h>
#  include <errno.h>
#  include <errno.h>
 
 
int
int
ftruncate (int fd, off_t length)
ftruncate (int fd, off_t length)
{
{
  struct flock fl;
  struct flock fl;
  struct stat filebuf;
  struct stat filebuf;
 
 
  if (fstat (fd, &filebuf) < 0)
  if (fstat (fd, &filebuf) < 0)
    return -1;
    return -1;
 
 
  if (filebuf.st_size < length)
  if (filebuf.st_size < length)
    {
    {
      /* Extend file length. */
      /* Extend file length. */
      if (lseek (fd, (length - 1), SEEK_SET) < 0)
      if (lseek (fd, (length - 1), SEEK_SET) < 0)
        return -1;
        return -1;
 
 
      /* Write a "0" byte. */
      /* Write a "0" byte. */
      if (write (fd, "", 1) != 1)
      if (write (fd, "", 1) != 1)
        return -1;
        return -1;
    }
    }
  else
  else
    {
    {
 
 
      /* Truncate length. */
      /* Truncate length. */
 
 
      fl.l_whence = 0;
      fl.l_whence = 0;
      fl.l_len = 0;
      fl.l_len = 0;
      fl.l_start = length;
      fl.l_start = length;
      fl.l_type = F_WRLCK;      /* write lock on file space */
      fl.l_type = F_WRLCK;      /* write lock on file space */
 
 
      /* This relies on the *undocumented* F_FREESP argument to fcntl,
      /* This relies on the *undocumented* F_FREESP argument to fcntl,
         which truncates the file so that it ends at the position
         which truncates the file so that it ends at the position
         indicated by fl.l_start.  Will minor miracles never cease?  */
         indicated by fl.l_start.  Will minor miracles never cease?  */
 
 
      if (fcntl (fd, F_FREESP, &fl) < 0)
      if (fcntl (fd, F_FREESP, &fl) < 0)
        return -1;
        return -1;
    }
    }
 
 
  return 0;
  return 0;
}
}
 
 
# else /* not F_CHSIZE nor F_FREESP */
# else /* not F_CHSIZE nor F_FREESP */
#  if HAVE_CHSIZE                      /* native Windows, e.g. mingw */
#  if HAVE_CHSIZE                      /* native Windows, e.g. mingw */
 
 
int
int
ftruncate (int fd, off_t length)
ftruncate (int fd, off_t length)
{
{
  return chsize (fd, length);
  return chsize (fd, length);
}
}
 
 
#  else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
#  else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
 
 
#   include <errno.h>
#   include <errno.h>
 
 
int
int
ftruncate (int fd, off_t length)
ftruncate (int fd, off_t length)
{
{
  errno = EIO;
  errno = EIO;
  return -1;
  return -1;
}
}
 
 
#  endif /* not HAVE_CHSIZE */
#  endif /* not HAVE_CHSIZE */
# endif /* not F_FREESP */
# endif /* not F_FREESP */
#endif /* not F_CHSIZE */
#endif /* not F_CHSIZE */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.