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 Workerlong 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 Workerlong 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 Workerlong 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 Workerlong 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