diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/fpathconf.c | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/linux_fsinfo.h | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/pathconf.c | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/pathconf.h | 41 |
4 files changed, 55 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/fpathconf.c b/sysdeps/unix/sysv/linux/fpathconf.c index 4dd6059974..9eca7175cc 100644 --- a/sysdeps/unix/sysv/linux/fpathconf.c +++ b/sysdeps/unix/sysv/linux/fpathconf.c @@ -1,5 +1,5 @@ /* Get file-specific information about descriptor FD. Linux version. - Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1991,1995,1996,1998-2002,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 @@ -38,8 +38,13 @@ __fpathconf (fd, name) { case _PC_LINK_MAX: return statfs_link_max (__fstatfs (fd, &fsbuf), &fsbuf); + case _PC_FILESIZEBITS: return statfs_filesize_max (__fstatfs (fd, &fsbuf), &fsbuf); + + case _PC_2_SYMLINKS: + return statfs_symlinks (__fstatfs (fd, &fsbuf), &fsbuf); + default: return posix_fpathconf (fd, name); } diff --git a/sysdeps/unix/sysv/linux/linux_fsinfo.h b/sysdeps/unix/sysv/linux/linux_fsinfo.h index 0e67fe7245..d108753085 100644 --- a/sysdeps/unix/sysv/linux/linux_fsinfo.h +++ b/sysdeps/unix/sysv/linux/linux_fsinfo.h @@ -1,5 +1,5 @@ /* Constants from kernel header for various FSes. - Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1998,1999,2000,2001,2002,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 @@ -40,6 +40,9 @@ /* Constants that identify the `coherent' filesystem. */ #define COH_SUPER_MAGIC 0x012ff7b7 +/* Constant that identifies the `ramfs' filesystem. */ +#define CRAMFS_MAGIC 0x28cd3d45 + /* Constant that identifies the `devfs' filesystem. */ #define DEVFS_SUPER_MAGIC 0x1373 @@ -48,6 +51,7 @@ /* Constant that identifies the `efs' filesystem. */ #define EFS_SUPER_MAGIC 0x414A53 +#define EFS_MAGIC 0x072959 /* Constant that identifies the `ext2' and `ext3' filesystems. */ #define EXT2_SUPER_MAGIC 0xef53 diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c index 6115335334..b4886158f3 100644 --- a/sysdeps/unix/sysv/linux/pathconf.c +++ b/sysdeps/unix/sysv/linux/pathconf.c @@ -1,5 +1,5 @@ /* Get file-specific information about a file. Linux version. - Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1991,1995,1996,1998-2002,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 @@ -36,8 +36,13 @@ __pathconf (const char *file, int name) { case _PC_LINK_MAX: return statfs_link_max (__statfs (file, &fsbuf), &fsbuf); + case _PC_FILESIZEBITS: return statfs_filesize_max (__statfs (file, &fsbuf), &fsbuf); + + case _PC_2_SYMLINKS: + return statfs_symlinks (__statfs (file, &fsbuf), &fsbuf); + default: return posix_pathconf (file, name); } diff --git a/sysdeps/unix/sysv/linux/pathconf.h b/sysdeps/unix/sysv/linux/pathconf.h index b7f201d436..80ec8fa4e0 100644 --- a/sysdeps/unix/sysv/linux/pathconf.h +++ b/sysdeps/unix/sysv/linux/pathconf.h @@ -1,5 +1,5 @@ /* Common parts of Linux implementation of pathconf and fpathconf. - Copyright (C) 1991,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. + Copyright (C) 1991,1995,1996,1998-2002,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 @@ -22,8 +22,8 @@ #include <sys/statfs.h> #include "linux_fsinfo.h" -/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ +/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ static inline long int statfs_link_max (int result, const struct statfs *fsbuf) { @@ -75,8 +75,8 @@ statfs_link_max (int result, const struct statfs *fsbuf) } } -/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */ +/* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */ static inline long int statfs_filesize_max (int result, const struct statfs *fsbuf) { @@ -114,3 +114,38 @@ statfs_filesize_max (int result, const struct statfs *fsbuf) return 32; } } + + +/* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */ +static inline long int +statfs_symlinks (int result, const struct statfs *fsbuf) +{ + if (result < 0) + { + if (errno == ENOSYS) + /* Not possible, return the default value. */ + return 1; + + /* Some error occured. */ + return -1; + } + + switch (fsbuf->f_type) + { + case ADFS_SUPER_MAGIC: + case BFS_MAGIC: + case CRAMFS_MAGIC: + case DEVPTS_SUPER_MAGIC: + case EFS_SUPER_MAGIC: + case EFS_MAGIC: + case MSDOS_SUPER_MAGIC: + case NTFS_SUPER_MAGIC: + case QNX4_SUPER_MAGIC: + case ROMFS_SUPER_MAGIC: + /* No symlink support. */ + return 0; + + default: + return 1; + } +} |