Skip to content

Commit a5a99c1

Browse files
reddevillgdengbo11
authored andcommitted
fix: fix fd marshaling in QtDBus
Call Ping() to trigger QtDBus's file descriptor passing capability update. Signed-off-by: reddevillg <reddevillg@gmail.com>
1 parent 8275c99 commit a5a99c1

1 file changed

Lines changed: 30 additions & 25 deletions

File tree

  • libs/linglong/src/linglong/cli

libs/linglong/src/linglong/cli/cli.cpp

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
#include <QDBusInterface>
5454
#include <QDBusReply>
55+
#include <QDBusUnixFileDescriptor>
5556
#include <QEventLoop>
5657
#include <QFileInfo>
5758
#include <QProcess>
@@ -463,43 +464,41 @@ utils::error::Result<api::dbus::v1::PackageManager *> Cli::getPkgMan()
463464
return this->pkgMan.get();
464465
}
465466

467+
QString service;
468+
QDBusConnection pkgManConn{ "ll-package-manager" };
469+
466470
if (this->peerMode) {
467471
LogW("some subcommands will failed in --no-dbus mode.");
468472
const auto pkgManAddress = QString("unix:path=/tmp/linglong-package-manager.socket");
469473

470-
const auto &pkgManConn =
471-
QDBusConnection::connectToPeer(pkgManAddress, "ll-package-manager");
474+
pkgManConn = QDBusConnection::connectToPeer(pkgManAddress, "ll-package-manager");
472475
if (!pkgManConn.isConnected()) {
473476
return LINGLONG_ERR(fmt::format("Failed to connect to ll-package-manager: {}",
474477
pkgManConn.lastError().message().toStdString()));
475478
}
476-
477-
this->pkgMan =
478-
std::make_unique<api::dbus::v1::PackageManager>("",
479-
"/org/deepin/linglong/PackageManager1",
480-
pkgManConn,
481-
QCoreApplication::instance());
482479
} else {
483-
const auto &pkgManConn = QDBusConnection::systemBus();
484-
485-
auto peer = linglong::api::dbus::v1::DBusPeer("org.deepin.linglong.PackageManager1",
486-
"/org/deepin/linglong/PackageManager1",
487-
pkgManConn);
488-
auto reply = peer.Ping();
489-
reply.waitForFinished();
490-
if (!reply.isValid()) {
491-
return LINGLONG_ERR(
492-
fmt::format("Failed to activate org.deepin.linglong.PackageManager1: {}",
493-
reply.error().message().toStdString()));
494-
}
480+
service = "org.deepin.linglong.PackageManager1";
481+
pkgManConn = QDBusConnection::systemBus();
482+
}
495483

496-
this->pkgMan =
497-
std::make_unique<api::dbus::v1::PackageManager>("org.deepin.linglong.PackageManager1",
498-
"/org/deepin/linglong/PackageManager1",
499-
pkgManConn,
500-
QCoreApplication::instance());
484+
auto peer = linglong::api::dbus::v1::DBusPeer(service,
485+
"/org/deepin/linglong/PackageManager1",
486+
pkgManConn);
487+
auto reply = peer.Ping();
488+
reply.waitForFinished();
489+
if (!reply.isValid()) {
490+
const auto message = this->peerMode
491+
? "Failed to initialize peer connection: {}"
492+
: "Failed to activate org.deepin.linglong.PackageManager1: {}";
493+
return LINGLONG_ERR(fmt::format(message, reply.error().message().toStdString()));
501494
}
502495

496+
this->pkgMan =
497+
std::make_unique<api::dbus::v1::PackageManager>(service,
498+
"/org/deepin/linglong/PackageManager1",
499+
pkgManConn,
500+
QCoreApplication::instance());
501+
503502
auto ret = this->initPkgManSignals();
504503
if (!ret) {
505504
this->pkgMan.reset();
@@ -1131,6 +1130,12 @@ int Cli::installFromFile(const QFileInfo &fileInfo,
11311130
return -1;
11321131
}
11331132

1133+
auto caps = (*pkgMan)->connection().connectionCapabilities();
1134+
if (!(caps & QDBusConnection::UnixFileDescriptorPassing)) {
1135+
this->printer.printErr(LINGLONG_ERRV("peer connection does not support Unix FD passing"));
1136+
return -1;
1137+
}
1138+
11341139
auto pendingReply = (*pkgMan)->InstallFromFile(dbusFileDescriptor,
11351140
fileInfo.suffix(),
11361141
common::serialize::toQVariantMap(commonOptions));

0 commit comments

Comments
 (0)