Increase support of pathconf options.

Bug: 18206366
Change-Id: Ie770e49f5af3631eb9fbd2cd5174edf004c81e00
diff --git a/libc/bionic/pathconf.cpp b/libc/bionic/pathconf.cpp
index de9e022..e6f5742 100644
--- a/libc/bionic/pathconf.cpp
+++ b/libc/bionic/pathconf.cpp
@@ -100,12 +100,16 @@
     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 19d4017..4ead057 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -23,6 +23,7 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <stdint.h>
+#include <sys/param.h>
 #include <sys/syscall.h>
 #include <sys/types.h>
 #include <sys/utsname.h>
@@ -502,3 +503,23 @@
   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));
+}