Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sqlmapproject
GitHub Repository: sqlmapproject/sqlmap
Path: blob/master/lib/core/subprocessng.py
2989 views
1
#!/usr/bin/env python
2
3
"""
4
Copyright (c) 2006-2025 sqlmap developers (https://sqlmap.org)
5
See the file 'LICENSE' for copying permission
6
"""
7
8
from __future__ import division
9
10
import errno
11
import os
12
import subprocess
13
import time
14
15
from lib.core.compat import buffer
16
from lib.core.convert import getBytes
17
from lib.core.settings import IS_WIN
18
19
if IS_WIN:
20
try:
21
from win32file import ReadFile, WriteFile
22
from win32pipe import PeekNamedPipe
23
except ImportError:
24
pass
25
import msvcrt
26
else:
27
import select
28
import fcntl
29
30
def blockingReadFromFD(fd):
31
# Quick twist around original Twisted function
32
# Blocking read from a non-blocking file descriptor
33
output = b""
34
35
while True:
36
try:
37
output += os.read(fd, 8192)
38
except (OSError, IOError) as ioe:
39
if ioe.args[0] in (errno.EAGAIN, errno.EINTR):
40
# Uncomment the following line if the process seems to
41
# take a huge amount of cpu time
42
# time.sleep(0.01)
43
continue
44
else:
45
raise
46
break
47
48
if not output:
49
raise EOFError("fd %s has been closed." % fd)
50
51
return output
52
53
def blockingWriteToFD(fd, data):
54
# Another quick twist
55
while True:
56
try:
57
data_length = len(data)
58
wrote_data = os.write(fd, data)
59
except (OSError, IOError) as io:
60
if io.errno in (errno.EAGAIN, errno.EINTR):
61
continue
62
else:
63
raise
64
65
if wrote_data < data_length:
66
blockingWriteToFD(fd, data[wrote_data:])
67
68
break
69
70
# the following code is taken from http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/
71
class Popen(subprocess.Popen):
72
def recv(self, maxsize=None):
73
return self._recv('stdout', maxsize)
74
75
def recv_err(self, maxsize=None):
76
return self._recv('stderr', maxsize)
77
78
def send_recv(self, input='', maxsize=None):
79
return self.send(input), self.recv(maxsize), self.recv_err(maxsize)
80
81
def get_conn_maxsize(self, which, maxsize):
82
if maxsize is None:
83
maxsize = 1024
84
elif maxsize < 1:
85
maxsize = 1
86
return getattr(self, which), maxsize
87
88
def _close(self, which):
89
getattr(self, which).close()
90
setattr(self, which, None)
91
92
if IS_WIN:
93
def send(self, input):
94
if not self.stdin:
95
return None
96
97
try:
98
x = msvcrt.get_osfhandle(self.stdin.fileno())
99
(_, written) = WriteFile(x, input)
100
except ValueError:
101
return self._close('stdin')
102
except Exception as ex:
103
if getattr(ex, "args", None) and ex.args[0] in (109, errno.ESHUTDOWN):
104
return self._close('stdin')
105
raise
106
107
return written
108
109
def _recv(self, which, maxsize):
110
conn, maxsize = self.get_conn_maxsize(which, maxsize)
111
if conn is None:
112
return None
113
114
try:
115
x = msvcrt.get_osfhandle(conn.fileno())
116
(read, nAvail, _) = PeekNamedPipe(x, 0)
117
if maxsize < nAvail:
118
nAvail = maxsize
119
if nAvail > 0:
120
(_, read) = ReadFile(x, nAvail, None)
121
except (ValueError, NameError):
122
return self._close(which)
123
except Exception as ex:
124
if getattr(ex, "args", None) and ex.args[0] in (109, errno.ESHUTDOWN):
125
return self._close(which)
126
raise
127
128
if self.universal_newlines:
129
read = self._translate_newlines(read)
130
return read
131
else:
132
def send(self, input):
133
if not self.stdin:
134
return None
135
136
if not select.select([], [self.stdin], [], 0)[1]:
137
return 0
138
139
try:
140
written = os.write(self.stdin.fileno(), input)
141
except OSError as ex:
142
if ex.args[0] == errno.EPIPE: # broken pipe
143
return self._close('stdin')
144
raise
145
146
return written
147
148
def _recv(self, which, maxsize):
149
conn, maxsize = self.get_conn_maxsize(which, maxsize)
150
if conn is None:
151
return None
152
153
flags = fcntl.fcntl(conn, fcntl.F_GETFL)
154
if not conn.closed:
155
fcntl.fcntl(conn, fcntl.F_SETFL, flags | os.O_NONBLOCK)
156
157
try:
158
if not select.select([conn], [], [], 0)[0]:
159
return ''
160
161
r = conn.read(maxsize)
162
if not r:
163
return self._close(which)
164
165
if self.universal_newlines:
166
r = self._translate_newlines(r)
167
return r
168
finally:
169
if not conn.closed:
170
fcntl.fcntl(conn, fcntl.F_SETFL, flags)
171
172
def recv_some(p, t=.1, e=1, tr=5, stderr=0):
173
if tr < 1:
174
tr = 1
175
x = time.time() + t
176
y = []
177
r = ''
178
if stderr:
179
pr = p.recv_err
180
else:
181
pr = p.recv
182
while time.time() < x or r:
183
r = pr()
184
if r is None:
185
break
186
elif r:
187
y.append(r)
188
else:
189
time.sleep(max((x - time.time()) / tr, 0))
190
return b''.join(y)
191
192
def send_all(p, data):
193
if not data:
194
return
195
196
data = getBytes(data)
197
198
while len(data):
199
sent = p.send(data)
200
if not isinstance(sent, int):
201
break
202
data = buffer(data[sent:])
203
204