Bug 753046 - Add IPC support for BSDs, dir_reader_bsd.h file. rs=cjones
authorJan Beich <jbeich@tormail.org>
Tue, 28 Aug 2012 23:15:18 +0200
changeset 103710 c4c6016ac3787a09adf18fc04737f04ff351891b
parent 103709 b0d9390b60c62917a4ddd1e77a95f7a8f55e7702
child 103711 f98f7ce0f3bf1af934a231decea1a804975d40fc
push id14127
push userlandry@openbsd.org
push dateTue, 28 Aug 2012 21:18:49 +0000
treeherdermozilla-inbound@e86006735510 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerscjones
bugs753046
milestone18.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 753046 - Add IPC support for BSDs, dir_reader_bsd.h file. rs=cjones
ipc/chromium/src/base/dir_reader_bsd.h
new file mode 100644
--- /dev/null
+++ b/ipc/chromium/src/base/dir_reader_bsd.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// derived from dir_reader_linux.h
+
+#ifndef BASE_DIR_READER_BSD_H_
+#define BASE_DIR_READER_BSD_H_
+#pragma once
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include "base/logging.h"
+#include "base/eintr_wrapper.h"
+
+// See the comments in dir_reader_posix.h about this.
+
+namespace base {
+
+class DirReaderBSD {
+ public:
+  explicit DirReaderBSD(const char* directory_path)
+#ifdef O_DIRECTORY
+      : fd_(open(directory_path, O_RDONLY | O_DIRECTORY)),
+#else
+      : fd_(open(directory_path, O_RDONLY)),
+#endif
+        offset_(0),
+        size_(0) {
+    memset(buf_, 0, sizeof(buf_));
+  }
+
+  ~DirReaderBSD() {
+    if (fd_ >= 0) {
+      if (HANDLE_EINTR(close(fd_)))
+        DLOG(ERROR) << "Failed to close directory handle";
+    }
+  }
+
+  bool IsValid() const {
+    return fd_ >= 0;
+  }
+
+  // Move to the next entry returning false if the iteration is complete.
+  bool Next() {
+    if (size_) {
+      struct dirent* dirent = reinterpret_cast<struct dirent*>(&buf_[offset_]);
+      offset_ += dirent->d_reclen;
+    }
+
+    if (offset_ != size_)
+      return true;
+
+#ifdef OS_OPENBSD
+    const int r = getdirentries(fd_, buf_, sizeof(buf_), basep_);
+#else
+    const int r = getdents(fd_, buf_, sizeof(buf_));
+#endif
+    if (r == 0)
+      return false;
+    if (r == -1) {
+#ifdef OS_OPENBSD
+      DLOG(ERROR) << "getdirentries returned an error: " << errno;
+#else
+      DLOG(ERROR) << "getdents returned an error: " << errno;
+#endif
+      return false;
+    }
+    size_ = r;
+    offset_ = 0;
+    return true;
+  }
+
+  const char* name() const {
+    if (!size_)
+      return NULL;
+
+    const struct dirent* dirent =
+        reinterpret_cast<const struct dirent*>(&buf_[offset_]);
+    return dirent->d_name;
+  }
+
+  int fd() const {
+    return fd_;
+  }
+
+  static bool IsFallback() {
+    return false;
+  }
+
+ private:
+  const int fd_;
+  char buf_[512];
+#ifdef OS_OPENBSD
+  off_t *basep_;
+#endif
+  size_t offset_, size_;
+
+  DISALLOW_COPY_AND_ASSIGN(DirReaderBSD);
+};
+
+}  // namespace base
+
+#endif // BASE_DIR_READER_BSD_H_