Blame sysdeps/posix/fpathconf.c

Packit Service 82fcde
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <stddef.h>
Packit Service 82fcde
#include <unistd.h>
Packit Service 82fcde
#include <limits.h>
Packit Service 82fcde
#include <sys/stat.h>
Packit Service 82fcde
#include <sys/statfs.h>
Packit Service 82fcde
#include <sys/statvfs.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Get file-specific information about descriptor FD.  */
Packit Service 82fcde
long int
Packit Service 82fcde
__fpathconf (int fd, int name)
Packit Service 82fcde
{
Packit Service 82fcde
  if (fd < 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      __set_errno (EBADF);
Packit Service 82fcde
      return -1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  switch (name)
Packit Service 82fcde
    {
Packit Service 82fcde
    default:
Packit Service 82fcde
      __set_errno (EINVAL);
Packit Service 82fcde
      return -1;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_LINK_MAX:
Packit Service 82fcde
#ifdef	LINK_MAX
Packit Service 82fcde
      return LINK_MAX;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_MAX_CANON:
Packit Service 82fcde
#ifdef	MAX_CANON
Packit Service 82fcde
      return MAX_CANON;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_MAX_INPUT:
Packit Service 82fcde
#ifdef	MAX_INPUT
Packit Service 82fcde
      return MAX_INPUT;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_NAME_MAX:
Packit Service 82fcde
#ifdef	NAME_MAX
Packit Service 82fcde
      {
Packit Service 82fcde
	struct statvfs64 sv;
Packit Service 82fcde
	int save_errno = errno;
Packit Service 82fcde
Packit Service 82fcde
	if (__fstatvfs64 (fd, &sv) < 0)
Packit Service 82fcde
	  {
Packit Service 82fcde
	    if (errno == ENOSYS)
Packit Service 82fcde
	      {
Packit Service 82fcde
		__set_errno (save_errno);
Packit Service 82fcde
		return NAME_MAX;
Packit Service 82fcde
	      }
Packit Service 82fcde
	    else if (errno == ENODEV)
Packit Service 82fcde
	      __set_errno (EINVAL);
Packit Service 82fcde
Packit Service 82fcde
	    return -1;
Packit Service 82fcde
	  }
Packit Service 82fcde
	else
Packit Service 82fcde
	  {
Packit Service 82fcde
	    return sv.f_namemax;
Packit Service 82fcde
	  }
Packit Service 82fcde
      }
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_PATH_MAX:
Packit Service 82fcde
#ifdef	PATH_MAX
Packit Service 82fcde
      return PATH_MAX;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_PIPE_BUF:
Packit Service 82fcde
#ifdef	PIPE_BUF
Packit Service 82fcde
      return PIPE_BUF;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_CHOWN_RESTRICTED:
Packit Service 82fcde
#if _POSIX_CHOWN_RESTRICTED == -1
Packit Service 82fcde
# error "Invalid value for _POSIX_CHOWN_RESTRICTED"
Packit Service 82fcde
#endif
Packit Service 82fcde
      return _POSIX_CHOWN_RESTRICTED;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_NO_TRUNC:
Packit Service 82fcde
#if _POSIX_NO_TRUNC == -1
Packit Service 82fcde
# error "Invalid value for _POSIX_NO_TRUNC"
Packit Service 82fcde
#endif
Packit Service 82fcde
      return _POSIX_NO_TRUNC;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_VDISABLE:
Packit Service 82fcde
#if _POSIX_VDISABLE == -1
Packit Service 82fcde
# error "Invalid value for _POSIX_VDISABLE"
Packit Service 82fcde
#endif
Packit Service 82fcde
      return _POSIX_VDISABLE;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_SYNC_IO:
Packit Service 82fcde
#ifdef	_POSIX_SYNC_IO
Packit Service 82fcde
      return _POSIX_SYNC_IO;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_ASYNC_IO:
Packit Service 82fcde
#ifdef	_POSIX_ASYNC_IO
Packit Service 82fcde
      {
Packit Service 82fcde
	/* AIO is only allowed on regular files and block devices.  */
Packit Service 82fcde
	struct stat64 st;
Packit Service 82fcde
Packit Service 82fcde
	if (__fxstat64 (_STAT_VER, fd, &st) < 0
Packit Service 82fcde
	    || (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))
Packit Service 82fcde
	  return -1;
Packit Service 82fcde
	else
Packit Service 82fcde
	  return 1;
Packit Service 82fcde
      }
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_PRIO_IO:
Packit Service 82fcde
#ifdef	_POSIX_PRIO_IO
Packit Service 82fcde
      return _POSIX_PRIO_IO;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_SOCK_MAXBUF:
Packit Service 82fcde
#ifdef	SOCK_MAXBUF
Packit Service 82fcde
      return SOCK_MAXBUF;
Packit Service 82fcde
#else
Packit Service 82fcde
      return -1;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_FILESIZEBITS:
Packit Service 82fcde
#ifdef FILESIZEBITS
Packit Service 82fcde
      return FILESIZEBITS;
Packit Service 82fcde
#else
Packit Service 82fcde
      /* We let platforms with larger file sizes overwrite this value.  */
Packit Service 82fcde
      return 32;
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
    case _PC_REC_INCR_XFER_SIZE:
Packit Service 82fcde
      /* XXX It is not entirely clear what the limit is supposed to do.
Packit Service 82fcde
	 What is incremented?  */
Packit Service 82fcde
      return -1;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_REC_MAX_XFER_SIZE:
Packit Service 82fcde
      /* XXX It is not entirely clear what the limit is supposed to do.
Packit Service 82fcde
	 In general there is no top limit of the number of bytes which
Packit Service 82fcde
	 case be transported at once.  */
Packit Service 82fcde
      return -1;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_REC_MIN_XFER_SIZE:
Packit Service 82fcde
      {
Packit Service 82fcde
	/* XXX It is not entirely clear what the limit is supposed to do.
Packit Service 82fcde
	   I assume this is the block size of the filesystem.  */
Packit Service 82fcde
	struct statvfs64 sv;
Packit Service 82fcde
Packit Service 82fcde
	if (__fstatvfs64 (fd, &sv) < 0)
Packit Service 82fcde
	  return -1;
Packit Service 82fcde
	return sv.f_bsize;
Packit Service 82fcde
      }
Packit Service 82fcde
Packit Service 82fcde
    case _PC_REC_XFER_ALIGN:
Packit Service 82fcde
      {
Packit Service 82fcde
	/* XXX It is not entirely clear what the limit is supposed to do.
Packit Service 82fcde
	   I assume that the number should reflect the minimal block
Packit Service 82fcde
	   alignment.  */
Packit Service 82fcde
	struct statvfs64 sv;
Packit Service 82fcde
Packit Service 82fcde
	if (__fstatvfs64 (fd, &sv) < 0)
Packit Service 82fcde
	  return -1;
Packit Service 82fcde
	return sv.f_frsize;
Packit Service 82fcde
      }
Packit Service 82fcde
Packit Service 82fcde
    case _PC_ALLOC_SIZE_MIN:
Packit Service 82fcde
      {
Packit Service 82fcde
	/* XXX It is not entirely clear what the limit is supposed to do.
Packit Service 82fcde
	   I assume that the number should reflect the minimal block
Packit Service 82fcde
	   alignment.  */
Packit Service 82fcde
	struct statvfs64 sv;
Packit Service 82fcde
Packit Service 82fcde
	if (__fstatvfs64 (fd, &sv) < 0)
Packit Service 82fcde
	  return -1;
Packit Service 82fcde
	return sv.f_frsize;
Packit Service 82fcde
      }
Packit Service 82fcde
Packit Service 82fcde
    case _PC_SYMLINK_MAX:
Packit Service 82fcde
      /* In general there are no limits.  If a system has one it should
Packit Service 82fcde
	 overwrite this case.  */
Packit Service 82fcde
      return -1;
Packit Service 82fcde
Packit Service 82fcde
    case _PC_2_SYMLINKS:
Packit Service 82fcde
      /* Unix systems generally have symlinks.  */
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#undef __fpathconf
Packit Service 82fcde
weak_alias (__fpathconf, fpathconf)