xref: /llvm-project/libc/src/unistd/linux/pathconf_utils.cpp (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
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