I am looking for an example c code to measure the amount of time its taking to send data between two simple applications without using any glib bindings, I see in many posts that http://www.matthew.ath.cx/misc/dbus has an example but the link does not exist now.
My code sends without giving any error but the receive app does not receive anything, also attached the service.conf file. Got this code from some other websites:
////////////////////////////Sender Code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
#include <dbus/dbus.h>
#define false 0
#define true 1
#define bool char
#define DERR_SHOW_CLEAN(error) \
if (dbus_error_is_set(&(error))) \
{ \
printf("error [%s:%d] %s\n %s\n", \
__FILE__, __LINE__, error.name, error.message); \
dbus_error_free(&(error)); \
}
int main() {
dbus_bool_t rc;
DBusError error;
DBusConnection* conn;
int ret;
char* sigvalue = "Test";
// initialise the errors
dbus_error_init(&error); //TODO
conn = dbus_connection_open("unix:path=/dev/shmem/dbus_service_socket", &error);
DERR_SHOW_CLEAN(error);
dbus_uint32_t serial = 0; // unique number to associate replies with requests
DBusMessage* msg;
DBusMessageIter args;
rc = dbus_bus_register(conn, &error);
DERR_SHOW_CLEAN(error);
// create a signal and check for errors
msg = dbus_message_new_signal("/org/freedesktop/DBus", // object name of the signal
"org.freedesktop.DBus", // interface name of the signal
"Test"); // name of the signal
if (NULL == msg)
{
fprintf(stderr, "Message Null\n");
}
// append arguments onto signal
dbus_message_iter_init_append(msg, &args);
if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &sigvalue)) {
fprintf(stderr, "Out Of Memory!\n");
}
while(1)
{
// send the message and flush the connection
if (!dbus_connection_send(conn, msg, &serial)) {
fprintf(stderr, "Out Of Memory!\n");
break;
}
else
{
sleep(5);
}
}
dbus_connection_flush(conn);
// free the message
dbus_message_unref(msg);
return 0;
}
////////////////////////////Receiver Code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <dbus/dbus.h>
#define false 0
#define true 1
#define bool char
#define DERR_SHOW_CLEAN(error) \
if (dbus_error_is_set(&(error))) \
{ \
printf("error [%s:%d] %s\n %s\n", \
__FILE__, __LINE__, error.name, error.message); \
dbus_error_free(&(error)); \
}
int main()
{
DBusError err;
DBusConnection* conn;
DBusMessage* msg;
DBusMessageIter args;
int ret;
char* sigvalue;
dbus_bool_t rc;
// initialise the errors
dbus_error_init(&err); //TODO
conn = dbus_connection_open("unix:path=/dev/shmem/dbus_service_socket", &err);
DERR_SHOW_CLEAN(err);
rc = dbus_bus_register(conn, &err);
DERR_SHOW_CLEAN(err);
while (true) {
// non blocking read of the next available message
dbus_connection_read_write(conn, 0);
msg = dbus_connection_pop_message(conn);
printf("Got Si3\n");
// loop again if we haven't read a message
if (NULL == msg) {
sleep(5);
continue;
}
// check if the message is a signal from the correct interface
// and with the correct name
if (dbus_message_is_signal(msg, "org.freedesktop.DBus", "Test")) {
// read the parameters
printf("Got Si4\n");
if (!dbus_message_iter_init(msg, &args))
fprintf(stderr, "Message has no arguments!\n");
else if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&args))
fprintf(stderr, "Argument is not string!\n");
else {
dbus_message_iter_get_basic(&args, &sigvalue);
printf("Got Signal with value %s\n", sigvalue);
}
}
else
{
printf("Got Signal with type %s\n", dbus_message_get_sender(msg));
}
// free the message
dbus_message_unref(msg);
}
}
/////service.conf file contents which is used while dbus-daemon starts
<!-- This configuration file controls the systemwide message bus.
Add a system-local.conf and edit that rather than changing this
file directly. -->
<!-- Note that there are any number of ways you can hose yourself
security-wise by screwing up this file; in particular, you
probably don't want to listen on any more addresses, add any more
auth mechanisms, run as a different user, etc. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Our well-known bus type, do not change this -->
<type>system</type>
<!-- Run as special user -->
<user>root</user>
<!-- Fork into daemon mode -->
<fork/>
<!-- Write a pid file -->
<pidfile>/dev/shmem/dbus_service.pid</pidfile>
<!-- Enable logging to syslog -->
<syslog/>
<!-- allow everyone -->
<allow_anonymous />
<!-- Only allow socket-credentials-based authentication -->
<!-- <auth>EXTERNAL</auth>-->
<!-- Only listen on a local socket. (abstract=/path/to/socket
means use abstract namespace, don't really create filesystem
file; only Linux supports this. Use path=/whatever on other
systems.) -->
<listen>unix:path=/dev/shmem/dbus_service_socket</listen>
<policy context="default">
<!-- All users can connect to system bus -->
<allow user="*"/>
<allow group="*"/>
<allow own="*"/>
<!-- Signals and reply messages (method returns, errors) are allowed
by default -->
<allow send_type="signal"/>
<allow send_type="method_call" log="true"/>
<allow send_requested_reply="true" send_type="method_return"/>
<allow send_requested_reply="true" send_type="error"/>
<!-- All messages may be received by default -->
<allow receive_type="method_call"/>
<allow receive_type="method_return"/>
<allow receive_type="error"/>
<allow receive_type="signal"/>
<allow receive_interface="org.freedesktop.DBus.Introspectable"/>
<allow send_destination="*"/>
<allow receive_sender="*" />
<allow receive_path="/org/freedesktop/DBus"/>
<!-- Allow anyone to talk to the message bus -->
<allow send_destination="org.freedesktop.DBus"/>
</policy>
<!-- Config files are placed here that among other things, punch
holes in the above policy for specific services. -->
<includedir>service.d</includedir>
</busconfig>
call dbus_bus_add_match before entering while loop in receive main function, it works reference example: at https://github.com/Jeshwanth/dbus-1/blob/master/dbus-1/dbus-example.c