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