--- a/smb/kio_smb.h +++ b/smb/kio_smb.h @@ -204,6 +204,7 @@ public: Q_REQUIRED_RESULT WorkerResult copy(const QUrl &src, const QUrl &dst, int permissions, KIO::JobFlags flags) override; Q_REQUIRED_RESULT WorkerResult del(const QUrl &kurl, bool isfile) override; Q_REQUIRED_RESULT WorkerResult mkdir(const QUrl &kurl, int permissions) override; + Q_REQUIRED_RESULT WorkerResult chmod(const QUrl &kurl, int permissions) override; Q_REQUIRED_RESULT WorkerResult rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) override; // Functions overwritten in kio_smb_file.cpp diff --git a/smb/kio_smb_dir.cpp b/smb/kio_smb_dir.cpp index c35d1da..f3f3467 --- a/smb/kio_smb_dir.cpp +++ b/smb/kio_smb_dir.cpp @@ -494,6 +494,51 @@ void SMBWorker::mkdir(const QUrl &kurl, i return equal; } +WorkerResult SMBWorker::chmod( const QUrl &kurl, int permissions ) +{ + int errNum = 0; + int retVal = 0; + m_current_url = kurl; + + retVal = smbc_chmod(m_current_url.toSmbcUrl(), permissions); + + if( retVal < 0 ){ + errNum = errno; + } else { + errNum = 0; + } + + if( retVal < 0 ) + { + switch(errNum) + { + case ENOENT: + errNum = cache_stat(kurl, &st); + if( errNum != 0 ) + { + if(errNum == EACCES) + { + return WorkerResult::fail(KIO::ERR_ACCESS_DENIED, kurl.toDisplayString()); + } + else + { + return WorkerResult::fail(KIO::ERR_DOES_NOT_EXIST, kurl.toDisplayString()); + } + } + break; + + case EACCES: + case EPERM: + return WorkerResult::fail( KIO::ERR_ACCESS_DENIED, kurl.toDisplayString() ); + + } + + return WorkerResult::fail( KIO::ERR_CANNOT_CHMOD, kurl.toDisplayString() ); + } + + return WorkerResult::pass(); +} + WorkerResult SMBWorker::rename(const QUrl &ksrc, const QUrl &kdest, KIO::JobFlags flags) { SMBUrl src;