17f3c40a6SNhat Nguyen //===-- Linux implementation of pathconf_utils ----------------------------===// 27f3c40a6SNhat Nguyen // 37f3c40a6SNhat Nguyen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47f3c40a6SNhat Nguyen // See https://llvm.org/LICENSE.txt for license information. 57f3c40a6SNhat Nguyen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67f3c40a6SNhat Nguyen // 77f3c40a6SNhat Nguyen //===----------------------------------------------------------------------===// 87f3c40a6SNhat Nguyen 97f3c40a6SNhat Nguyen // This header must go before limits_macros.h otherwise libc header may choose 107f3c40a6SNhat Nguyen // to undefine LINK_MAX. 117f3c40a6SNhat Nguyen #include <linux/limits.h> // For LINK_MAX and other limits 127f3c40a6SNhat Nguyen 137f3c40a6SNhat Nguyen #include "hdr/limits_macros.h" 147f3c40a6SNhat Nguyen #include "hdr/unistd_macros.h" 157f3c40a6SNhat Nguyen #include "src/__support/OSUtil/syscall.h" // For internal syscall function. 167f3c40a6SNhat Nguyen #include "src/__support/common.h" 17*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 187f3c40a6SNhat Nguyen #include "src/errno/libc_errno.h" 197f3c40a6SNhat Nguyen #include "src/sys/statvfs/linux/statfs_utils.h" 207f3c40a6SNhat Nguyen 217f3c40a6SNhat Nguyen // other linux specific includes 227f3c40a6SNhat Nguyen #include <linux/bfs_fs.h> 237f3c40a6SNhat Nguyen #if __has_include(<linux/ufs_fs.h>) 247f3c40a6SNhat Nguyen #include <linux/ufs_fs.h> 257f3c40a6SNhat Nguyen #else 267f3c40a6SNhat Nguyen // from https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/ 277f3c40a6SNhat Nguyen #define UFS_MAGIC 0x00011954 287f3c40a6SNhat Nguyen #endif 297f3c40a6SNhat Nguyen #include <linux/magic.h> // For common FS magics 307f3c40a6SNhat Nguyen 31*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 327f3c40a6SNhat Nguyen 337f3c40a6SNhat Nguyen long filesizebits(const statfs_utils::LinuxStatFs &s) { 347f3c40a6SNhat Nguyen switch (s.f_type) { 357f3c40a6SNhat Nguyen case JFFS2_SUPER_MAGIC: 367f3c40a6SNhat Nguyen case MSDOS_SUPER_MAGIC: 377f3c40a6SNhat Nguyen case NCP_SUPER_MAGIC: 387f3c40a6SNhat Nguyen return 32; 397f3c40a6SNhat Nguyen } 407f3c40a6SNhat Nguyen return 64; 417f3c40a6SNhat Nguyen } 427f3c40a6SNhat Nguyen 437f3c40a6SNhat Nguyen long link_max(const statfs_utils::LinuxStatFs &s) { 447f3c40a6SNhat Nguyen switch (s.f_type) { 457f3c40a6SNhat Nguyen case EXT2_SUPER_MAGIC: 467f3c40a6SNhat Nguyen return 32000; 477f3c40a6SNhat Nguyen case MINIX_SUPER_MAGIC: 487f3c40a6SNhat Nguyen return 250; 497f3c40a6SNhat Nguyen case MINIX2_SUPER_MAGIC: 507f3c40a6SNhat Nguyen return 65530; 517f3c40a6SNhat Nguyen case REISERFS_SUPER_MAGIC: 527f3c40a6SNhat Nguyen return 0xffff - 1000; 537f3c40a6SNhat Nguyen case UFS_MAGIC: 547f3c40a6SNhat Nguyen return 32000; 557f3c40a6SNhat Nguyen } 567f3c40a6SNhat Nguyen return LINK_MAX; 577f3c40a6SNhat Nguyen } 587f3c40a6SNhat Nguyen 597f3c40a6SNhat Nguyen long symlinks(const statfs_utils::LinuxStatFs &s) { 607f3c40a6SNhat Nguyen switch (s.f_type) { 617f3c40a6SNhat Nguyen case ADFS_SUPER_MAGIC: 627f3c40a6SNhat Nguyen case BFS_MAGIC: 637f3c40a6SNhat Nguyen case CRAMFS_MAGIC: 647f3c40a6SNhat Nguyen case EFS_SUPER_MAGIC: 657f3c40a6SNhat Nguyen case MSDOS_SUPER_MAGIC: 667f3c40a6SNhat Nguyen case QNX4_SUPER_MAGIC: 677f3c40a6SNhat Nguyen return 0; 687f3c40a6SNhat Nguyen } 697f3c40a6SNhat Nguyen return 1; 707f3c40a6SNhat Nguyen } 717f3c40a6SNhat Nguyen 727f3c40a6SNhat Nguyen long pathconfig(const statfs_utils::LinuxStatFs &s, int name) { 737f3c40a6SNhat Nguyen switch (name) { 747f3c40a6SNhat Nguyen case _PC_LINK_MAX: 757f3c40a6SNhat Nguyen return link_max(s); 767f3c40a6SNhat Nguyen 777f3c40a6SNhat Nguyen case _PC_FILESIZEBITS: 787f3c40a6SNhat Nguyen return filesizebits(s); 797f3c40a6SNhat Nguyen 807f3c40a6SNhat Nguyen case _PC_2_SYMLINKS: 817f3c40a6SNhat Nguyen return symlinks(s); 827f3c40a6SNhat Nguyen 837f3c40a6SNhat Nguyen case _PC_REC_MIN_XFER_SIZE: 847f3c40a6SNhat Nguyen return s.f_bsize; 857f3c40a6SNhat Nguyen 867f3c40a6SNhat Nguyen case _PC_ALLOC_SIZE_MIN: 877f3c40a6SNhat Nguyen case _PC_REC_XFER_ALIGN: 887f3c40a6SNhat Nguyen return s.f_frsize; 897f3c40a6SNhat Nguyen 907f3c40a6SNhat Nguyen case _PC_MAX_CANON: 917f3c40a6SNhat Nguyen return _POSIX_MAX_CANON; 927f3c40a6SNhat Nguyen 937f3c40a6SNhat Nguyen case _PC_MAX_INPUT: 947f3c40a6SNhat Nguyen return _POSIX_MAX_INPUT; 957f3c40a6SNhat Nguyen 967f3c40a6SNhat Nguyen case _PC_NAME_MAX: 977f3c40a6SNhat Nguyen return s.f_namelen; 987f3c40a6SNhat Nguyen 997f3c40a6SNhat Nguyen case _PC_PATH_MAX: 1007f3c40a6SNhat Nguyen return _POSIX_PATH_MAX; 1017f3c40a6SNhat Nguyen 1027f3c40a6SNhat Nguyen case _PC_PIPE_BUF: 1037f3c40a6SNhat Nguyen return _POSIX_PIPE_BUF; 1047f3c40a6SNhat Nguyen 1057f3c40a6SNhat Nguyen case _PC_CHOWN_RESTRICTED: 1067f3c40a6SNhat Nguyen return _POSIX_CHOWN_RESTRICTED; 1077f3c40a6SNhat Nguyen 1087f3c40a6SNhat Nguyen case _PC_NO_TRUNC: 1097f3c40a6SNhat Nguyen return _POSIX_NO_TRUNC; 1107f3c40a6SNhat Nguyen 1117f3c40a6SNhat Nguyen case _PC_VDISABLE: 1127f3c40a6SNhat Nguyen return _POSIX_VDISABLE; 1137f3c40a6SNhat Nguyen 1147f3c40a6SNhat Nguyen case _PC_ASYNC_IO: 1157f3c40a6SNhat Nguyen case _PC_PRIO_IO: 1167f3c40a6SNhat Nguyen case _PC_REC_INCR_XFER_SIZE: 1177f3c40a6SNhat Nguyen case _PC_REC_MAX_XFER_SIZE: 1187f3c40a6SNhat Nguyen case _PC_SYMLINK_MAX: 1197f3c40a6SNhat Nguyen case _PC_SYNC_IO: 1207f3c40a6SNhat Nguyen return -1; 1217f3c40a6SNhat Nguyen 1227f3c40a6SNhat Nguyen default: 1237f3c40a6SNhat Nguyen libc_errno = EINVAL; 1247f3c40a6SNhat Nguyen return -1; 1257f3c40a6SNhat Nguyen } 1267f3c40a6SNhat Nguyen } 1277f3c40a6SNhat Nguyen 128*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 129