From b5e581abfe28de8ed6c8c8af1c265bb4e36f97bb Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Sat, 8 Nov 2014 14:58:12 -0800 Subject: [PATCH] Increase support of pathconf options. Bug: 18206366 Change-Id: Ie770e49f5af3631eb9fbd2cd5174edf004c81e00 --- libc/bionic/pathconf.cpp | 10 +++++++--- tests/unistd_test.cpp | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) 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)); +}