Reputation: 81
void device_added()
{
printf("Added \n");
g_main_loop_quit (loop);
}
void device_removed()
{
printf("Removed\n");
g_main_loop_quit (loop);
}
int
main (int argc, char **argv)
{
DBusGConnection *connection;
DBusMessage* message;
GError *error;
DBusGProxy *proxy;
char **name_list;
char **name_list_ptr;
gchar *m1;
gchar *m2;
g_type_init ();
error = NULL;
connection = dbus_g_bus_get(DBUS_BUS_SYSTEM,NULL);
if (connection == NULL)
{
g_printerr ("Failed to open connection to bus: %s\n",
error->message);
g_error_free (error);
exit (1);
}
/* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
proxy=dbus_g_proxy_new_for_name(connection,"org.freedesktop.UDisks","/org/freedesktop/UDisks","org.freedesktop.UDisks");
if(proxy == NULL)
{
g_printerr ("Failed To Create A proxy...: %s\n", error->message);
g_error_free (error);
exit(1);
}
else
printf("Probably got a connection to the correct interface...\n");
m1=g_cclosure_marshal_VOID__STRING;
m2=g_cclosure_marshal_VOID__STRING;
dbus_g_object_register_marshaller(m1,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INVALID);
dbus_g_object_register_marshaller(m2,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INVALID);
dbus_g_proxy_add_signal(proxy,"DeviceAdded",G_TYPE_INVALID);
dbus_g_proxy_add_signal(proxy,"DeviceRemoved",G_TYPE_INVALID);
dbus_g_proxy_connect_signal(proxy,"DeviceAdded",(GCallback)device_added,NULL,NULL);
dbus_g_proxy_connect_signal(proxy,"DeviceRemoved",(GCallback)device_removed,NULL,NULL);
loop=g_main_loop_new(NULL,FALSE);
g_main_loop_run (loop);
return 0;
}
I want to detect the usb events, I am using DeviceAdded and DeviceRemoved signals from org.freedesktop.UDisks interface. But device_added or device_removed is not geting called, anybody can you please tell me what's wrong with the above code ?
Upvotes: 2
Views: 2129
Reputation: 81
I got it working on ARM also after starting both
dbus-daemon --system
and
/usr/libexec/udisks-daemon
Upvotes: 1
Reputation: 81
/*
Compile using the command
* gcc -o dbus-usb dbus-usb.c `pkg-config --libs --cflags dbus-glib-1`
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
#include <glib.h>
#include <glib-object.h>
static GMainLoop *loop;
static void
device_added (DBusGProxy *proxy,
char *ObjectPath[],
char *word_eol[],
guint hook_id,
guint context_id,
gpointer user_data)
{
g_debug("\nAdded a New Device:\nObjectPath: %s\nhook_id: %d\ncontext_id: %d\nuser_data: %d\n", (char*)ObjectPath, hook_id, context_id, (int)user_data);
}
static void
device_removed (DBusGProxy *proxy,
char *ObjectPath[],
char *word_eol[],
guint hook_id,
guint context_id,
gpointer user_data)
{
g_debug("\nRemoved Device\nObjectPath: %s\nhook_id: %d\ncontext_id: %d\nuser_data: %d\n", (char*)ObjectPath, hook_id, context_id, (int)user_data);
}
int
main (int argc, char **argv)
{
DBusGConnection *connection;
DBusMessage* message;
GError *error;
DBusGProxy *proxy;
gchar *m1;
gchar *m2;
char *object_path;
GPtrArray* ret;
g_type_init ();
error = NULL;
connection = dbus_g_bus_get(DBUS_BUS_SYSTEM,NULL);
if (connection == NULL)
{
g_printerr ("Failed to open connection to bus: %s\n",
error->message);
g_error_free (error);
exit (1);
}
else
{
printf("Got a connection to DBUS_BUS_SYSTEM\n");
}
/* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
proxy=dbus_g_proxy_new_for_name(connection,"org.freedesktop.UDisks","/org/freedesktop/UDisks","org.freedesktop.UDisks");
if(proxy == NULL)
{
g_printerr ("Failed To Create A proxy...: %s\n", error->message);
g_error_free (error);
exit(1);
}
else
printf("Probably got a connection to the correct interface...\n");
//It works for me without marsheller register, add and connect to the signals directly
m1=g_cclosure_marshal_VOID__STRING;
m2=g_cclosure_marshal_VOID__STRING;
dbus_g_object_register_marshaller(m1,G_TYPE_NONE,G_TYPE_STRING,G_TYPE_INVALID);
dbus_g_object_register_marshaller(m2,G_TYPE_NONE,G_TYPE_STRING,G_TYPE_INVALID);
dbus_g_proxy_add_signal(proxy,"DeviceAdded",DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(proxy,"DeviceAdded",(GCallback)device_added,NULL,NULL);
dbus_g_proxy_add_signal(proxy,"DeviceRemoved",DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
dbus_g_proxy_connect_signal(proxy,"DeviceRemoved",(GCallback)device_removed,NULL,NULL);
loop=g_main_loop_new(NULL,FALSE);
g_main_loop_run (loop);
g_error_free (error);
return 0;
}
ABove code is working and able to detect the usb events on Ubuntu pc, major change being the DBUS_TYPE_G_OBJECT_PATH parameter to dbus_g_proxy_add_signal function instead of G_TYPE_STRING.
But if I cross compile for an ARM architecture and execute the same on ARM board, i am facing the same problem again
Upvotes: 3