Использование системной шины DBus
Доброго времени суток! Есть необходимость задействовать DBus для связи приложений, запущенных от разных юзверей (root<->user). С sessionBus проблем нет, а вот с systemBus наблюдается очень плохая картина. И то, и другое на Qt.
Прототип сервера:
#include <QtCore/QCoreApplication>
#include <QtDBus/QtDBus>
#include "apserver.h"
#include <QDebug>
#define _NameObject_ "com.wifi.hostapd.ap.server"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
APServer ServerAP;
QDBusConnection connection = QDBusConnection::systemBus();
if(!connection.isConnected())
{
qDebug() << "Unconnected. Exit.";
return -2;
}
bool ret = connection.registerService(_NameObject_);
if(ret)
qDebug() << "Registred 1";
else {
qDebug() << "Unregistred 1. Exit.";
return -1;
}
ret = connection.registerObject("/", &ServerAP, QDBusConnection::ExportAllSlots);
if(ret)
qDebug() << "Registred 2";
return a.exec();
}
#ifndef APSERVER_H
#define APSERVER_H
#include "traffic.h"
class APServer : public Traffic
{
Q_OBJECT
public:
APServer();
signals:
public slots:
Q_INVOKABLE void test(QString a);
};
#endif // APSERVER_H
Прототип клиента:
#include <QtGui/QApplication>
#include "apclient.h"
#include <QDebug>
#include <QtDBus>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if(!QDBusConnection::systemBus().isConnected()) {
qDebug() << "Error connection to DBus";
return 1;
}
QDBusInterface iface("com.wifi.hostapd.ap.server", "/", "", QDBusConnection::systemBus());
iface.call("test", "test from client");
//APClient w;
//w.show();
return a.exec();
}
В файле /etc/dbus-1/system.d/com.wifi.hostapd.ap.server.conf сейчас такое содержимое (по образу и подобию skype.conf из того же каталога):
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- ../system.conf have denied everything, so we just punch some holes -->
<policy context="default">
<allow own="com.wifi.hostapd.ap.server"/>
<allow send_destination="com.wifi.hostapd.ap.server"/>
<allow receive_sender="com.wifi.hostapd.ap.server"/>
<allow send_path="/"/>
</policy>
</busconfig>
Результат: тишина. qdbusviewer при попытке обратиться к объекту выдаёт:
Error: Call to object / at com.wifi.hostapd.ap.server: org.freedesktop.DBus.Error.AccessDenied (Rejected send message, 1 matched rules; type=«method_call», sender=":1.72" (uid=1000 pid=19780 comm=«qdbusviewer ») interface=«org.freedesktop.DBus.Introspectable» member=«Introspect» error name="(unset)" requested_reply=«0» destination=«com.wifi.hostapd.ap.server» (uid=1000 pid=18059 comm="./WiFi-Hostapd-AP-Server ")) failed
Система:
1. DBus: D-Bus Message Bus Daemon 1.4.18 Copyright (C) 2002, 2003 Red Hat, Inc., CodeFactory AB, and others This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2. OS: Ubuntu 12.04.2 x64
3. Qt: версия 4.8.1.
Что посоветуете? Заранее, спасибо!
PS, к сожалению, все примеры в сети только для sessionBus, потому не подходят (да, читал. И по ним же разбирался, что есть что).