implement missing seekdir and telldir

Bug: 18266863
Change-Id: I189ee949d4f7ccee099f3341e349cd969d25480f
diff --git a/tests/dirent_test.cpp b/tests/dirent_test.cpp
index 6aadb37..214dd78 100644
--- a/tests/dirent_test.cpp
+++ b/tests/dirent_test.cpp
@@ -231,3 +231,50 @@
     ASSERT_EQ(pass1[i], pass2[i]);
   }
 }
+
+TEST(dirent, seekdir_telldir) {
+  DIR* d = opendir("/proc/self");
+  ASSERT_TRUE(d != NULL);
+  std::vector<long> offset_list;
+  std::vector<std::string> name_list;
+  dirent* e = NULL;
+
+  offset_list.push_back(telldir(d));
+  ASSERT_EQ(0L, offset_list.back());
+
+  while ((e = readdir(d)) != NULL) {
+    name_list.push_back(e->d_name);
+    offset_list.push_back(telldir(d));
+    // Make sure telldir() point to the next entry.
+    ASSERT_EQ(e->d_off, offset_list.back());
+  }
+
+  long end_offset = telldir(d);
+  // telldir() should not pass the end of the file.
+  ASSERT_EQ(offset_list.back(), end_offset);
+  offset_list.pop_back();
+
+  for (size_t i = 0; i < offset_list.size(); ++i) {
+    seekdir(d, offset_list[i]);
+    ASSERT_EQ(offset_list[i], telldir(d));
+    e = readdir(d);
+    ASSERT_TRUE(e != NULL);
+    ASSERT_STREQ(name_list[i].c_str(), e->d_name);
+  }
+  for (int i = static_cast<int>(offset_list.size()) - 1; i >= 0; --i) {
+    seekdir(d, offset_list[i]);
+    ASSERT_EQ(offset_list[i], telldir(d));
+    e = readdir(d);
+    ASSERT_TRUE(e != NULL);
+    ASSERT_STREQ(name_list[i].c_str(), e->d_name);
+  }
+
+  // Seek to the end, read NULL.
+  seekdir(d, end_offset);
+  ASSERT_EQ(end_offset, telldir(d));
+  errno = 0;
+  ASSERT_EQ(NULL, readdir(d));
+  ASSERT_EQ(0, errno);
+
+  ASSERT_EQ(0, closedir(d));
+}
diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp
index 549792e..6be372c 100644
--- a/tests/stdio_test.cpp
+++ b/tests/stdio_test.cpp
@@ -77,7 +77,7 @@
   int rc = dprintf(tf.fd, "hello\n");
   ASSERT_EQ(rc, 6);
 
-  lseek(tf.fd, SEEK_SET, 0);
+  lseek(tf.fd, 0, SEEK_SET);
   FILE* tfile = fdopen(tf.fd, "r");
   ASSERT_TRUE(tfile != NULL);