diff --git a/src/base/filesystemwatcher.cpp b/src/base/filesystemwatcher.cpp index 1ed41c0c9..a7667b247 100644 --- a/src/base/filesystemwatcher.cpp +++ b/src/base/filesystemwatcher.cpp @@ -28,29 +28,23 @@ #include "filesystemwatcher.h" -#include - #if defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) #include #include #include -#elif !defined Q_OS_WIN && !defined Q_OS_HAIKU -#include #endif -#include "algorithm.h" +#include + +#include "base/algorithm.h" #include "base/bittorrent/magneturi.h" #include "base/bittorrent/torrentinfo.h" #include "base/global.h" #include "base/preferences.h" +#include "base/utils/fs.h" namespace { - // usually defined in /usr/include/linux/magic.h - const unsigned long CIFS_MAGIC_NUMBER = 0xFF534D42; - const unsigned long NFS_SUPER_MAGIC = 0x6969; - const unsigned long SMB_SUPER_MAGIC = 0x517B; - const int WATCH_INTERVAL = 10000; // 10 sec const int MAX_PARTIAL_RETRIES = 5; } @@ -88,7 +82,7 @@ void FileSystemWatcher::addPath(const QString &path) if (!dir.exists()) return; // Check if the path points to a network file system or not - if (isNetworkFileSystem(path)) { + if (Utils::Fs::isNetworkFileSystem(path)) { // Network mode qDebug("Network folder detected: %s", qUtf8Printable(path)); qDebug("Using file polling mode instead of inotify..."); @@ -199,28 +193,3 @@ void FileSystemWatcher::processTorrentsInDir(const QDir &dir) m_partialTorrentTimer->start(WATCH_INTERVAL); } } - -#if !defined Q_OS_WIN && !defined Q_OS_HAIKU -bool FileSystemWatcher::isNetworkFileSystem(const QString &path) -{ - QString file = path; - if (!file.endsWith('/')) - file += '/'; - file += '.'; - - struct statfs buf {}; - if (statfs(file.toLocal8Bit().constData(), &buf) != 0) - return false; - -#ifdef Q_OS_MAC - // XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined? - return ((strncmp(buf.f_fstypename, "nfs", sizeof(buf.f_fstypename)) == 0) - || (strncmp(buf.f_fstypename, "cifs", sizeof(buf.f_fstypename)) == 0) - || (strncmp(buf.f_fstypename, "smbfs", sizeof(buf.f_fstypename)) == 0)); -#else - return ((buf.f_type == CIFS_MAGIC_NUMBER) - || (buf.f_type == NFS_SUPER_MAGIC) - || (buf.f_type == SMB_SUPER_MAGIC)); -#endif -} -#endif diff --git a/src/base/filesystemwatcher.h b/src/base/filesystemwatcher.h index fdb4ed796..acc8203ce 100644 --- a/src/base/filesystemwatcher.h +++ b/src/base/filesystemwatcher.h @@ -64,9 +64,6 @@ protected slots: private: void processTorrentsInDir(const QDir &dir); -#if !defined Q_OS_WIN && !defined Q_OS_HAIKU - static bool isNetworkFileSystem(const QString &path); -#endif #ifndef Q_OS_WIN diff --git a/src/base/utils/fs.cpp b/src/base/utils/fs.cpp index 54349498f..eee398a57 100644 --- a/src/base/utils/fs.cpp +++ b/src/base/utils/fs.cpp @@ -31,8 +31,6 @@ #include "fs.h" #include -#include -#include #include #include @@ -42,6 +40,9 @@ #include #include +#include +#include + #if defined(Q_OS_WIN) #include #elif defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) @@ -301,3 +302,33 @@ bool Utils::Fs::isRegularFile(const QString &path) return (st.st_mode & S_IFMT) == S_IFREG; } + +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU +bool Utils::Fs::isNetworkFileSystem(const QString &path) +{ + QString file = path; + if (!file.endsWith('/')) + file += '/'; + file += '.'; + + struct statfs buf {}; + if (statfs(file.toLocal8Bit().constData(), &buf) != 0) + return false; + +#ifdef Q_OS_MAC + // XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined? + return ((strncmp(buf.f_fstypename, "nfs", sizeof(buf.f_fstypename)) == 0) + || (strncmp(buf.f_fstypename, "cifs", sizeof(buf.f_fstypename)) == 0) + || (strncmp(buf.f_fstypename, "smbfs", sizeof(buf.f_fstypename)) == 0)); +#else + // usually defined in /usr/include/linux/magic.h + const unsigned long CIFS_MAGIC_NUMBER = 0xFF534D42; + const unsigned long NFS_SUPER_MAGIC = 0x6969; + const unsigned long SMB_SUPER_MAGIC = 0x517B; + + return ((buf.f_type == CIFS_MAGIC_NUMBER) + || (buf.f_type == NFS_SUPER_MAGIC) + || (buf.f_type == SMB_SUPER_MAGIC)); +#endif +} +#endif diff --git a/src/base/utils/fs.h b/src/base/utils/fs.h index 14265fc13..9c70477d3 100644 --- a/src/base/utils/fs.h +++ b/src/base/utils/fs.h @@ -63,6 +63,10 @@ namespace Utils void removeDirRecursive(const QString &path); QString tempPath(); + +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU + bool isNetworkFileSystem(const QString &path); +#endif } }