Connecting to systemd DBUS signals using gdbus-codegen

VJ-

I am not able to receive systemd DBus signals when using gdbus-codegen generated manager proxy. But I am able to successfully call methods provided by systemd over DBus.

I searched online and looked these links without much success. There aren't much examples on how to do it when gdbus-codegen is used for systemd API.

Here is what I did along with code snippets.

1) I generated systemd introspection and used that XML as input to gdbus-codegen.

...snip

<interface name="org.freedesktop.systemd1.Manager">
<signal name="JobRemoved">
<arg type="u"/> <arg type="o"/> <arg type="s"/> <arg type="s"/>
</signal>

...snip

2) Wrote my client code to use C APIs generated by gdbus-codegen and created a manager proxy. (Everything is on system bus).

SystemdManager *systemdProxy = systemd_manager_proxy_new_for_bus_sync(
    G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
    "org.freedesktop.systemd1", "/org/freedesktop/systemd1",
    NULL, error);

3) Define a signal handler

static void on_done(GDBusProxy *proxy,
        gchar *sender_name,
        gchar *signal_name,
        GVariant *parameters,
        gpointer user_data)
{
    LOG_ERROR("on_done");
}

4) Connected a signal handler to that proxy for JobRemoved signal.

if (g_signal_connect(systemdProxy, "job-removed",
                     G_CALLBACK(on_done), NULL) <= 0 )
{
    LOG_ERROR("Failed to connect to signal job-removed");
}

5) Used the proxy to start a systemd service. This returns success and I could see the unit start and run for a second or two and terminate.

ret = systemd_manager_call_start_unit_sync(
    systemdProxy, unit_name, unit_mode, &job_obj,
    NULL, &error);

6) systemd generates a JobRemoved signal. dbus-monitor shows it.

signal sender=:1.0 -> dest=(null destination) serial=11931
        path=/org/freedesktop/systemd1;
        interface=org.freedesktop.systemd1.Manager;
        member=JobRemoved
   uint32 7009
   object path "/org/freedesktop/systemd1/job/7009"
   string "mysample.service"
   string "done"

7) My signal handler never gets called. (Everything uses system bus, there are no other buses). I have tried various strings for detailed_signal 2nd parameter for g_signal_connect (like: JobRemoved, job_removed, ::job-removed, some are not accepted by g_signal_connect).

Any help is greatly appreciated!

VJ-

The solution was to use a glib event loop in my program. My program did not have a running GMainLoop which was necessary to get any callbacks from glib. This is not an elegant way but for various reasons I decided to spawn a new thread which would then block on g_main_loop_run. Here is how it looks like.

void *event_loop_thread(void *unused) {
    GMainLoop *loop = g_main_loop_new(NULL, 0);
    g_main_loop_run(loop);
}
int main() {
    // snip
    pthread_create(&thread_id, NULL, event_loop_thread, NULL);
    // do steps 2 to 6, and at step 7 signal handler is called
}

Also I had to fix my signal handler signature to be compatible with the signal to receive meaningful parameters.

static void on_done(SystemdManager *manager,
        guint32 job_id,
        gchar *job_obj,
        gchar *unit_name,
        gchar *status)
{
    LOG_ERROR("on_done");
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用gdbus-codegen连接到系统DBUS信号

来自分类Dev

在gjs中使用GDBus调用DBus方法,没有输出?

来自分类Dev

启动 dbus 服务的 systemd 服务

来自分类Dev

DBUS 调用失败:GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown

来自分类Dev

在运行时使用gdbus的systemd资源控制SetProperties

来自分类Dev

dbus和systemd / user遇到问题

来自分类Dev

dbus和systemd / user遇到问题

来自分类Dev

未启动 gdm:无法获取当前显示配置状态:GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner

来自分类Dev

为什么带有systemd dbus超时的gvfs?

来自分类Dev

通过python和dbus启动用户systemd服务

来自分类Dev

可能与 systemd 或 dbus 相关的意外错误 - 如何诊断?

来自分类Dev

Systemd DBus API 返回未为禁用服务加载的服务

来自分类Dev

如何允许非root用户的systemd服务使用dbus进行BLE操作

来自分类Dev

运行VLC的Systemd + Python脚本不允许dbus控件访问VLC

来自分类Dev

通过systemd激活单元'dbus-org.freedesktop.resolve1.service'失败:找不到单元dbus-org.freedesktop.resolve1.service

来自分类Dev

LXDE中的GDBus / PolicyKit错误

来自分类Dev

GLib和GDBus的静态分析工具

来自分类Dev

在gdbus内省xml中添加元组

来自分类Dev

如何使用gdbus设置IP地址

来自分类Dev

Error connecting to FTP server using ftp4j in android

来自分类Dev

Connecting to MYSQLi through Terminal in Mac OS using MAMP

来自分类Dev

Connecting two web application through API using SDK

来自分类Dev

Connecting multiple wireless devices to one main device using bluetooth

来自分类Dev

SWAGGER招摇,CODEGEN配置

来自分类Dev

emacs中的dbus错误

来自分类Dev

为什么需要dbus?

来自分类Dev

通过 dbus 调节音量

来自分类Dev

gdbus:信号发射后立即释放信号参数是否安全?

来自分类Dev

如何将{sv}参数传递给gdbus?

Related 相关文章

  1. 1

    使用gdbus-codegen连接到系统DBUS信号

  2. 2

    在gjs中使用GDBus调用DBus方法,没有输出?

  3. 3

    启动 dbus 服务的 systemd 服务

  4. 4

    DBUS 调用失败:GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown

  5. 5

    在运行时使用gdbus的systemd资源控制SetProperties

  6. 6

    dbus和systemd / user遇到问题

  7. 7

    dbus和systemd / user遇到问题

  8. 8

    未启动 gdm:无法获取当前显示配置状态:GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner

  9. 9

    为什么带有systemd dbus超时的gvfs?

  10. 10

    通过python和dbus启动用户systemd服务

  11. 11

    可能与 systemd 或 dbus 相关的意外错误 - 如何诊断?

  12. 12

    Systemd DBus API 返回未为禁用服务加载的服务

  13. 13

    如何允许非root用户的systemd服务使用dbus进行BLE操作

  14. 14

    运行VLC的Systemd + Python脚本不允许dbus控件访问VLC

  15. 15

    通过systemd激活单元'dbus-org.freedesktop.resolve1.service'失败:找不到单元dbus-org.freedesktop.resolve1.service

  16. 16

    LXDE中的GDBus / PolicyKit错误

  17. 17

    GLib和GDBus的静态分析工具

  18. 18

    在gdbus内省xml中添加元组

  19. 19

    如何使用gdbus设置IP地址

  20. 20

    Error connecting to FTP server using ftp4j in android

  21. 21

    Connecting to MYSQLi through Terminal in Mac OS using MAMP

  22. 22

    Connecting two web application through API using SDK

  23. 23

    Connecting multiple wireless devices to one main device using bluetooth

  24. 24

    SWAGGER招摇,CODEGEN配置

  25. 25

    emacs中的dbus错误

  26. 26

    为什么需要dbus?

  27. 27

    通过 dbus 调节音量

  28. 28

    gdbus:信号发射后立即释放信号参数是否安全?

  29. 29

    如何将{sv}参数传递给gdbus?

热门标签

归档