/*! Sets the file descriptor that this QDBusUnixFileDescriptor object holds to a copy of \a fileDescriptor. The original file descriptor is not touched and must be closed by the user. Note that the value returned by fileDescriptor() will be different from the \a fileDescriptor parameter passed. If the \a fileDescriptor parameter is not valid, isValid() will return false and fileDescriptor() will return -1. \sa isValid(), fileDescriptor() */ void QDBusUnixFileDescriptor::setFileDescriptor(int fileDescriptor) { if (fileDescriptor != -1) giveFileDescriptor(qt_safe_dup(fileDescriptor)); }
QStringList QDnotifyFileSystemWatcherEngine::addPaths(const QStringList &paths, QStringList *files, QStringList *directories) { QMutexLocker locker(&mutex); QStringList p = paths; QMutableListIterator<QString> it(p); while (it.hasNext()) { QString path = it.next(); QFileInfo fi(path); if(!fi.exists()) { continue; } bool isDir = fi.isDir(); if (isDir && directories->contains(path)) { continue; // Skip monitored directories } else if(!isDir && files->contains(path)) { continue; // Skip monitored files } if(!isDir) path = fi.canonicalPath(); // Locate the directory entry (creating if needed) int fd = pathToFD[path]; if(fd == 0) { QT_DIR *d = QT_OPENDIR(path.toUtf8().constData()); if(!d) continue; // Could not open directory QT_DIR *parent = 0; QDir parentDir(path); if(!parentDir.isRoot()) { parentDir.cdUp(); parent = QT_OPENDIR(parentDir.path().toUtf8().constData()); if(!parent) { QT_CLOSEDIR(d); continue; } } fd = qt_safe_dup(::dirfd(d)); int parentFd = parent ? qt_safe_dup(::dirfd(parent)) : 0; QT_CLOSEDIR(d); if(parent) QT_CLOSEDIR(parent); Q_ASSERT(fd); if(::fcntl(fd, F_SETSIG, SIGIO) || ::fcntl(fd, F_NOTIFY, DN_MODIFY | DN_CREATE | DN_DELETE | DN_RENAME | DN_ATTRIB | DN_MULTISHOT) || (parent && ::fcntl(parentFd, F_SETSIG, SIGIO)) || (parent && ::fcntl(parentFd, F_NOTIFY, DN_DELETE | DN_RENAME | DN_MULTISHOT))) { continue; // Could not set appropriate flags } Directory dir; dir.path = path; dir.fd = fd; dir.parentFd = parentFd; fdToDirectory.insert(fd, dir); pathToFD.insert(path, fd); if(parentFd) parentToFD.insert(parentFd, fd); } Directory &directory = fdToDirectory[fd]; if(isDir) { directory.isMonitored = true; } else { Directory::File file; file.path = fi.filePath(); file.lastWrite = fi.lastModified(); directory.files.append(file); pathToFD.insert(fi.filePath(), fd); } it.remove(); if(isDir) { directories->append(path); } else { files->append(fi.filePath()); } } dnotifySignal()->startNotify(); return p; }