diff --git a/libc/bionic/pathconf.cpp b/libc/bionic/pathconf.cpp index de9e022e2..e6f574214 100644 --- a/libc/bionic/pathconf.cpp +++ b/libc/bionic/pathconf.cpp @@ -100,12 +100,16 @@ static long __pathconf(const struct statfs& s, int name) { case _PC_2_SYMLINKS: return __2_symlinks(s); + case _PC_ALLOC_SIZE_MIN: /* fall through */ + case _PC_REC_XFER_ALIGN: + return s.f_frsize; + + case _PC_REC_MIN_XFER_SIZE: + return s.f_bsize; + #if 0 - case _PC_ALLOC_SIZE_MIN: case _PC_REC_INCR_XFER_SIZE: case _PC_REC_MAX_XFER_SIZE: - case _PC_REC_MIN_XFER_SIZE: - case _PC_REC_XFER_ALIGN: #endif case _PC_SYMLINK_MAX: diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index 19d401773..4ead05779 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -502,3 +503,23 @@ TEST(unistd, gethostname) { ASSERT_EQ(-1, gethostname(hostname, strlen(hostname))); ASSERT_EQ(ENAMETOOLONG, errno); } + +TEST(unistd, pathconf_fpathconf) { + TemporaryFile tf; + long rc = 0L; + // As a file system's block size is always power of 2, the configure values + // for ALLOC and XFER should be power of 2 as well. + rc = pathconf(tf.filename, _PC_ALLOC_SIZE_MIN); + ASSERT_TRUE(rc > 0 && powerof2(rc)); + rc = pathconf(tf.filename, _PC_REC_MIN_XFER_SIZE); + ASSERT_TRUE(rc > 0 && powerof2(rc)); + rc = pathconf(tf.filename, _PC_REC_XFER_ALIGN); + ASSERT_TRUE(rc > 0 && powerof2(rc)); + + rc = fpathconf(tf.fd, _PC_ALLOC_SIZE_MIN); + ASSERT_TRUE(rc > 0 && powerof2(rc)); + rc = fpathconf(tf.fd, _PC_REC_MIN_XFER_SIZE); + ASSERT_TRUE(rc > 0 && powerof2(rc)); + rc = fpathconf(tf.fd, _PC_REC_XFER_ALIGN); + ASSERT_TRUE(rc > 0 && powerof2(rc)); +}