Add netbsd as a platform

Change-Id: I752029d3ce3bc12b5bce95ddd202fb40517b86c7
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/9700
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/build/gen.py b/build/gen.py
index 0659545..486354b 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -47,6 +47,8 @@
       self._platform = 'fuchsia'
     elif self._platform.startswith('freebsd'):
       self._platform = 'freebsd'
+    elif self._platform.startswith('netbsd'):
+      self._platform = 'netbsd'
     elif self._platform.startswith('openbsd'):
       self._platform = 'openbsd'
     elif self._platform.startswith('haiku'):
@@ -56,7 +58,7 @@
 
   @staticmethod
   def known_platforms():
-    return ['linux', 'darwin', 'mingw', 'msys', 'msvc', 'aix', 'fuchsia', 'freebsd', 'openbsd', 'haiku', 'solaris']
+    return ['linux', 'darwin', 'mingw', 'msys', 'msvc', 'aix', 'fuchsia', 'freebsd', 'netbsd', 'openbsd', 'haiku', 'solaris']
 
   def platform(self):
     return self._platform
@@ -89,7 +91,7 @@
     return self._platform == 'solaris'
 
   def is_posix(self):
-    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris', 'msys']
+    return self._platform in ['linux', 'freebsd', 'darwin', 'aix', 'openbsd', 'haiku', 'solaris', 'msys', 'netbsd']
 
 
 def main(argv):
@@ -215,6 +217,7 @@
       'openbsd': 'build_openbsd.ninja.template',
       'haiku': 'build_haiku.ninja.template',
       'solaris': 'build_linux.ninja.template',
+      'netbsd': 'build_linux.ninja.template',
   }[platform.platform()])
 
   with open(template_filename) as f:
diff --git a/src/base/files/file_util.h b/src/base/files/file_util.h
index e2f1197..b44129d 100644
--- a/src/base/files/file_util.h
+++ b/src/base/files/file_util.h
@@ -325,7 +325,7 @@
 // the directory |path|, in the number of FilePath::CharType, or -1 on failure.
 int GetMaximumPathComponentLength(const base::FilePath& path);
 
-#if defined(OS_LINUX) || defined(OS_AIX)
+#if defined(OS_LINUX) || defined(OS_AIX) || defined(OS_BSD)
 // Broad categories of file systems as returned by statfs() on Linux.
 enum FileSystemType {
   FILE_SYSTEM_UNKNOWN,   // statfs failed.
diff --git a/src/base/files/file_util_posix.cc b/src/base/files/file_util_posix.cc
index 79c9428..1eef8e8 100644
--- a/src/base/files/file_util_posix.cc
+++ b/src/base/files/file_util_posix.cc
@@ -210,7 +210,7 @@
 }
 
 bool CreateLocalNonBlockingPipe(int fds[2]) {
-#if defined(OS_LINUX)
+#if defined(OS_LINUX) || defined(OS_BSD)
   return pipe2(fds, O_CLOEXEC | O_NONBLOCK) == 0;
 #else
   int raw_fds[2];
diff --git a/src/base/files/scoped_file.cc b/src/base/files/scoped_file.cc
index 11afedd..1b8733e 100644
--- a/src/base/files/scoped_file.cc
+++ b/src/base/files/scoped_file.cc
@@ -31,7 +31,7 @@
   int ret = IGNORE_EINTR(close(fd));
 
 #if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_FUCHSIA) || \
-    defined(OS_ANDROID)
+    defined(OS_ANDROID) || defined(OS_BSD)
   // NB: Some file descriptors can return errors from close() e.g. network
   // filesystems such as NFS and Linux input devices. On Linux, macOS, and
   // Fuchsia's POSIX layer, errors from close other than EBADF do not indicate
diff --git a/src/gn/args.cc b/src/gn/args.cc
index 392c0c9..e59b034 100644
--- a/src/gn/args.cc
+++ b/src/gn/args.cc
@@ -318,6 +318,8 @@
   os = "haiku";
 #elif defined(OS_SOLARIS)
   os = "solaris";
+#elif defined(OS_NETBSD)
+  os = "netbsd";
 #else
 #error Unknown OS type.
 #endif
diff --git a/src/util/exe_path.cc b/src/util/exe_path.cc
index 0a91bcc..b67318c 100644
--- a/src/util/exe_path.cc
+++ b/src/util/exe_path.cc
@@ -15,7 +15,7 @@
 #include <windows.h>
 
 #include "base/win/win_util.h"
-#elif defined(OS_FREEBSD)
+#elif defined(OS_FREEBSD) || defined(OS_NETBSD)
 #include <limits.h>
 #include <sys/sysctl.h>
 #include <sys/types.h>
@@ -69,6 +69,18 @@
   return base::FilePath(buf);
 }
 
+#elif defined(OS_NETBSD)
+
+base::FilePath GetExePath() {
+  int mib[] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_PATHNAME};
+  char buf[PATH_MAX];
+  size_t buf_size = PATH_MAX;
+  if (sysctl(mib, 4, buf, &buf_size, nullptr, 0) == -1) {
+    return base::FilePath();
+  }
+  return base::FilePath(buf);
+}
+
 #elif defined(OS_HAIKU)
 
 base::FilePath GetExePath() {