qlocalserver_unix.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/network/socket/qlocalserver_unix.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13void QLocalServerPrivate::init()-
14{-
15}-
16-
17bool QLocalServerPrivate::removeServer(const QString &name)-
18{-
19 QString fileName;-
20 if (name.startsWith(QLatin1Char('/'))) {-
21 fileName = name;-
22 } else {-
23 fileName = QDir::cleanPath(QDir::tempPath());-
24 fileName += QLatin1Char('/') + name;-
25 }-
26 if (QFile::exists(fileName))-
27 return QFile::remove(fileName);-
28 else-
29 return true;-
30}-
31-
32bool QLocalServerPrivate::listen(const QString &requestedServerName)-
33{-
34 QLocalServer * const q = q_func();-
35-
36-
37 if (requestedServerName.startsWith(QLatin1Char('/'))) {-
38 fullServerName = requestedServerName;-
39 } else {-
40 fullServerName = QDir::cleanPath(QDir::tempPath());-
41 fullServerName += QLatin1Char('/') + requestedServerName;-
42 }-
43 serverName = requestedServerName;-
44-
45 QByteArray encodedTempPath;-
46 const QByteArray encodedFullServerName = QFile::encodeName(fullServerName);-
47 QScopedPointer<QTemporaryDir> tempDir;-
48-
49-
50 if (socketOptions & QLocalServer::WorldAccessOption) {-
51 QFileInfo serverNameFileInfo(fullServerName);-
52 tempDir.reset(new QTemporaryDir(serverNameFileInfo.absolutePath() + QLatin1Char('/')));-
53 if (!tempDir->isValid()) {-
54 setError(QLatin1String("QLocalServer::listen"));-
55 return false;-
56 }-
57 encodedTempPath = QFile::encodeName(tempDir->path() + QLatin1String("/s"));-
58 }-
59-
60-
61 listenSocket = qt_safe_socket(1, SOCK_STREAM, 0);-
62 if (-1 == listenSocket) {-
63 setError(QLatin1String("QLocalServer::listen"));-
64 closeServer();-
65 return false;-
66 }-
67-
68-
69 struct ::sockaddr_un addr;-
70 addr.sun_family = 1;-
71 if (sizeof(addr.sun_path) < (uint)encodedFullServerName.size() + 1) {-
72 setError(QLatin1String("QLocalServer::listen"));-
73 closeServer();-
74 return false;-
75 }-
76-
77 if (socketOptions & QLocalServer::WorldAccessOption) {-
78 if (sizeof(addr.sun_path) < (uint)encodedTempPath.size() + 1) {-
79 setError(QLatin1String("QLocalServer::listen"));-
80 closeServer();-
81 return false;-
82 }-
83 ::memcpy(addr.sun_path, encodedTempPath.constData(),-
84 encodedTempPath.size() + 1);-
85 } else {-
86 ::memcpy(addr.sun_path, encodedFullServerName.constData(),-
87 encodedFullServerName.size() + 1);-
88 }-
89-
90-
91 if(-1 == ::bind(listenSocket, (sockaddr *)&addr, sizeof(sockaddr_un))) {-
92 setError(QLatin1String("QLocalServer::listen"));-
93-
94 if((*__errno_location ()) == 98)-
95 qt_safe_close(listenSocket);-
96-
97 else-
98 closeServer();-
99 listenSocket = -1;-
100 return false;-
101 }-
102-
103-
104 if (-1 == qt_safe_listen(listenSocket, 50)) {-
105 setError(QLatin1String("QLocalServer::listen"));-
106 closeServer();-
107 listenSocket = -1;-
108 if (error != QAbstractSocket::AddressInUseError)-
109 QFile::remove(fullServerName);-
110 return false;-
111 }-
112-
113 if (socketOptions & QLocalServer::WorldAccessOption) {-
114 mode_t mode = 000;-
115-
116 if (socketOptions & QLocalServer::UserAccessOption)-
117 mode |= (0400|0200|0100);-
118-
119 if (socketOptions & QLocalServer::GroupAccessOption)-
120 mode |= ((0400|0200|0100) >> 3);-
121-
122 if (socketOptions & QLocalServer::OtherAccessOption)-
123 mode |= (((0400|0200|0100) >> 3) >> 3);-
124-
125 if (::chmod(encodedTempPath.constData(), mode) == -1) {-
126 setError(QLatin1String("QLocalServer::listen"));-
127 closeServer();-
128 return false;-
129 }-
130-
131 if (::rename(encodedTempPath.constData(), encodedFullServerName.constData()) == -1) {-
132 setError(QLatin1String("QLocalServer::listen"));-
133 closeServer();-
134 return false;-
135 }-
136 }-
137-
138 ((!(!socketNotifier)) ? qt_assert("!socketNotifier",__FILE__,181187) : qt_noop());-
139 socketNotifier = new QSocketNotifier(listenSocket,-
140 QSocketNotifier::Read, q);-
141 q->connect(socketNotifier, qFlagLocation("2""activated(int)" "\0" __FILE__ ":" "184""190"),-
142 q, qFlagLocation("1""_q_onNewConnection()" "\0" __FILE__ ":" "185""191"));-
143 socketNotifier->setEnabled(maxPendingConnections > 0);-
144 return true;-
145}-
146-
147bool QLocalServerPrivate::listen(qintptr socketDescriptor)-
148{-
149 QLocalServer * const q = q_func();-
150-
151-
152 listenSocket = socketDescriptor;-
153-
154 ::fcntl(listenSocket, 2, 1);-
155 ::fcntl(listenSocket, 4, ::fcntl(listenSocket, 3) | 04000);-
156-
157-
158 struct ::sockaddr_un addr;-
159 socklen_t len = sizeof(addr);-
160 memset(&addr, 0, sizeof(addr));-
161 if (0 == ::getsockname(listenSocket, (sockaddr *)&addr, &len)) {-
162-
163 if (addr.sun_family == 1 && addr.sun_path[0] == 0) {-
164 addr.sun_path[0] = '@';-
165 }-
166 QString name = QString::fromLatin1(addr.sun_path);-
167 if (!name.isEmpty()) {-
168 fullServerName = name;-
169 serverName = fullServerName.mid(fullServerName.lastIndexOf(QLatin1Char('/')) + 1);-
170 if (serverName.isEmpty()) {-
171 serverName = fullServerName;-
172 }-
173 }-
174 }-
175-
176-
177-
178-
179-
180 ((!(!socketNotifier)) ? qt_assert("!socketNotifier",__FILE__,223229) : qt_noop());-
181 socketNotifier = new QSocketNotifier(listenSocket,-
182 QSocketNotifier::Read, q);-
183 q->connect(socketNotifier, qFlagLocation("2""activated(int)" "\0" __FILE__ ":" "226""232"),-
184 q, qFlagLocation("1""_q_onNewConnection()" "\0" __FILE__ ":" "227""233"));-
185 socketNotifier->setEnabled(maxPendingConnections > 0);-
186 return true;-
187}-
188-
189-
190-
191-
192-
193-
194void QLocalServerPrivate::closeServer()-
195{-
196 if (socketNotifier) {-
197 socketNotifier->setEnabled(false);-
198 socketNotifier->deleteLater();-
199 socketNotifier = 0;-
200 }-
201-
202 if (-1 != listenSocket)-
203 qt_safe_close(listenSocket);-
204 listenSocket = -1;-
205-
206 if (!fullServerName.isEmpty())-
207 QFile::remove(fullServerName);-
208}-
209-
210-
211-
212-
213-
214-
215-
216void QLocalServerPrivate::_q_onNewConnection()-
217{-
218 QLocalServer * const q = q_func();-
219 if (-1 == listenSocket)-
220 return;-
221-
222 ::sockaddr_un addr;-
223 socklen_t length = sizeof(sockaddr_un);-
224 int connectedSocket = qt_safe_accept(listenSocket, (sockaddr *)&addr, &length);-
225 if(-1 == connectedSocket) {-
226 setError(QLatin1String("QLocalSocket::activated"));-
227 closeServer();-
228 } else {-
229 socketNotifier->setEnabled(pendingConnections.size()-
230 <= maxPendingConnections);-
231 q->incomingConnection(connectedSocket);-
232 }-
233}-
234-
235void QLocalServerPrivate::waitForNewConnection(int msec, bool *timedOut)-
{
fd_set readfds;
do{
237 int __d0, __d1; __asm__ __volatile__ ("cld; rep; " "stosq" : "=c" (__d0), "pollfd pfd = D" (__d1) : "a" (0), "0" (sizeofqt_make_pollfd(fd_set) / sizeoflistenSocket, 0x001);-
238-
239 switch (__fd_mask)), "1"qt_poll_msecs(&((&readfds)->fds_bits)[&pfd, 1, msec)) {-
240 case
executed 2 times by 1 test: case 0:
Executed by:
  • tst_qlocalsocket - unknown status
executed 2 times by 1 test: case 0:
Executed by:
  • tst_qlocalsocket - unknown status
0]):
executed 2 times by 1 test: case 0:
Executed by:
  • tst_qlocalsocket - unknown status
2
241 "memory"); } whileif (0);0-2
((void) (((&readfds)->fds_bits)[((listenSockettimedOut
timedOutDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
)
242 / (8*
executed 2 times by 1 test: *timedOut = true;
Executed by:
  • tst_qlocalsocket - unknown status
(int) sizeof (__fd_mask)))] |timedOut = ((__fd_mask) 1 << ((listenSocket) % (8 * (int) sizeof (__fd_mask))))));
executed 2 times by 1 test: *timedOut = true;
Executed by:
  • tst_qlocalsocket - unknown status
