]>
git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/unix/sysv/linux/pathconf.c
1 /* Get file-specific information about a file. Linux version.
2 Copyright (C) 1991,1995,1996,1998-2003,2008,2010,2011 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 #include "linux_fsinfo.h"
25 #include <not-cancel.h>
27 static long int posix_pathconf (const char *file
, int name
);
29 /* Define this first, so it can be inlined. */
30 #define __pathconf static posix_pathconf
31 #include <sysdeps/posix/pathconf.c>
34 /* Get file-specific information about FILE. */
36 __pathconf (const char *file
, int name
)
45 return __statfs_link_max (__statfs (file
, &fsbuf
), &fsbuf
);
47 case _PC_FILESIZEBITS
:
48 return __statfs_filesize_max (__statfs (file
, &fsbuf
), &fsbuf
);
51 return __statfs_symlinks (__statfs (file
, &fsbuf
), &fsbuf
);
53 case _PC_CHOWN_RESTRICTED
:
54 return __statfs_chown_restricted (__statfs (file
, &fsbuf
), &fsbuf
);
57 flags
= O_RDONLY
|O_NONBLOCK
|O_NOCTTY
;
61 fd
= open_not_cancel_2 (file
, flags
);
64 long int r
= __fcntl (fd
, F_GETPIPE_SZ
);
65 close_not_cancel_no_status (fd
);
72 return posix_pathconf (file
, name
);
77 /* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
79 __statfs_link_max (int result
, const struct statfs
*fsbuf
)
84 /* Not possible, return the default value. */
85 return LINUX_LINK_MAX
;
87 /* Some error occured. */
91 switch (fsbuf
->f_type
)
93 case EXT2_SUPER_MAGIC
:
96 case MINIX_SUPER_MAGIC
:
97 case MINIX_SUPER_MAGIC2
:
98 return MINIX_LINK_MAX
;
100 case MINIX2_SUPER_MAGIC
:
101 case MINIX2_SUPER_MAGIC2
:
102 return MINIX2_LINK_MAX
;
104 case XENIX_SUPER_MAGIC
:
105 return XENIX_LINK_MAX
;
107 case SYSV4_SUPER_MAGIC
:
108 case SYSV2_SUPER_MAGIC
:
109 return SYSV_LINK_MAX
;
111 case COH_SUPER_MAGIC
:
118 case REISERFS_SUPER_MAGIC
:
119 return REISERFS_LINK_MAX
;
121 case XFS_SUPER_MAGIC
:
125 return LINUX_LINK_MAX
;
130 /* Used like: return statfs_filesize_max (__statfs (name, &buf), &buf); */
132 __statfs_filesize_max (int result
, const struct statfs
*fsbuf
)
137 /* Not possible, return the default value. */
140 /* Some error occured. */
144 switch (fsbuf
->f_type
)
146 case BTRFS_SUPER_MAGIC
:
149 case EXT2_SUPER_MAGIC
:
152 case REISERFS_SUPER_MAGIC
:
153 case XFS_SUPER_MAGIC
:
154 case SMB_SUPER_MAGIC
:
155 case NTFS_SUPER_MAGIC
:
156 case UDF_SUPER_MAGIC
:
157 case JFS_SUPER_MAGIC
:
158 case VXFS_SUPER_MAGIC
:
159 case CGROUP_SUPER_MAGIC
:
162 case MSDOS_SUPER_MAGIC
:
163 case JFFS_SUPER_MAGIC
:
164 case JFFS2_SUPER_MAGIC
:
165 case NCP_SUPER_MAGIC
:
166 case ROMFS_SUPER_MAGIC
:
175 /* Used like: return statfs_link_max (__statfs (name, &buf), &buf); */
177 __statfs_symlinks (int result
, const struct statfs
*fsbuf
)
182 /* Not possible, return the default value. */
185 /* Some error occured. */
189 switch (fsbuf
->f_type
)
191 case ADFS_SUPER_MAGIC
:
194 case DEVPTS_SUPER_MAGIC
:
195 case EFS_SUPER_MAGIC
:
197 case MSDOS_SUPER_MAGIC
:
198 case NTFS_SUPER_MAGIC
:
199 case QNX4_SUPER_MAGIC
:
200 case ROMFS_SUPER_MAGIC
:
201 /* No symlink support. */
210 /* Used like: return __statfs_chown_restricted (__statfs (name, &buf), &buf);*/
212 __statfs_chown_restricted (int result
, const struct statfs
*fsbuf
)
217 /* Not possible, return the default value. */
220 /* Some error occured. */
226 switch (fsbuf
->f_type
)
228 case XFS_SUPER_MAGIC
:
229 /* Read the value from /proc/sys/fs/xfs/restrict_chown. If we cannot
230 read it default to assume the restriction is in place. */
231 fd
= open_not_cancel_2 ("/proc/sys/fs/xfs/restrict_chown", O_RDONLY
);
235 if (TEMP_FAILURE_RETRY (read_not_cancel (fd
, buf
, 2)) == 2
236 && buf
[0] >= '0' && buf
[0] <= '1')
237 retval
= buf
[0] - '0';
239 close_not_cancel_no_status (fd
);