kde-workspace/kioslave/smb/kio_smb_mount.cpp
Ivailo Monev f1cfe7bdba generic: replace KProcess with QProcess where feasable
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2016-04-30 16:22:26 +00:00

191 lines
5.6 KiB
C++

/* This file is part of the KDE project
Copyright (C) 2000 Alexander Neundorf <neundorf@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 "kio_smb.h"
#include <kstandarddirs.h>
#include <unistd.h>
#include <QByteArray>
#include <QDir>
#include <QProcess>
#include <kshell.h>
void SMBSlave::special( const QByteArray & data)
{
kDebug(KIO_SMB)<<"Smb::special()";
int tmp;
QDataStream stream(data);
stream >> tmp;
//mounting and umounting are both blocking, "guarded" by a SIGALARM in the future
switch (tmp)
{
case 1:
case 3:
{
QString remotePath, mountPoint, user;
stream >> remotePath >> mountPoint;
QStringList sl=remotePath.split('/');
QString share,host;
if (sl.count()>=2)
{
host=sl.at(0).mid(2);
share=sl.at(1);
kDebug(KIO_SMB)<<"special() host -"<< host <<"- share -" << share <<"-";
}
remotePath.replace('\\', '/'); // smbmounterplugin sends \\host/share
kDebug(KIO_SMB) << "mounting: " << remotePath.toLocal8Bit() << " to " << mountPoint.toLocal8Bit();
if (tmp==3) {
if (!KStandardDirs::makeDir(mountPoint)) {
error(KIO::ERR_COULD_NOT_MKDIR, mountPoint);
return;
}
}
SMBUrl smburl(KUrl("smb:///"));
smburl.setHost(host);
smburl.setPath('/' + share);
if ( !checkPassword(smburl) )
{
finished();
return;
}
// using smbmount instead of "mount -t smbfs", because mount does not allow a non-root
// user to do a mount, but a suid smbmnt does allow this
QProcess proc;
proc.setProcessChannelMode(QProcess::SeparateChannels);
QStringList procArgs;
QString options;
if ( smburl.user().isEmpty() )
{
user = "guest";
options = "guest";
}
else
{
options = "username=" + smburl.user();
user = smburl.user();
if ( ! smburl.pass().isEmpty() )
options += ",password=" + smburl.pass();
}
// TODO: check why the control center uses encodings with a blank char, e.g. "cp 1250"
//if ( ! m_default_encoding.isEmpty() )
//options += ",codepage=" + KShell::quoteArg(m_default_encoding);
procArgs << remotePath;
procArgs << mountPoint;
procArgs << "-o" << options;
proc.start("smbmount", procArgs);
if (!proc.waitForFinished())
{
error(KIO::ERR_CANNOT_LAUNCH_PROCESS,
"smbmount"+i18n("\nMake sure that the samba package is installed properly on your system."));
return;
}
QString mybuf = QString::fromLocal8Bit(proc.readAllStandardOutput());
QString mystderr = QString::fromLocal8Bit(proc.readAllStandardError());
kDebug(KIO_SMB) << "mount exit " << proc.exitCode()
<< "stdout:" << mybuf << endl << "stderr:" << mystderr << endl;
if (proc.exitCode() != 0)
{
error( KIO::ERR_COULD_NOT_MOUNT,
i18n("Mounting of share \"%1\" from host \"%2\" by user \"%3\" failed.\n%4",
share, host, user, mybuf + '\n' + mystderr));
return;
}
finished();
}
break;
case 2:
case 4:
{
QString mountPoint;
stream >> mountPoint;
QProcess proc;
proc.setProcessChannelMode(QProcess::SeparateChannels);
proc.start("smbumount", QStringList() << mountPoint);
if ( !proc.waitForFinished() )
{
error(KIO::ERR_CANNOT_LAUNCH_PROCESS,
"smbumount"+i18n("\nMake sure that the samba package is installed properly on your system."));
return;
}
QString mybuf = QString::fromLocal8Bit(proc.readAllStandardOutput());
QString mystderr = QString::fromLocal8Bit(proc.readAllStandardError());
kDebug(KIO_SMB) << "smbumount exit " << proc.exitCode()
<< "stdout:" << mybuf << endl << "stderr:" << mystderr << endl;
if (proc.exitCode() != 0)
{
error(KIO::ERR_COULD_NOT_UNMOUNT,
i18n("Unmounting of mountpoint \"%1\" failed.\n%2",
mountPoint, mybuf + '\n' + mystderr));
return;
}
if ( tmp == 4 )
{
bool ok;
QDir dir(mountPoint);
dir.cdUp();
ok = dir.rmdir(mountPoint);
if ( ok )
{
QString p=dir.path();
dir.cdUp();
ok = dir.rmdir(p);
}
if ( !ok )
{
error(KIO::ERR_COULD_NOT_RMDIR, mountPoint);
return;
}
}
finished();
}
break;
default:
break;
}
finished();
}
#include "moc_kio_smb.cpp"