| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 | /* Copyright (C) 1991,1995,1996,1998,2000,2001,2003   Free Software Foundation, Inc.   This file is part of the GNU C Library.   The GNU C Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public   License as published by the Free Software Foundation; either   version 2.1 of the License, or (at your option) any later version.   The GNU C Library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; if not, see   <http://www.gnu.org/licenses/>.  *//* pathconf -- adjusted for busybox *//* It would be great it this could be implemented using fpathconf, * but that doesn't work out very well (think FIFOs and sockets) */#include <errno.h>#include <stddef.h>#include <unistd.h>#include <limits.h>#include <fcntl.h>#include <sys/stat.h>#include <sys/statfs.h>extern __typeof(statfs) __libc_statfs;/* The Linux kernel headers mention this as a kind of generic value. */#ifndef LINK_MAX# define LINK_MAX 127#endif/* Get file-specific information about PATH.  */long intpathconf (const char *path, int name){  if (path[0] == '\0')    {      __set_errno (ENOENT);      return -1;    }  switch (name)    {    default:      __set_errno (EINVAL);      return -1;    case _PC_LINK_MAX:#ifdef	LINK_MAX      return LINK_MAX;#else      return -1;#endif    case _PC_MAX_CANON:#ifdef	MAX_CANON      return MAX_CANON;#else      return -1;#endif    case _PC_MAX_INPUT:#ifdef	MAX_INPUT      return MAX_INPUT;#else      return -1;#endif    case _PC_NAME_MAX:#ifdef	NAME_MAX      {	struct statfs buf;	int save_errno = errno;	if (__libc_statfs (path, &buf) < 0)	  {	    if (errno == ENOSYS)	      {		errno = save_errno;		return NAME_MAX;	      }	    return -1;	  }	else	  {#ifdef _STATFS_F_NAMELEN	    return buf.f_namelen;#else# ifdef _STATFS_F_NAME_MAX	    return buf.f_name_max;# else	    return NAME_MAX;# endif#endif	  }      }#else      return -1;#endif    case _PC_PATH_MAX:#ifdef	PATH_MAX      return PATH_MAX;#else      return -1;#endif    case _PC_PIPE_BUF:#ifdef	PIPE_BUF      return PIPE_BUF;#else      return -1;#endif    case _PC_CHOWN_RESTRICTED:#ifdef	_POSIX_CHOWN_RESTRICTED      return _POSIX_CHOWN_RESTRICTED;#else      return -1;#endif    case _PC_NO_TRUNC:#ifdef	_POSIX_NO_TRUNC      return _POSIX_NO_TRUNC;#else      return -1;#endif    case _PC_VDISABLE:#ifdef	_POSIX_VDISABLE      return _POSIX_VDISABLE;#else      return -1;#endif    case _PC_SYNC_IO:#ifdef	_POSIX_SYNC_IO      return _POSIX_SYNC_IO;#else      return -1;#endif    case _PC_ASYNC_IO:#if defined _POSIX_ASYNC_IO && defined __UCLIBC_HAS_LFS__      {	/* AIO is only allowed on regular files and block devices.  */	struct stat st;	if (stat (path, &st) < 0	    || (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))	  return -1;	else	  return 1;      }#else      return -1;#endif    case _PC_PRIO_IO:#ifdef	_POSIX_PRIO_IO      return _POSIX_PRIO_IO;#else      return -1;#endif    case _PC_SOCK_MAXBUF:#ifdef	SOCK_MAXBUF      return SOCK_MAXBUF;#else      return -1;#endif    case _PC_FILESIZEBITS:#ifdef FILESIZEBITS      return FILESIZEBITS;#else      /* We let platforms with larger file sizes overwrite this value.  */      return 32;#endif        /* Be lazy -- skip these */    case _PC_REC_INCR_XFER_SIZE:    case _PC_REC_MAX_XFER_SIZE:    case _PC_REC_MIN_XFER_SIZE:    case _PC_REC_XFER_ALIGN:    case _PC_ALLOC_SIZE_MIN:    case _PC_SYMLINK_MAX:      return -1;    }}
 |