|
@@ -1,30 +1,246 @@
|
|
|
-/* vi: set sw=4 ts=4: */
|
|
|
-/*
|
|
|
- * fpathconf for uClibc
|
|
|
- *
|
|
|
- * Copyright (C) 2001 by Lineo, inc. Written by
|
|
|
- * Erik Andersen * <andersen@lineo.com>, <andersee@debian.org>
|
|
|
- *
|
|
|
- * This program is free software; you can redistribute it and/or modify it
|
|
|
- * under the terms of the GNU Library General Public License as published by
|
|
|
- * the Free Software Foundation; either version 2 of the License, or (at your
|
|
|
- * option) any later version.
|
|
|
- *
|
|
|
- * This program 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 Library General Public License
|
|
|
- * for more details.
|
|
|
- *
|
|
|
- * You should have received a copy of the GNU Library General Public License
|
|
|
- * along with this program; if not, write to the Free Software Foundation,
|
|
|
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
- *
|
|
|
- */
|
|
|
+/* fpathconf -- adjusted for busybox
|
|
|
+ Copyright (C) 1991,95,96,98,99,2000,2001 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, write to the Free
|
|
|
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
|
+ 02111-1307 USA. */
|
|
|
+
|
|
|
+#include <errno.h>
|
|
|
#include <unistd.h>
|
|
|
+#include <limits.h>
|
|
|
+#include <sys/statfs.h>
|
|
|
+#include <errno.h>
|
|
|
+#include <stddef.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <limits.h>
|
|
|
+#include <fcntl.h>
|
|
|
+#include <sys/stat.h>
|
|
|
+#include <sys/statfs.h>
|
|
|
+//#include <sys/statvfs.h>
|
|
|
+
|
|
|
+//#include "linux_fsinfo.h"
|
|
|
|
|
|
-long fpathconf(int filedes, int name)
|
|
|
-{
|
|
|
+
|
|
|
+/* The Linux kernel headers mention this as a kind of generic value. */
|
|
|
+#define LINUX_LINK_MAX 127
|
|
|
+
|
|
|
+
|
|
|
+/* Get file-specific information about descriptor FD. */
|
|
|
+long int fpathconf(int fd, int name)
|
|
|
+{
|
|
|
+ if (fd < 0)
|
|
|
+ {
|
|
|
+ __set_errno (EBADF);
|
|
|
return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (name == _PC_LINK_MAX)
|
|
|
+ {
|
|
|
+ /* Cut some corners */
|
|
|
+#if 0
|
|
|
+ struct statfs fsbuf;
|
|
|
+
|
|
|
+ /* Determine the filesystem type. */
|
|
|
+ if (fstatfs (fd, &fsbuf) < 0)
|
|
|
+ {
|
|
|
+ if (errno == ENOSYS)
|
|
|
+ /* not possible, return the default value. */
|
|
|
+ return LINUX_LINK_MAX;
|
|
|
+
|
|
|
+ /* Some error occured. */
|
|
|
+ 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 (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 && defined __UCLIBC_HAVE_LFS__
|
|
|
+ {
|
|
|
+ /* AIO is only allowed on regular files and block devices. */
|
|
|
+ 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
|
|
|
+ /* 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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|