Implement <spawn.h>.

As described here:

  http://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawn.html

And here:

  http://man7.org/linux/man-pages/man3/posix_spawn.3.html

Bug: N/A (but mentioned in my inbox since 2013)
Test: ran tests
Change-Id: I0b27b2919b660779e3bd8a25fb429527c16dc621
diff --git a/libc/private/ScopedSignalBlocker.h b/libc/private/ScopedSignalBlocker.h
new file mode 100644
index 0000000..35d1c58
--- /dev/null
+++ b/libc/private/ScopedSignalBlocker.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SCOPED_SIGNAL_BLOCKER_H
+#define SCOPED_SIGNAL_BLOCKER_H
+
+#include <signal.h>
+
+#include "bionic_macros.h"
+
+class ScopedSignalBlocker {
+ public:
+  explicit ScopedSignalBlocker() {
+    sigset_t set;
+    sigfillset(&set);
+    sigprocmask(SIG_BLOCK, &set, &old_set_);
+  }
+
+  ~ScopedSignalBlocker() {
+    reset();
+  }
+
+  void reset() {
+    sigprocmask(SIG_SETMASK, &old_set_, nullptr);
+  }
+
+ private:
+  sigset_t old_set_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedSignalBlocker);
+};
+
+#endif