1 os_orig = __import__("os")
3 socket = __import__("socket")
5 from eventlet import greenio
6 from eventlet.support import get_errno
7 from eventlet import greenthread
8 from eventlet import hubs
9 from eventlet.patcher import slurp_properties
11 __all__ = os_orig.__all__
12 __patched__ = ['fdopen', 'read', 'write', 'wait', 'waitpid', 'open']
21 def fdopen(fd, *args, **kw):
22 """fdopen(fd [, mode='r' [, bufsize]]) -> file_object
24 Return an open file object connected to a file descriptor."""
25 if not isinstance(fd, int):
26 raise TypeError('fd should be int, not %r' % fd)
28 return greenio.GreenPipe(fd, *args, **kw)
30 raise OSError(*e.args)
32 __original_read__ = os_orig.read
36 """read(fd, buffersize) -> string
38 Read a file descriptor."""
41 return __original_read__(fd, n)
42 except (OSError, IOError) as e:
43 if get_errno(e) != errno.EAGAIN:
45 except socket.error as e:
46 if get_errno(e) == errno.EPIPE:
50 hubs.trampoline(fd, read=True)
54 __original_write__ = os_orig.write
58 """write(fd, string) -> byteswritten
60 Write a string to a file descriptor.
64 return __original_write__(fd, st)
65 except (OSError, IOError) as e:
66 if get_errno(e) != errno.EAGAIN:
68 except socket.error as e:
69 if get_errno(e) != errno.EPIPE:
71 hubs.trampoline(fd, write=True)
75 """wait() -> (pid, status)
77 Wait for completion of a child process."""
80 __original_waitpid__ = os_orig.waitpid
83 def waitpid(pid, options):
85 waitpid(pid, options) -> (pid, status)
87 Wait for completion of a given child process."""
88 if options & os_orig.WNOHANG != 0:
89 return __original_waitpid__(pid, options)
91 new_options = options | os_orig.WNOHANG
93 rpid, status = __original_waitpid__(pid, new_options)
94 if rpid and status >= 0:
96 greenthread.sleep(0.01)
98 __original_open__ = os_orig.open
101 def open(file, flags, mode=0o777, dir_fd=None):
103 This behaves identically, but collaborates with
104 the hub's notify_opened protocol.
106 if dir_fd is not None:
107 fd = __original_open__(file, flags, mode, dir_fd=dir_fd)
109 fd = __original_open__(file, flags, mode)
110 hubs.notify_opened(fd)