diff options
Diffstat (limited to 'kio/kio/chmodjob.cpp')
-rw-r--r-- | kio/kio/chmodjob.cpp | 258 |
1 files changed, 0 insertions, 258 deletions
diff --git a/kio/kio/chmodjob.cpp b/kio/kio/chmodjob.cpp deleted file mode 100644 index f589da957..000000000 --- a/kio/kio/chmodjob.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (C) 2000 Stephan Kulow <coolo@kde.org> - David Faure <faure@kde.org> - Waldo Bastian <bastian@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include <config.h> - -#include <pwd.h> -#include <grp.h> -#include <sys/types.h> -#include <unistd.h> -#include <assert.h> - -#include <tqtimer.h> -#include <tqfile.h> -#include <klocale.h> -#include <kdebug.h> -#include <kmessagebox.h> - -#include "kio/job.h" -#include "kio/chmodjob.h" - -#include <kdirnotify_stub.h> - -using namespace TDEIO; - -ChmodJob::ChmodJob( const KFileItemList& lstItems, int permissions, int mask, - int newOwner, int newGroup, - bool recursive, bool showProgressInfo ) - : TDEIO::Job( showProgressInfo ), state( STATE_LISTING ), - m_permissions( permissions ), m_mask( mask ), - m_newOwner( newOwner ), m_newGroup( newGroup ), - m_recursive( recursive ), m_lstItems( lstItems ) -{ - TQTimer::singleShot( 0, this, TQT_SLOT(processList()) ); -} - -void ChmodJob::processList() -{ - while ( !m_lstItems.isEmpty() ) - { - KFileItem * item = m_lstItems.first(); - if ( !item->isLink() ) // don't do anything with symlinks - { - // File or directory -> remember to chmod - ChmodInfo info; - info.url = item->url(); - // This is a toplevel file, we apply changes directly (no +X emulation here) - info.permissions = ( m_permissions & m_mask ) | ( item->permissions() & ~m_mask ); - /*kdDebug(7007) << "\n current permissions=" << TQString::number(item->permissions(),8) - << "\n wanted permission=" << TQString::number(m_permissions,8) - << "\n with mask=" << TQString::number(m_mask,8) - << "\n with ~mask (mask bits we keep) =" << TQString::number((uint)~m_mask,8) - << "\n bits we keep =" << TQString::number(item->permissions() & ~m_mask,8) - << "\n new permissions = " << TQString::number(info.permissions,8) - << endl;*/ - m_infos.prepend( info ); - //kdDebug(7007) << "processList : Adding info for " << info.url.prettyURL() << endl; - // Directory and recursive -> list - if ( item->isDir() && m_recursive ) - { - //kdDebug(7007) << "ChmodJob::processList dir -> listing" << endl; - TDEIO::ListJob * listJob = TDEIO::listRecursive( item->url(), false /* no GUI */ ); - connect( listJob, TQT_SIGNAL(entries( TDEIO::Job *, - const TDEIO::UDSEntryList& )), - TQT_SLOT( slotEntries( TDEIO::Job*, - const TDEIO::UDSEntryList& ))); - addSubjob( listJob ); - return; // we'll come back later, when this one's finished - } - } - m_lstItems.removeFirst(); - } - kdDebug(7007) << "ChmodJob::processList -> going to STATE_CHMODING" << endl; - // We have finished, move on - state = STATE_CHMODING; - chmodNextFile(); -} - -void ChmodJob::slotEntries( TDEIO::Job*, const TDEIO::UDSEntryList & list ) -{ - TDEIO::UDSEntryListConstIterator it = list.begin(); - TDEIO::UDSEntryListConstIterator end = list.end(); - for (; it != end; ++it) { - TDEIO::UDSEntry::ConstIterator it2 = (*it).begin(); - mode_t permissions = 0; - bool isDir = false; - bool isLink = false; - TQString relativePath; - for( ; it2 != (*it).end(); it2++ ) { - switch( (*it2).m_uds ) { - case TDEIO::UDS_NAME: - relativePath = (*it2).m_str; - break; - case TDEIO::UDS_FILE_TYPE: - isDir = S_ISDIR((*it2).m_long); - break; - case TDEIO::UDS_LINK_DEST: - isLink = !(*it2).m_str.isEmpty(); - break; - case TDEIO::UDS_ACCESS: - permissions = (mode_t)((*it2).m_long); - break; - default: - break; - } - } - if ( !isLink && relativePath != TQString::fromLatin1("..") ) - { - ChmodInfo info; - info.url = m_lstItems.first()->url(); // base directory - info.url.addPath( relativePath ); - int mask = m_mask; - // Emulate -X: only give +x to files that had a +x bit already - // So the check is the opposite : if the file had no x bit, don't touch x bits - // For dirs this doesn't apply - if ( !isDir ) - { - int newPerms = m_permissions & mask; - if ( (newPerms & 0111) && !(permissions & 0111) ) - { - // don't interfere with mandatory file locking - if ( newPerms & 02000 ) - mask = mask & ~0101; - else - mask = mask & ~0111; - } - } - info.permissions = ( m_permissions & mask ) | ( permissions & ~mask ); - /*kdDebug(7007) << "\n current permissions=" << TQString::number(permissions,8) - << "\n wanted permission=" << TQString::number(m_permissions,8) - << "\n with mask=" << TQString::number(mask,8) - << "\n with ~mask (mask bits we keep) =" << TQString::number((uint)~mask,8) - << "\n bits we keep =" << TQString::number(permissions & ~mask,8) - << "\n new permissions = " << TQString::number(info.permissions,8) - << endl;*/ - // Prepend this info in our todo list. - // This way, the toplevel dirs are done last. - m_infos.prepend( info ); - } - } -} - -void ChmodJob::chmodNextFile() -{ - if ( !m_infos.isEmpty() ) - { - ChmodInfo info = m_infos.first(); - m_infos.remove( m_infos.begin() ); - // First update group / owner (if local file) - // (permissions have to set after, in case of suid and sgid) - if ( info.url.isLocalFile() && ( m_newOwner != -1 || m_newGroup != -1 ) ) - { - TQString path = info.url.path(); - if ( chown( TQFile::encodeName(path), m_newOwner, m_newGroup ) != 0 ) - { - int answer = KMessageBox::warningContinueCancel( 0, i18n( "<qt>Could not modify the ownership of file <b>%1</b>. You have insufficient access to the file to perform the change.</qt>" ).arg(path), TQString::null, i18n("&Skip File") ); - if (answer == KMessageBox::Cancel) - { - m_error = ERR_USER_CANCELED; - emitResult(); - return; - } - } - } - - kdDebug(7007) << "ChmodJob::chmodNextFile chmod'ing " << info.url.prettyURL() - << " to " << TQString::number(info.permissions,8) << endl; - TDEIO::SimpleJob * job = TDEIO::chmod( info.url, info.permissions ); - // copy the metadata for acl and default acl - const TQString aclString = queryMetaData( "ACL_STRING" ); - const TQString defaultAclString = queryMetaData( "DEFAULT_ACL_STRING" ); - if ( !aclString.isEmpty() ) - job->addMetaData( "ACL_STRING", aclString ); - if ( !defaultAclString.isEmpty() ) - job->addMetaData( "DEFAULT_ACL_STRING", defaultAclString ); - addSubjob(job); - } - else - // We have finished - emitResult(); -} - -void ChmodJob::slotResult( TDEIO::Job * job ) -{ - if ( job->error() ) - { - m_error = job->error(); - m_errorText = job->errorText(); - emitResult(); - return; - } - //kdDebug(7007) << " ChmodJob::slotResult( TDEIO::Job * job ) m_lstItems:" << m_lstItems.count() << endl; - switch ( state ) - { - case STATE_LISTING: - subjobs.remove(job); - m_lstItems.removeFirst(); - kdDebug(7007) << "ChmodJob::slotResult -> processList" << endl; - processList(); - return; - case STATE_CHMODING: - subjobs.remove(job); - kdDebug(7007) << "ChmodJob::slotResult -> chmodNextFile" << endl; - chmodNextFile(); - return; - default: - assert(0); - return; - } -} - -// antlarr: KDE 4: Make owner and group be const TQString & -TDEIO_EXPORT ChmodJob *TDEIO::chmod( const KFileItemList& lstItems, int permissions, int mask, - TQString owner, TQString group, - bool recursive, bool showProgressInfo ) -{ - uid_t newOwnerID = (uid_t)-1; // chown(2) : -1 means no change - if ( !owner.isEmpty() ) - { - struct passwd* pw = getpwnam(TQFile::encodeName(owner)); - if ( pw == 0L ) - kdError(250) << " ERROR: No user " << owner << endl; - else - newOwnerID = pw->pw_uid; - } - gid_t newGroupID = (gid_t)-1; // chown(2) : -1 means no change - if ( !group.isEmpty() ) - { - struct group* g = getgrnam(TQFile::encodeName(group)); - if ( g == 0L ) - kdError(250) << " ERROR: No group " << group << endl; - else - newGroupID = g->gr_gid; - } - return new ChmodJob( lstItems, permissions, mask, newOwnerID, newGroupID, recursive, showProgressInfo ); -} - -void ChmodJob::virtual_hook( int id, void* data ) -{ TDEIO::Job::virtual_hook( id, data ); } - -#include "chmodjob.moc" |