|
@@ -1,5 +1,5 @@
|
|
-/* pathconf -- adjusted for busybox
|
|
|
|
- Copyright (C) 1991,95,96,98,99,2000,2001 Free Software Foundation, Inc.
|
|
|
|
|
|
+/* Copyright (C) 1991,1995,1996,1998,2000,2001,2003
|
|
|
|
+ Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
This file is part of the GNU C Library.
|
|
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
@@ -17,14 +17,11 @@
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA. */
|
|
02111-1307 USA. */
|
|
|
|
|
|
|
|
+/* pathconf -- adjusted for busybox */
|
|
|
|
|
|
/* It would be great it this could be implemented using fpathconf,
|
|
/* It would be great it this could be implemented using fpathconf,
|
|
* but that doesn't work out very well (think FIFOs and sockets) */
|
|
* but that doesn't work out very well (think FIFOs and sockets) */
|
|
|
|
|
|
-#include <errno.h>
|
|
|
|
-#include <unistd.h>
|
|
|
|
-#include <limits.h>
|
|
|
|
-#include <sys/statfs.h>
|
|
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
#include <stddef.h>
|
|
#include <stddef.h>
|
|
#include <unistd.h>
|
|
#include <unistd.h>
|
|
@@ -34,219 +31,166 @@
|
|
#include <sys/statfs.h>
|
|
#include <sys/statfs.h>
|
|
//#include <sys/statvfs.h>
|
|
//#include <sys/statvfs.h>
|
|
|
|
|
|
-//#include "linux_fsinfo.h"
|
|
|
|
-
|
|
|
|
libc_hidden_proto(statfs)
|
|
libc_hidden_proto(statfs)
|
|
libc_hidden_proto(stat)
|
|
libc_hidden_proto(stat)
|
|
|
|
|
|
-/* 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 pathconf(const char *path, int name)
|
|
|
|
|
|
+/* Get file-specific information about PATH. */
|
|
|
|
+long int
|
|
|
|
+pathconf (const char *path, int name)
|
|
{
|
|
{
|
|
- if (path[0] == '\0')
|
|
|
|
|
|
+ if (path[0] == '\0')
|
|
{
|
|
{
|
|
- __set_errno (ENOENT);
|
|
|
|
- return -1;
|
|
|
|
|
|
+ __set_errno (ENOENT);
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
|
|
|
|
- if (name == _PC_LINK_MAX)
|
|
|
|
|
|
+ switch (name)
|
|
{
|
|
{
|
|
- /* Cut some corners */
|
|
|
|
-#if 0
|
|
|
|
- struct statfs fsbuf;
|
|
|
|
-
|
|
|
|
- /* Determine the filesystem type. */
|
|
|
|
- if (statfs (path, &fsbuf) < 0)
|
|
|
|
- {
|
|
|
|
- if (errno == ENOSYS)
|
|
|
|
- /* not possible, return the default value. */
|
|
|
|
- return LINUX_LINK_MAX;
|
|
|
|
-
|
|
|
|
- /* Some error occured. */
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
|
|
+ default:
|
|
|
|
+ __set_errno (EINVAL);
|
|
|
|
+ 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;
|
|
|
|
- }
|
|
|
|
|
|
+ case _PC_LINK_MAX:
|
|
|
|
+#ifdef LINK_MAX
|
|
|
|
+ return LINK_MAX;
|
|
#else
|
|
#else
|
|
- return LINUX_LINK_MAX;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
- }
|
|
|
|
-
|
|
|
|
- switch (name)
|
|
|
|
- {
|
|
|
|
- default:
|
|
|
|
- __set_errno (EINVAL);
|
|
|
|
- return -1;
|
|
|
|
|
|
|
|
- case _PC_MAX_CANON:
|
|
|
|
|
|
+ case _PC_MAX_CANON:
|
|
#ifdef MAX_CANON
|
|
#ifdef MAX_CANON
|
|
- return MAX_CANON;
|
|
|
|
|
|
+ return MAX_CANON;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_MAX_INPUT:
|
|
|
|
|
|
+ case _PC_MAX_INPUT:
|
|
#ifdef MAX_INPUT
|
|
#ifdef MAX_INPUT
|
|
- return MAX_INPUT;
|
|
|
|
|
|
+ return MAX_INPUT;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_NAME_MAX:
|
|
|
|
|
|
+ case _PC_NAME_MAX:
|
|
#ifdef NAME_MAX
|
|
#ifdef NAME_MAX
|
|
- {
|
|
|
|
- struct statfs buf;
|
|
|
|
- int save_errno = errno;
|
|
|
|
-
|
|
|
|
- if (statfs (path, &buf) < 0)
|
|
|
|
- {
|
|
|
|
- if (errno == ENOSYS)
|
|
|
|
- {
|
|
|
|
- errno = save_errno;
|
|
|
|
- return NAME_MAX;
|
|
|
|
- }
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
|
|
+ {
|
|
|
|
+ struct statfs buf;
|
|
|
|
+ int save_errno = errno;
|
|
|
|
+
|
|
|
|
+ if (statfs (path, &buf) < 0)
|
|
|
|
+ {
|
|
|
|
+ if (errno == ENOSYS)
|
|
|
|
+ {
|
|
|
|
+ errno = save_errno;
|
|
|
|
+ return NAME_MAX;
|
|
|
|
+ }
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
#ifdef _STATFS_F_NAMELEN
|
|
#ifdef _STATFS_F_NAMELEN
|
|
- return buf.f_namelen;
|
|
|
|
|
|
+ return buf.f_namelen;
|
|
#else
|
|
#else
|
|
# ifdef _STATFS_F_NAME_MAX
|
|
# ifdef _STATFS_F_NAME_MAX
|
|
- return buf.f_name_max;
|
|
|
|
|
|
+ return buf.f_name_max;
|
|
# else
|
|
# else
|
|
- return NAME_MAX;
|
|
|
|
|
|
+ return NAME_MAX;
|
|
# endif
|
|
# endif
|
|
#endif
|
|
#endif
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ }
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_PATH_MAX:
|
|
|
|
|
|
+ case _PC_PATH_MAX:
|
|
#ifdef PATH_MAX
|
|
#ifdef PATH_MAX
|
|
- return PATH_MAX;
|
|
|
|
|
|
+ return PATH_MAX;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_PIPE_BUF:
|
|
|
|
|
|
+ case _PC_PIPE_BUF:
|
|
#ifdef PIPE_BUF
|
|
#ifdef PIPE_BUF
|
|
- return PIPE_BUF;
|
|
|
|
|
|
+ return PIPE_BUF;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_CHOWN_RESTRICTED:
|
|
|
|
|
|
+ case _PC_CHOWN_RESTRICTED:
|
|
#ifdef _POSIX_CHOWN_RESTRICTED
|
|
#ifdef _POSIX_CHOWN_RESTRICTED
|
|
- return _POSIX_CHOWN_RESTRICTED;
|
|
|
|
|
|
+ return _POSIX_CHOWN_RESTRICTED;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_NO_TRUNC:
|
|
|
|
|
|
+ case _PC_NO_TRUNC:
|
|
#ifdef _POSIX_NO_TRUNC
|
|
#ifdef _POSIX_NO_TRUNC
|
|
- return _POSIX_NO_TRUNC;
|
|
|
|
|
|
+ return _POSIX_NO_TRUNC;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_VDISABLE:
|
|
|
|
|
|
+ case _PC_VDISABLE:
|
|
#ifdef _POSIX_VDISABLE
|
|
#ifdef _POSIX_VDISABLE
|
|
- return _POSIX_VDISABLE;
|
|
|
|
|
|
+ return _POSIX_VDISABLE;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_SYNC_IO:
|
|
|
|
|
|
+ case _PC_SYNC_IO:
|
|
#ifdef _POSIX_SYNC_IO
|
|
#ifdef _POSIX_SYNC_IO
|
|
- return _POSIX_SYNC_IO;
|
|
|
|
|
|
+ return _POSIX_SYNC_IO;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#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;
|
|
|
|
- }
|
|
|
|
|
|
+ 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
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_PRIO_IO:
|
|
|
|
|
|
+ case _PC_PRIO_IO:
|
|
#ifdef _POSIX_PRIO_IO
|
|
#ifdef _POSIX_PRIO_IO
|
|
- return _POSIX_PRIO_IO;
|
|
|
|
|
|
+ return _POSIX_PRIO_IO;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_SOCK_MAXBUF:
|
|
|
|
|
|
+ case _PC_SOCK_MAXBUF:
|
|
#ifdef SOCK_MAXBUF
|
|
#ifdef SOCK_MAXBUF
|
|
- return SOCK_MAXBUF;
|
|
|
|
|
|
+ return SOCK_MAXBUF;
|
|
#else
|
|
#else
|
|
- return -1;
|
|
|
|
|
|
+ return -1;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- case _PC_FILESIZEBITS:
|
|
|
|
|
|
+ case _PC_FILESIZEBITS:
|
|
#ifdef FILESIZEBITS
|
|
#ifdef FILESIZEBITS
|
|
- return FILESIZEBITS;
|
|
|
|
|
|
+ return FILESIZEBITS;
|
|
#else
|
|
#else
|
|
- /* We let platforms with larger file sizes overwrite this value. */
|
|
|
|
- return 32;
|
|
|
|
|
|
+ /* We let platforms with larger file sizes overwrite this value. */
|
|
|
|
+ return 32;
|
|
#endif
|
|
#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;
|
|
|
|
|
|
+ /* 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;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
-
|
|
|