| 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
|
|
|