132QLockFile::LockError QLockFilePrivate::tryLock_sys()
134 const QByteArray lockFileName = QFile::encodeName(fileName);
135 const int fd = qt_safe_open(lockFileName.constData(), O_RDWR | O_CREAT | O_EXCL, 0666);
139 return QLockFile::LockFailedError;
142 return QLockFile::PermissionError;
144 return QLockFile::UnknownError;
148 if (!setNativeLocks(fd)) {
149 const int errnoSaved = errno;
150 qWarning() <<
"setNativeLocks failed:" << qt_error_string(errnoSaved);
153 QByteArray fileData = lockFileContents();
154 if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) {
156 if (!QFile::remove(fileName))
157 qWarning(
"QLockFile: Could not remove our own lock file %ls.", qUtf16Printable(fileName));
158 return QLockFile::UnknownError;
165#if defined(_POSIX_SYNCHRONIZED_IO
) && _POSIX_SYNCHRONIZED_IO
> 0
166 fdatasync(fileHandle);
171 return QLockFile::NoError;
174bool QLockFilePrivate::removeStaleLock()
176 const QByteArray lockFileName = QFile::encodeName(fileName);
177 const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0666);
180 bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0);
185bool QLockFilePrivate::isProcessRunning(qint64 pid,
const QString &appname)
187 if (::kill(pid_t(pid), 0) == -1 && errno == ESRCH)
190 const QString processName = processNameByPid(pid);
191 if (!processName.isEmpty()) {
192 QFileInfo fi(appname);
194 fi.setFile(fi.symLinkTarget());
195 if (processName != fi.fileName())
202QString QLockFilePrivate::processNameByPid(qint64 pid)
204#if defined(Q_OS_MACOS)
206 proc_name(pid, name,
sizeof(name) /
sizeof(
char));
207 return QFile::decodeName(name);
208#elif defined(Q_OS_LINUX)
209 if (!qt_haveLinuxProcfs())
213 sprintf(exePath,
"/proc/%lld/exe", pid);
215 QByteArray buf = qt_readlink(exePath);
218 return QStringLiteral(
"/ERROR/");
222 static const char deleted[] =
" (deleted)";
223 if (buf.endsWith(deleted))
224 buf.chop(strlen(deleted));
226 return QFileSystemEntry(buf, QFileSystemEntry::FromNativePath()).fileName();
227#elif defined(Q_OS_HAIKU)
229 if (get_thread_info(pid, &info) != B_OK)
231 return QFile::decodeName(info.name);
232#elif defined(Q_OS_BSD4) && !defined(QT_PLATFORM_UIKIT)
233# if defined(Q_OS_NETBSD)
234 struct kinfo_proc2 kp;
235 int mib[6] = { CTL_KERN, KERN_PROC2, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc2), 1 };
236# elif defined(Q_OS_OPENBSD)
237 struct kinfo_proc kp;
238 int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid,
sizeof(
struct kinfo_proc), 1 };
240 struct kinfo_proc kp;
241 int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, (
int)pid };
243 size_t len =
sizeof(kp);
244 u_int mib_len =
sizeof(mib)/
sizeof(u_int);
246 if (sysctl(mib, mib_len, &kp, &len, NULL, 0) < 0)
249# if defined(Q_OS_OPENBSD) || defined(Q_OS_NETBSD)
252 QString name = QFile::decodeName(kp.p_comm);
254 if (kp.ki_pid != pid)
256 QString name = QFile::decodeName(kp.ki_comm);
259#elif defined(Q_OS_QNX)
260 char exePath[PATH_MAX];
261 sprintf(exePath,
"/proc/%lld/exefile", pid);
263 int fd = qt_safe_open(exePath, O_RDONLY);
268 if (QT_FSTAT(fd, &sbuf) == -1) {
273 QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
274 buffer.resize(qt_safe_read(fd, buffer.data(), sbuf.st_size - 1));
275 if (buffer.isEmpty()) {
277 return QStringLiteral(
"/ERROR/");
279 return QFileSystemEntry(buffer, QFileSystemEntry::FromNativePath()).fileName();