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

Unified Diff: third_party/pexpect/notes/my_forkpty.py

Issue 1398903002: Add third_party/pexpect (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@end-to-end-test
Patch Set: Created 5 years, 2 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 | « third_party/pexpect/examples/uptime.py ('k') | third_party/pexpect/notes/notes.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/pexpect/notes/my_forkpty.py
diff --git a/third_party/pexpect/notes/my_forkpty.py b/third_party/pexpect/notes/my_forkpty.py
new file mode 100644
index 0000000000000000000000000000000000000000..f2bef23bd68243c4ba3c06e3e415154e0e7e4d96
--- /dev/null
+++ b/third_party/pexpect/notes/my_forkpty.py
@@ -0,0 +1,89 @@
+import os, fcntl, termios
+import time
+
+def my_forkpty():
+
+ (master_fd, slave_fd) = os.openpty()
+
+ if (master_fd < 0 or slave_fd < 0):
+ raise ExceptionPexpect("Forkpty failed")
+
+ # slave_name = ptsname(master_fd);
+
+ pid = os.fork();
+ if pid == -1:
+ raise ExceptionPexpect("Forkpty failed")
+ elif pid == 0: # Child
+ if hasattr(termios, 'TIOCNOTTY'):
+ # Some platforms require an explicit detach of the
+ # current controlling tty before closing stdin, stdout, stderr.
+ # OpenBSD says that this is obsolete, but doesn't hurt.
+ try:
+ fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
+ except:
+ pass
+ else: #if fd >= 0:
+ fcntl.ioctl(fd, termios.TIOCNOTTY, 0)
+ os.close(fd)
+
+ # The setsid() system call will place the process into its own session
+ # which has the effect of disassociating it from the controlling terminal.
+ # This is known to be true for OpenBSD.
+ os.setsid()
+ # except: return posix_error();
+
+ # Verify that we are disconnected from the controlling tty.
+ try:
+ fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
+ os.close(fd)
+ raise ExceptionPexpect("Forkpty failed")
+ except:
+ pass
+ if 'TIOCSCTTY' in dir(termios):
+ # Make the pseudo terminal the controlling terminal for this process
+ # (the process must not currently have a controlling terminal).
+ if fcntl.ioctl(slave_fd, termios.TIOCSCTTY, '') < 0:
+ raise ExceptionPexpect("Forkpty failed")
+
+# # Verify that we can open to the slave pty file. */
+# fd = os.open(slave_name, os.O_RDWR);
+# if fd < 0:
+# raise ExceptionPexpect("Forkpty failed")
+# else:
+# os.close(fd);
+
+ # Verify that we now have a controlling tty.
+ fd = os.open("/dev/tty", os.O_WRONLY)
+ if fd < 0:
+ raise ExceptionPexpect("This process could not get a controlling tty.")
+ else:
+ os.close(fd)
+
+ os.close(master_fd)
+ os.dup2(slave_fd, 0)
+ os.dup2(slave_fd, 1)
+ os.dup2(slave_fd, 2)
+ if slave_fd > 2:
+ os.close(slave_fd)
+ pid = 0
+
+ else:
+ # PARENT
+ os.close(slave_fd);
+
+ if pid == -1:
+ raise ExceptionPexpect("This process could not get a controlling tty.")
+# if (pid == 0)
+# PyOS_AfterFork();
+
+ return (pid, master_fd)
+
+pid, fd = my_forkpty ()
+if pid == 0: # child
+ print 'I am not a robot!'
+else:
+ print '(pid, fd) = (%d, %d)' % (pid, fd)
+ time.sleep(1) # Give the child a chance to print.
+ print 'Robots always say:', os.read(fd,100)
+ os.close(fd)
+
« no previous file with comments | « third_party/pexpect/examples/uptime.py ('k') | third_party/pexpect/notes/notes.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698