xref: /aosp_15_r20/external/llvm-libc/src/unistd/linux/pathconf_utils.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Linux implementation of pathconf_utils ----------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker // This header must go before limits_macros.h otherwise libc header may choose
10*71db0c75SAndroid Build Coastguard Worker // to undefine LINK_MAX.
11*71db0c75SAndroid Build Coastguard Worker #include <linux/limits.h> // For LINK_MAX and other limits
12*71db0c75SAndroid Build Coastguard Worker 
13*71db0c75SAndroid Build Coastguard Worker #include "hdr/limits_macros.h"
14*71db0c75SAndroid Build Coastguard Worker #include "hdr/unistd_macros.h"
15*71db0c75SAndroid Build Coastguard Worker #include "src/__support/OSUtil/syscall.h" // For internal syscall function.
16*71db0c75SAndroid Build Coastguard Worker #include "src/__support/common.h"
17*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
18*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
19*71db0c75SAndroid Build Coastguard Worker #include "src/sys/statvfs/linux/statfs_utils.h"
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker // other linux specific includes
22*71db0c75SAndroid Build Coastguard Worker #include <linux/bfs_fs.h>
23*71db0c75SAndroid Build Coastguard Worker #if __has_include(<linux/ufs_fs.h>)
24*71db0c75SAndroid Build Coastguard Worker #include <linux/ufs_fs.h>
25*71db0c75SAndroid Build Coastguard Worker #else
26*71db0c75SAndroid Build Coastguard Worker // from https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/
27*71db0c75SAndroid Build Coastguard Worker #define UFS_MAGIC 0x00011954
28*71db0c75SAndroid Build Coastguard Worker #endif
29*71db0c75SAndroid Build Coastguard Worker #include <linux/magic.h> // For common FS magics
30*71db0c75SAndroid Build Coastguard Worker 
31*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
32*71db0c75SAndroid Build Coastguard Worker 
filesizebits(const statfs_utils::LinuxStatFs & s)33*71db0c75SAndroid Build Coastguard Worker long filesizebits(const statfs_utils::LinuxStatFs &s) {
34*71db0c75SAndroid Build Coastguard Worker   switch (s.f_type) {
35*71db0c75SAndroid Build Coastguard Worker   case JFFS2_SUPER_MAGIC:
36*71db0c75SAndroid Build Coastguard Worker   case MSDOS_SUPER_MAGIC:
37*71db0c75SAndroid Build Coastguard Worker   case NCP_SUPER_MAGIC:
38*71db0c75SAndroid Build Coastguard Worker     return 32;
39*71db0c75SAndroid Build Coastguard Worker   }
40*71db0c75SAndroid Build Coastguard Worker   return 64;
41*71db0c75SAndroid Build Coastguard Worker }
42*71db0c75SAndroid Build Coastguard Worker 
link_max(const statfs_utils::LinuxStatFs & s)43*71db0c75SAndroid Build Coastguard Worker long link_max(const statfs_utils::LinuxStatFs &s) {
44*71db0c75SAndroid Build Coastguard Worker   switch (s.f_type) {
45*71db0c75SAndroid Build Coastguard Worker   case EXT2_SUPER_MAGIC:
46*71db0c75SAndroid Build Coastguard Worker     return 32000;
47*71db0c75SAndroid Build Coastguard Worker   case MINIX_SUPER_MAGIC:
48*71db0c75SAndroid Build Coastguard Worker     return 250;
49*71db0c75SAndroid Build Coastguard Worker   case MINIX2_SUPER_MAGIC:
50*71db0c75SAndroid Build Coastguard Worker     return 65530;
51*71db0c75SAndroid Build Coastguard Worker   case REISERFS_SUPER_MAGIC:
52*71db0c75SAndroid Build Coastguard Worker     return 0xffff - 1000;
53*71db0c75SAndroid Build Coastguard Worker   case UFS_MAGIC:
54*71db0c75SAndroid Build Coastguard Worker     return 32000;
55*71db0c75SAndroid Build Coastguard Worker   }
56*71db0c75SAndroid Build Coastguard Worker   return LINK_MAX;
57*71db0c75SAndroid Build Coastguard Worker }
58*71db0c75SAndroid Build Coastguard Worker 
symlinks(const statfs_utils::LinuxStatFs & s)59*71db0c75SAndroid Build Coastguard Worker long symlinks(const statfs_utils::LinuxStatFs &s) {
60*71db0c75SAndroid Build Coastguard Worker   switch (s.f_type) {
61*71db0c75SAndroid Build Coastguard Worker   case ADFS_SUPER_MAGIC:
62*71db0c75SAndroid Build Coastguard Worker   case BFS_MAGIC:
63*71db0c75SAndroid Build Coastguard Worker   case CRAMFS_MAGIC:
64*71db0c75SAndroid Build Coastguard Worker   case EFS_SUPER_MAGIC:
65*71db0c75SAndroid Build Coastguard Worker   case MSDOS_SUPER_MAGIC:
66*71db0c75SAndroid Build Coastguard Worker   case QNX4_SUPER_MAGIC:
67*71db0c75SAndroid Build Coastguard Worker     return 0;
68*71db0c75SAndroid Build Coastguard Worker   }
69*71db0c75SAndroid Build Coastguard Worker   return 1;
70*71db0c75SAndroid Build Coastguard Worker }
71*71db0c75SAndroid Build Coastguard Worker 
pathconfig(const statfs_utils::LinuxStatFs & s,int name)72*71db0c75SAndroid Build Coastguard Worker long pathconfig(const statfs_utils::LinuxStatFs &s, int name) {
73*71db0c75SAndroid Build Coastguard Worker   switch (name) {
74*71db0c75SAndroid Build Coastguard Worker   case _PC_LINK_MAX:
75*71db0c75SAndroid Build Coastguard Worker     return link_max(s);
76*71db0c75SAndroid Build Coastguard Worker 
77*71db0c75SAndroid Build Coastguard Worker   case _PC_FILESIZEBITS:
78*71db0c75SAndroid Build Coastguard Worker     return filesizebits(s);
79*71db0c75SAndroid Build Coastguard Worker 
80*71db0c75SAndroid Build Coastguard Worker   case _PC_2_SYMLINKS:
81*71db0c75SAndroid Build Coastguard Worker     return symlinks(s);
82*71db0c75SAndroid Build Coastguard Worker 
83*71db0c75SAndroid Build Coastguard Worker   case _PC_REC_MIN_XFER_SIZE:
84*71db0c75SAndroid Build Coastguard Worker     return s.f_bsize;
85*71db0c75SAndroid Build Coastguard Worker 
86*71db0c75SAndroid Build Coastguard Worker   case _PC_ALLOC_SIZE_MIN:
87*71db0c75SAndroid Build Coastguard Worker   case _PC_REC_XFER_ALIGN:
88*71db0c75SAndroid Build Coastguard Worker     return s.f_frsize;
89*71db0c75SAndroid Build Coastguard Worker 
90*71db0c75SAndroid Build Coastguard Worker   case _PC_MAX_CANON:
91*71db0c75SAndroid Build Coastguard Worker     return _POSIX_MAX_CANON;
92*71db0c75SAndroid Build Coastguard Worker 
93*71db0c75SAndroid Build Coastguard Worker   case _PC_MAX_INPUT:
94*71db0c75SAndroid Build Coastguard Worker     return _POSIX_MAX_INPUT;
95*71db0c75SAndroid Build Coastguard Worker 
96*71db0c75SAndroid Build Coastguard Worker   case _PC_NAME_MAX:
97*71db0c75SAndroid Build Coastguard Worker     return s.f_namelen;
98*71db0c75SAndroid Build Coastguard Worker 
99*71db0c75SAndroid Build Coastguard Worker   case _PC_PATH_MAX:
100*71db0c75SAndroid Build Coastguard Worker     return _POSIX_PATH_MAX;
101*71db0c75SAndroid Build Coastguard Worker 
102*71db0c75SAndroid Build Coastguard Worker   case _PC_PIPE_BUF:
103*71db0c75SAndroid Build Coastguard Worker     return _POSIX_PIPE_BUF;
104*71db0c75SAndroid Build Coastguard Worker 
105*71db0c75SAndroid Build Coastguard Worker   case _PC_CHOWN_RESTRICTED:
106*71db0c75SAndroid Build Coastguard Worker     return _POSIX_CHOWN_RESTRICTED;
107*71db0c75SAndroid Build Coastguard Worker 
108*71db0c75SAndroid Build Coastguard Worker   case _PC_NO_TRUNC:
109*71db0c75SAndroid Build Coastguard Worker     return _POSIX_NO_TRUNC;
110*71db0c75SAndroid Build Coastguard Worker 
111*71db0c75SAndroid Build Coastguard Worker   case _PC_VDISABLE:
112*71db0c75SAndroid Build Coastguard Worker     return _POSIX_VDISABLE;
113*71db0c75SAndroid Build Coastguard Worker 
114*71db0c75SAndroid Build Coastguard Worker   case _PC_ASYNC_IO:
115*71db0c75SAndroid Build Coastguard Worker   case _PC_PRIO_IO:
116*71db0c75SAndroid Build Coastguard Worker   case _PC_REC_INCR_XFER_SIZE:
117*71db0c75SAndroid Build Coastguard Worker   case _PC_REC_MAX_XFER_SIZE:
118*71db0c75SAndroid Build Coastguard Worker   case _PC_SYMLINK_MAX:
119*71db0c75SAndroid Build Coastguard Worker   case _PC_SYNC_IO:
120*71db0c75SAndroid Build Coastguard Worker     return -1;
121*71db0c75SAndroid Build Coastguard Worker 
122*71db0c75SAndroid Build Coastguard Worker   default:
123*71db0c75SAndroid Build Coastguard Worker     libc_errno = EINVAL;
124*71db0c75SAndroid Build Coastguard Worker     return -1;
125*71db0c75SAndroid Build Coastguard Worker   }
126*71db0c75SAndroid Build Coastguard Worker }
127*71db0c75SAndroid Build Coastguard Worker 
128*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
129