2
struct timespec timeout
executed 2 times by 1 test: *timedOut = true;
Executed by:
  • tst_qlocalsocket - unknown status
executed 2 times by 1 test: *timedOut = true;
Executed by:
  • tst_qlocalsocket - unknown status
true;
executed 2 times by 1 test: *timedOut = true;
Executed by:
  • tst_qlocalsocket - unknown status
243-
244 timeout.tv_sec = msec / 1000return
executed 2 times by 1 test: return;
Executed by:
  • tst_qlocalsocket - unknown status
;
executed 2 times by 1 test: return;
Executed by:
  • tst_qlocalsocket - unknown status
2
245 timeoutbreak;
dead code: break;
-
246 default
executed 77 times by 3 tests: default:
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
:
executed 77 times by 3 tests: default:
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
77
247 if ((
(pfd.revents & 0x020) == 0Description
TRUEevaluated 77 times by 3 tests
Evaluated by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
pfd
(pfd.revents & 0x020) == 0Description
TRUEevaluated 77 times by 3 tests
Evaluated by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
(pfd.revents & 0x020) == 0Description
TRUEevaluated 77 times by 3 tests
Evaluated by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
.tv_nsec = (msec % 1000revents & 0x020) * 1000 * 1000== 0
(pfd.revents & 0x020) == 0Description
TRUEevaluated 77 times by 3 tests
Evaluated by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
FALSEnever evaluated
) {
0-77
248 _q_onNewConnection();-
249 return
executed 77 times by 3 tests: return;
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
executed 77 times by 3 tests: return;
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
executed 77 times by 3 tests: return;
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
;
executed 77 times by 3 tests: return;
Executed by:
  • tst_QNetworkReply
  • tst_QNetworkSession
  • tst_qlocalsocket - unknown status
77
250 int result}-
251-
252 (*__errno_location ()) = -19;-
253-
254 result = qt_safe_select(listenSocket + 1, &readfds, 0, 0, (msec ==case
never executed: case -1:
never executed: case -1:
-1) ? 0:
never executed: case -1:
code before this statement never executed: case -1:
0
255 &timeout);-
if (-1 == result) {setError(QLatin1String("QLocalServer::waitForNewConnection"));
256 closeServer();-
257 break;
never executed: break;
0
258 }if (result > 0)-
_q_onNewConnection();
if (timedOut)
*timedOut = (result == 0);
259}-
260-
261void QLocalServerPrivate::setError(const QString &function)-
262{-
263 if (11 == (*__errno_location ()))-
264 return;-
265-
266 switch ((*__errno_location ())) {-
267 case 13:-
268 errorString = QLocalServer::tr("%1: Permission denied").arg(function);-
269 error = QAbstractSocket::SocketAccessError;-
270 break;-
271 case 40:-
272 case 2:-
273 case 36:-
274 case 30:-
275 case 20:-
276 errorString = QLocalServer::tr("%1: Name error").arg(function);-
277 error = QAbstractSocket::HostNotFoundError;-
278 break;-
279 case 98:-
280 errorString = QLocalServer::tr("%1: Address in use").arg(function);-
281 error = QAbstractSocket::AddressInUseError;-
282 break;-
283-
284 default:-
285 errorString = QLocalServer::tr("%1: Unknown error %2")-
286 .arg(function).arg((*__errno_location ()));-
287 error = QAbstractSocket::UnknownSocketError;-
288-
289-
290-
291 }-
292}-
293-
294-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9