123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- #include <errno.h>
- #include <unistd.h>
- #include <limits.h>
- #include <stddef.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <sys/statfs.h>
- #define STAT stat64
- #define FSTAT fstat64
- #ifndef __USE_FILE_OFFSET64
- extern int fstatfs (int __fildes, struct statfs *__buf)
- __THROW __nonnull ((2));
- #else
- # ifdef __REDIRECT_NTH
- extern int __REDIRECT_NTH (fstatfs, (int __fildes, struct statfs *__buf),
- fstatfs64) __nonnull ((2));
- # else
- # define fstatfs fstatfs64
- # endif
- #endif
- extern __typeof(fstatfs) __libc_fstatfs;
- #define LINUX_LINK_MAX 127
- long int fpathconf(int fd, int name)
- {
- if (fd < 0)
- {
- __set_errno (EBADF);
- return -1;
- }
- if (name == _PC_LINK_MAX)
- {
-
- #if 0
- struct statfs fsbuf;
-
- if (__libc_fstatfs (fd, &fsbuf) < 0)
- {
- if (errno == ENOSYS)
-
- return LINUX_LINK_MAX;
-
- return -1;
- }
- switch (fsbuf.f_type)
- {
- case EXT2_SUPER_MAGIC:
- return EXT2_LINK_MAX;
- case MINIX_SUPER_MAGIC:
- case MINIX_SUPER_MAGIC2:
- return MINIX_LINK_MAX;
- case MINIX2_SUPER_MAGIC:
- case MINIX2_SUPER_MAGIC2:
- return MINIX2_LINK_MAX;
- case XENIX_SUPER_MAGIC:
- return XENIX_LINK_MAX;
- case SYSV4_SUPER_MAGIC:
- case SYSV2_SUPER_MAGIC:
- return SYSV_LINK_MAX;
- case COH_SUPER_MAGIC:
- return COH_LINK_MAX;
- case UFS_MAGIC:
- case UFS_CIGAM:
- return UFS_LINK_MAX;
- case REISERFS_SUPER_MAGIC:
- return REISERFS_LINK_MAX;
- default:
- return LINUX_LINK_MAX;
- }
- #else
- return LINUX_LINK_MAX;
- #endif
- }
- switch (name)
- {
- default:
- __set_errno (EINVAL);
- return -1;
- 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_fstatfs (fd, &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
- {
-
- struct STAT st;
- if (FSTAT (fd, &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
-
- return 32;
- #endif
-
- 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;
- }
- }
|