Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(633)

Unified Diff: services/native_support/make_pty_pair.cc

Issue 1321253010: Add a "native_support" service. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: fix android? Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/native_support/make_pty_pair.h ('k') | services/native_support/process_controller_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/native_support/make_pty_pair.cc
diff --git a/services/native_support/make_pty_pair.cc b/services/native_support/make_pty_pair.cc
new file mode 100644
index 0000000000000000000000000000000000000000..2af21f5216e7f79526a47e2f2b5d61fca1a5e36b
--- /dev/null
+++ b/services/native_support/make_pty_pair.cc
@@ -0,0 +1,65 @@
+// Copyright 2015 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.
+
+#include "services/native_support/make_pty_pair.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "base/logging.h"
+#include "base/posix/eintr_wrapper.h"
+
+namespace native_support {
+
+bool MakePtyPair(base::ScopedFD* master_fd,
+ base::ScopedFD* slave_fd,
+ int* errno_value) {
+ DCHECK(master_fd);
+ DCHECK(!master_fd->is_valid()); // Not very wrong, but unlikely.
+ DCHECK(slave_fd);
+ DCHECK(!slave_fd->is_valid()); // Not very wrong, but unlikely.
+ DCHECK(errno_value);
+
+ // TODO(vtl): |getpt()| is a glibc extension.
+ base::ScopedFD master(getpt());
+ if (!master.is_valid()) {
+ *errno_value = errno;
+ PLOG(ERROR) << "getpt()";
+ return false;
+ }
+
+ if (grantpt(master.get()) < 0) {
+ *errno_value = errno;
+ PLOG(ERROR) << "grantpt()";
+ return false;
+ }
+
+ if (unlockpt(master.get()) < 0) {
+ *errno_value = errno;
+ PLOG(ERROR) << "unlockpt()";
+ return false;
+ }
+
+ const char* name = ptsname(master.get());
+ if (!name) {
+ *errno_value = errno;
+ PLOG(ERROR) << "ptsname()";
+ return false;
+ }
+
+ base::ScopedFD slave(HANDLE_EINTR(open(name, O_RDWR)));
+ if (!slave.is_valid()) {
+ *errno_value = errno;
+ PLOG(ERROR) << "open()";
+ return false;
+ }
+
+ *master_fd = master.Pass();
+ *slave_fd = slave.Pass();
+ return true;
+}
+
+} // namespace native_support
« no previous file with comments | « services/native_support/make_pty_pair.h ('k') | services/native_support/process_controller_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698