3

My goal: Is to monitor the state of my network interface (mainly wireless) from my firmware (in C) by monitoring the wpa_supplicant through the D-Bus interfaces. I would like to stick with C and low-level API of D-bus.

What I have so far

  1. I've written a small program in C, copied most of the code as is from this SO user.
  2. I've gone through all possible tutorials on D-Bus and wpa_supplicant
  3. My program compiles and works properly. However it does not produce the expected output.

Here's my code:

#include <stdio.h>                                                                                                                                                                                  
#include <dbus/dbus.h>

#define WPAS_DBUS_SERVICE   "fi.epitest.hostap.WPASupplicant"
#define WPAS_DBUS_PATH      "/fi/epitest/hostap/WPASupplicant"
#define WPAS_DBUS_INTERFACE "fi.epitest.hostap.WPASupplicantAAA"

#define WPAS_DBUS_PATH_INTERFACES   WPAS_DBUS_PATH "/Interfaces"
#define WPAS_DBUS_IFACE_INTERFACE   WPAS_DBUS_INTERFACE ".Interfaces"

#define WPAS_DBUS_NETWORKS_PART "Networks"
#define WPAS_DBUS_IFACE_NETWORK WPAS_DBUS_INTERFACE ".Network"

#define WPAS_DBUS_BSSIDS_PART   "BSSIDs"
#define WPAS_DBUS_IFACE_BSSID   WPAS_DBUS_INTERFACE ".BSSID"

int ret;
char signalDesc[1024];     // Signal description as string

// Signal handling
signal(SIGKILL, stopLoop);
signal(SIGTERM, stopLoop);

void loop(DBusConnection* conn)

{
DBusMessage* msg;
DBusMessageIter args;
DBusMessageIter subArgs;
int argType;
int i;
int buffSize = 1024;
char strValue[buffSize];
const char* member = 0;


while (1)
{
// non blocking read of the next available message
dbus_connection_read_write(conn, 0);
msg = dbus_connection_pop_message(conn);

// loop again if we haven't read a message
if (!msg)
{
printf("No message received, waiting a little ...\n");
sleep(1);
continue;
}
else printf("Got a message, will analyze it ...\n");

// Print the message member
printf("Got message for interface %s\n",
dbus_message_get_interface(msg));
member = dbus_message_get_member(msg);
if(member) printf("Got message member %s\n", member);

// Check has argument

if (!dbus_message_iter_init(msg, &args))
{       
printf("Message has no argument\n");
continue;
}
else
{
// Go through arguments
while(1)
{
argType = dbus_message_iter_get_arg_type(&args);

if (argType == DBUS_TYPE_STRING)
{
printf("Got string argument, extracting ...\n");
char* str = NULL;
dbus_message_iter_get_basic(&args, &str);
printf("Received string: \n %s \n",str);

}   
else
printf("Arg type not implemented yet !\n");

if(dbus_message_iter_has_next(&args))
dbus_message_iter_next(&args);
else break;
}   
printf("No more arguments!\n");
}

// free the message
dbus_message_unref(msg);
}       
}           

int main()
{

DBusConnection *connection;

DBusError error;

char *name = "org.share.linux";

dbus_error_init(&error);

connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);

if ( dbus_error_is_set(&error) )

{

printf("Error connecting to the daemon bus: %s",error.message);

dbus_error_free(&error);

return 1;

}

// request a name on the bus

ret = dbus_bus_request_name(connection, WPAS_DBUS_SERVICE, 0, &error);
if (dbus_error_is_set(&error))
{
printf(stderr, "Name Error (%s)\n", error.message);
dbus_error_free(&error);
}

/* Connect to signal */
// Interface signal ..
printf(signalDesc, "type='signal',interface='%s'",WPAS_DBUS_IFACE_INTERFACE);
dbus_bus_add_match(connection, signalDesc, &error);
dbus_connection_flush(connection);
if (dbus_error_is_set(&error))
{
fprintf(stderr, "Match Error (%s)\n", error.message);
return 1;
}

// Do main loop
loop(connection);
dbus_connection_close(connection);

return 0;

}  

List of D-bus services on my BBB

enter image description here

Output

enter image description here

Some pointers

  1. I would like to catch the signals as shown in the D-Bus API of wpa_supplicant.
  2. Some things I would like to do -- see when a wireless interface say wlan0 is enabled, connects to access point etc. Also capability to set AP and stuff.
  3. Its catching signal from other interfaces for which no match has been added.
  4. I run this program and change the state of the networking interfaces but I dont get any signals. Also, I dont know if requesting name on the bus is necessary as I'm just listening.

What's the possible issue here? Any pointers will be really helpful.

Community
  • 1
  • 1
am3
  • 681
  • 2
  • 12
  • 30
  • Did you check if there are any signals sent by wpa_supplicant at all? You could check with dbus-monitor. You could also check if your add_match calls are correct that way. – Lasse Meyer Jul 07 '16 at 11:14

0 Answers0