source: psi/trunk/src/tools/openpgp/gpgproc/qpipe.cpp

Last change on this file was 85, checked in by dmik, 19 years ago

Psi: Pipes: Use socketpair() instead of pipe() because the latter is not currently implemented in kLIBC.

File size: 3.9 KB
Line 
1#include"qpipe.h"
2
3#ifdef Q_WS_WIN
4
5static uint readFromHandle(HANDLE h, char *buf, uint size)
6{
7 if(size > 0) {
8 ulong r;
9 if(ReadFile(h, buf, size, &r, 0))
10 return r;
11 }
12 return 0;
13}
14
15#else
16
17#include<unistd.h>
18#include<fcntl.h>
19#include<errno.h>
20
21#if defined(Q_OS_OS2) && defined(__INNOTEK_LIBC__)
22#include<sys/socket.h>
23#endif
24
25#endif
26
27//----------------------------------------------------------------------------
28// QPipeEnd
29//----------------------------------------------------------------------------
30QPipeEnd::QPipeEnd()
31{
32 reset();
33}
34
35QPipeEnd::~QPipeEnd()
36{
37 close();
38}
39
40void QPipeEnd::reset()
41{
42#ifdef Q_WS_WIN
43 p = 0;
44#else
45 p = -1;
46#endif
47}
48
49bool QPipeEnd::isOpen() const
50{
51#ifdef Q_WS_WIN
52 return (p ? true: false);
53#else
54 return (p != -1 ? true: false);
55#endif
56}
57
58const QPipeId & QPipeEnd::id() const
59{
60 return p;
61}
62
63void QPipeEnd::setId(const QPipeId &x)
64{
65 p = x;
66}
67
68void QPipeEnd::close()
69{
70 if(!isOpen())
71 return;
72#ifdef Q_WS_WIN
73 CloseHandle(p);
74#else
75 ::close(p);
76#endif
77 reset();
78}
79
80void QPipeEnd::release()
81{
82 reset();
83}
84
85QString QPipeEnd::toString() const
86{
87#ifdef Q_WS_WIN
88 DWORD dw;
89 memcpy(&dw, &p, sizeof(DWORD));
90 return QString::number(dw);
91#else
92 return QString::number(p);
93#endif
94}
95
96int QPipeEnd::write(const QByteArray &buf)
97{
98#ifdef Q_WS_WIN
99 DWORD written;
100 if(!WriteFile(p, buf.data(), buf.size(), &written, 0))
101 return -1;
102 return written;
103#else
104 return (::write(p, buf.data(), buf.size()));
105#endif
106}
107
108QByteArray QPipeEnd::readAll(bool *done)
109{
110#ifdef Q_WS_WIN
111 if(done)
112 *done = false;
113 unsigned long i, r;
114 char dummy;
115 if(!PeekNamedPipe(p, &dummy, 1, &r, &i, 0))
116 return QByteArray();
117 if(i <= 0)
118 return QByteArray();
119
120 QByteArray buf;
121 buf.resize(i);
122 int size = readFromHandle(p, buf.data(), i);
123 if(size == 0)
124 return QByteArray();
125 return buf;
126#else
127 if(done)
128 *done = false;
129 QByteArray buf;
130 while(1) {
131 char block[1024];
132 int n = read(p, block, 1024);
133 if(n < 0) {
134 if(errno == EAGAIN) {
135 break;
136 }
137 else {
138 if(done)
139 *done = true;
140 break;
141 }
142 }
143 else if(n == 0) {
144 if(done)
145 *done = true;
146 break;
147 }
148
149 int oldsize = buf.size();
150 buf.resize(oldsize + n);
151 memcpy(buf.data() + oldsize, block, n);
152 }
153
154 return buf;
155#endif
156}
157
158#ifdef Q_WS_WIN
159bool QPipeEnd::winDupHandle()
160{
161 HANDLE h;
162 if(!DuplicateHandle(GetCurrentProcess(), p, GetCurrentProcess(), &h, 0, FALSE, DUPLICATE_SAME_ACCESS))
163 return false;
164 CloseHandle(p);
165 p = h;
166 return true;
167}
168
169#else
170
171bool QPipeEnd::setBlock(bool b)
172{
173 int flags = fcntl(p, F_GETFL);
174 if(!b)
175 flags |= O_NONBLOCK;
176 else
177 flags &= ~O_NONBLOCK;
178 if(fcntl(p, F_SETFL, flags) == -1)
179 return false;
180 return true;
181}
182#endif
183
184
185//----------------------------------------------------------------------------
186// QPipe
187//----------------------------------------------------------------------------
188QPipe::QPipe()
189{
190}
191
192QPipe::~QPipe()
193{
194 close();
195}
196
197void QPipe::closeReadEnd()
198{
199 i.close();
200}
201
202void QPipe::closeWriteEnd()
203{
204 o.close();
205}
206
207int QPipe::write(const QByteArray &buf)
208{
209 return o.write(buf);
210}
211
212QByteArray QPipe::readAll(bool *done)
213{
214 return i.readAll(done);
215}
216
217bool QPipe::open()
218{
219 close();
220
221#ifdef Q_WS_WIN
222 SECURITY_ATTRIBUTES secAttr;
223 memset(&secAttr, 0, sizeof secAttr);
224 secAttr.nLength = sizeof secAttr;
225 secAttr.bInheritHandle = TRUE;
226
227 HANDLE r, w;
228 if(!CreatePipe(&r, &w, &secAttr, 0))
229 return false;
230 i.setId(r);
231 o.setId(w);
232#else
233 int p[2];
234#if defined(Q_OS_OS2) && defined(__INNOTEK_LIBC__)
235 if(socketpair(AF_LOCAL, SOCK_STREAM, 0, p) == -1)
236#else
237 if(pipe(p) == -1)
238#endif
239 return false;
240 i.setId(p[0]);
241 o.setId(p[1]);
242#endif
243 return true;
244}
245
246void QPipe::close()
247{
248 i.close();
249 o.close();
250}
251
252void QPipe::release()
253{
254 i.release();
255 o.release();
256}
Note: See TracBrowser for help on using the repository browser.