133QLockFile::LockError QLockFilePrivate::tryLock_sys()
135 const QByteArray lockFileName = QFile::encodeName(fileName);
136 const int fd = qt_safe_open(lockFileName.constData(), O_RDWR | O_CREAT | O_EXCL, 0666);
140 return QLockFile::LockFailedError;
143 return QLockFile::PermissionError;
145 return QLockFile::UnknownError;
149 if (!setNativeLocks(fd)) {
150 const int errnoSaved = errno;
151 qWarning() <<
"setNativeLocks failed:" << qt_error_string(errnoSaved);
154 QByteArray fileData = lockFileContents();
155 if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) {
157 if (unlink(lockFileName) != 0)
158 qWarning(
"QLockFile: Could not remove our own lock file %s: %ls.",
159 lockFileName.constBegin(), qUtf16Printable(qt_error_string()));
160 return QLockFile::UnknownError;
167#if defined(_POSIX_SYNCHRONIZED_IO
) && _POSIX_SYNCHRONIZED_IO
> 0
168 fdatasync(fileHandle);
173 return QLockFile::NoError;
176bool QLockFilePrivate::removeStaleLock()
178 const QByteArray lockFileName = QFile::encodeName(fileName);
179 const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0666);
182 bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0);
187bool QLockFilePrivate::isProcessRunning(qint64 pid,
const QString &appname)
189 if (::kill(pid_t(pid), 0) == -1 && errno == ESRCH)
192 const QString processName = processNameByPid(pid);
193 if (!processName.isEmpty()) {
194 QFileInfo fi(appname);
196 fi.setFile(fi.symLinkTarget());
197 if (processName != fi.fileName())
204QString QLockFilePrivate::processNameByPid(qint64 pid)
206#if defined(Q_OS_MACOS)
208 proc_name(pid, name,
sizeof(name) /
sizeof(
char));
209 return QFile::decodeName(name);
210#elif defined(Q_OS_LINUX)
211 if (!qt_haveLinuxProcfs())
215 sprintf(exePath,
"/proc/%lld/exe", pid);
217 QByteArray buf = qt_readlink(exePath);
220 return QStringLiteral(
"/ERROR/");
224 static const char deleted[] =
" (deleted)";
225 if (buf.endsWith(deleted))
226 buf.chop(strlen(deleted));
228 return QFileSystemEntry(buf, QFileSystemEntry::FromNativePath()).fileName();
229#elif defined(Q_OS_HAIKU)
231 if (get_thread_info(pid, &info) != B_OK)
233 return QFile::decodeName(info.name);
234#elif defined(Q_OS_BSD4) && !defined(QT_PLATFORM_UIKIT)
235# if defined(Q_OS_NETBSD)
236 struct kinfo_proc2 kp;
237 int mib[6] = { CTL_KERN, KERN_PROC2, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc2), 1 };
238# elif defined(Q_OS_OPENBSD)
239 struct kinfo_proc kp;
240 int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc), 1 };
242 struct kinfo_proc kp;
243 int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid };
245 size_t len =
sizeof(kp);
246 u_int mib_len =
sizeof(mib)/
sizeof(u_int);
248 if (sysctl(mib, mib_len, &kp, &len, NULL, 0) < 0)
251# if defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD)
254 QString name = QFile::decodeName(kp.p_comm);
256 if (kp.ki_pid != pid)
258 QString name = QFile::decodeName(kp.ki_comm);
261#elif defined(Q_OS_QNX)
262 char exePath[PATH_MAX];
263 sprintf(exePath,
"/proc/%lld/exefile", pid);
265 int fd = qt_safe_open(exePath, O_RDONLY);
270 if (QT_FSTAT(fd, &sbuf) == -1) {
275 QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
276 buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size - 1));
277 if (buffer.isEmpty()) {
279 return QStringLiteral(
"/ERROR/");
281 return QFileSystemEntry(buffer, QFileSystemEntry::FromNativePath()).fileName();
288void QLockFile::unlock()
294 const QByteArray lockFileName = QFile::encodeName(d->fileName);
295 if (unlink(lockFileName) != 0) {
296 qWarning(
"Could not remove our own lock file %s: %ls (maybe permissions changed meanwhile?)",
297 lockFileName.constBegin(), qUtf16Printable(qt_error_string()));
301 close(d->fileHandle);
303 d->lockError = QLockFile::NoError;