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('/'))) { | - | ||||||||||||||||||||||||
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 | - | |||||||||||||||||||||||||
32 | bool 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 | - | |||||||||||||||||||||||||
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)) { | - | ||||||||||||||||||||||||
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 | - | |||||||||||||||||||||||||
194 | void 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 | - | |||||||||||||||||||||||||
216 | void 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 | - | |||||||||||||||||||||||||
235 | void 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:
executed 2 times by 1 test: 0]):case 0: Executed by:
executed 2 times by 1 test: case 0: Executed by:
| 2 | ||||||||||||||||||||||||
241 | "memory"); } whileif (0); | 0-2 | ||||||||||||||||||||||||
((void) (((&readfds)->fds_bits)[((listenSockettimedOut
| ||||||||||||||||||||||||||
242 | / (8* executed 2 times by 1 test: (int) sizeof (__fd_mask)))] |timedOut = ((__fd_mask) 1 << ((listenSocket) % (8 * (int) sizeof (__fd_mask))))));*timedOut = true; Executed by:
executed 2 times by 1 test: *timedOut = true; Executed by:
| 2 | ||||||||||||||||||||||||
struct timespec timeout executed 2 times by 1 test: *timedOut = true; Executed by:
executed 2 times by 1 test: true;*timedOut = true; Executed by:
executed 2 times by 1 test: *timedOut = true; Executed by:
| ||||||||||||||||||||||||||
243 | - | |||||||||||||||||||||||||
244 | timeout.tv_sec = msec / 1000return executed 2 times by 1 test: ;return; Executed by:
executed 2 times by 1 test: return; Executed by:
| 2 | ||||||||||||||||||||||||
245 | timeoutbreak; 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:
executed 77 times by 3 tests: return; Executed by:
executed 77 times by 3 tests: ;return; Executed by:
executed 77 times by 3 tests: return; Executed by:
| 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: -1) ? 0:case -1: 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 | - | |||||||||||||||||||||||||
261 | void 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 code | Preprocessed file |