29 #include <sys/types.h>
31 #include <QtCore/QFile>
32 #include <QtCore/QTimer>
33 #include <QtDBus/QtDBus>
34 #include <QtCore/QProcess>
54 #define SLAVE_CONNECTION_TIMEOUT_MIN 2
61 #define SLAVE_CONNECTION_TIMEOUT_MAX 10
63 #define SLAVE_CONNECTION_TIMEOUT_MAX 3600
74 SlavePrivate(
const QString &protocol) :
76 m_slaveProtocol(protocol),
77 slaveconnserver(
new KIO::ConnectionServer),
83 contact_started(time(0)),
87 slaveconnserver->listenForRemote();
88 if ( !slaveconnserver->isListening() )
89 kWarning() <<
"Connection server not listening, could not connect";
93 delete slaveconnserver;
101 KIO::ConnectionServer *slaveconnserver;
107 time_t contact_started;
116 d->slaveconnserver->setNextPendingConnection(d->connection);
117 d->slaveconnserver->deleteLater();
118 d->slaveconnserver = 0;
120 connect(d->connection, SIGNAL(readyRead()), SLOT(
gotInput()));
128 if (d->connection->isConnected())
131 kDebug(7002) <<
"slave failed to connect to application pid=" << d->m_pid
132 <<
" protocol=" << d->m_protocol;
133 if (d->m_pid && (::
kill(d->m_pid, 0) == 0))
135 int delta_t = (int) difftime(time(0), d->contact_started);
136 kDebug(7002) <<
"slave is slow... pid=" << d->m_pid <<
" t=" << delta_t;
143 kDebug(7002) <<
"Houston, we lost our slave, pid=" << d->m_pid;
144 d->connection->close();
147 if (!d->m_host.isEmpty())
148 arg +=
"://"+d->m_host;
149 kDebug(7002) <<
"slave died pid = " << d->m_pid;
164 d->slaveconnserver->setParent(
this);
165 d->connection =
new Connection(
this);
166 connect(d->slaveconnserver, SIGNAL(newConnection()), SLOT(
accept()));
178 return d->m_protocol;
190 return d->m_slaveProtocol;
220 d->m_idleSince = time(0);
245 if (!d->m_refCount) {
246 d->connection->disconnect(
this);
255 if (!d->m_idleSince) {
258 return time_t(difftime(time(0), d->m_idleSince));
276 if (!d->sslMetaData.isEmpty()) {
300 QDataStream stream( &data, QIODevice::WriteOnly );
303 d->connection->close();
317 d->connection->suspend();
323 d->connection->resume();
329 return d->connection->suspended();
335 d->connection->send(cmd, arr);
346 d->connection->close();
349 if (!d->m_host.isEmpty())
350 arg +=
"://"+d->m_host;
351 kDebug(7002) <<
"slave died pid = " << d->m_pid;
365 kDebug(7002) <<
"killing slave pid" << d->m_pid
366 <<
"(" <<
QString(d->m_protocol) +
"://" + d->m_host <<
")";
370 ::kill(d->m_pid, SIGTERM);
372 ::kill(d->m_pid, SIGKILL);
386 d->sslMetaData.clear();
389 QDataStream stream( &data, QIODevice::WriteOnly );
390 stream << d->m_host << d->m_port << d->m_user << d->m_passwd;
391 d->connection->send(
CMD_HOST, data );
397 d->sslMetaData.clear();
398 d->m_host =
"<reset>";
405 QDataStream stream( &data, QIODevice::WriteOnly );
412 kDebug(7002) <<
"createSlave" << protocol <<
"for" << url;
414 if (protocol ==
"data")
417 QString slaveAddress = slave->d_func()->slaveconnserver->address();
423 static bool bForkSlaves = !qgetenv(
"KDE_FORK_SLAVES").isEmpty();
429 if (reply.isValid() && getuid() != reply)
438 error_text =
i18n(
"Unknown protocol '%1'.", protocol);
443 KLibrary lib(_name, KGlobal::mainComponent());
445 if (lib_path.isEmpty())
447 error_text =
i18n(
"Can not find io-slave for protocol '%1'.", protocol);
454 kDebug() <<
"kioslave" <<
", " << lib_path <<
", " << protocol <<
", " <<
QString() <<
", " << slaveAddress;
464 QDBusReply<int> reply = klauncher->requestSlave(protocol, url.host(), slaveAddress, errorStr);
465 if (!reply.isValid()) {
466 error_text =
i18n(
"Cannot talk to klauncher: %1", klauncher->lastError().message() );
474 error_text =
i18n(
"Unable to create io-slave:\nklauncher said: %1", errorStr);
488 if (protocol ==
"data")
491 QString slaveAddress = slave->d_func()->slaveconnserver->address();
493 if (!reply.isValid()) {