Re: [Bluez-devel] DBus interface - determining whether a device exists

Johan Hedberg
2006-10-18T14:03:52Z

Hi Fred,

On Wed, Oct 18, 2006, Frederic Danis wrote:
> You can find attached a new patch implementing ListRemoteDevices and
> ListRecentRemoteDevices.

Couple of notes about your patch:

> +static void list_remote_devices_do_append(char *key, char *value, void *data)
> +{
> + struct remote_device_list_t *param = data;
> + char *address;
> + struct tm date;
> +
> + if (slist_find(param->list, key, (cmp_func_t) bacmp))
> + return;

bacmp takes bdaddr_t pointers not char pointers. You probably want to
use strcasecmp.

> + slist_append(param->list, address);

This should be:
param->list = slist_append(param->list, address);

> + /* Add Bonded devices to the list */
> + create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "linkkeys");
> + textfile_foreach(filename, list_remote_devices_do_append, &param);
> +
> + /* Add Last Used devices to the list */
> + create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "lastused");
> + textfile_foreach(filename, list_remote_devices_do_append, &param);
> +
> + /* Add Last Seen devices to the list */
> + create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "lastseen");
> + textfile_foreach(filename, list_remote_devices_do_append, &param);
> +
> + reply = dbus_message_new_method_return(msg);
> +
> + dbus_message_iter_init_append(reply, &iter);
> +
> + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
> + DBUS_TYPE_STRING_AS_STRING, &array_iter);
> +
> + slist_foreach(param.list, remote_devices_do_append, &array_iter);
> +
> + slist_free(param.list);

slist_free only frees the nodes in the list but not the data they point
to (the strings which have been allocated with strdup). So you probably
want to call slist_foreach(param.list, (slist_func_t) free, NULL) before
slist_free or free the data in remote_devices_do_append.

> + /* Add Bonded devices to the list */
> + create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "linkkeys");
> + textfile_foreach(filename, list_remote_devices_do_append, &param);
> +
> + /* Add Last Used devices to the list */
> + create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "lastused");
> + textfile_foreach(filename, list_remote_devices_do_append, &param);
> +
> + reply = dbus_message_new_method_return(msg);
> +
> + dbus_message_iter_init_append(reply, &iter);
> +
> + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
> + DBUS_TYPE_STRING_AS_STRING, &array_iter);
> +
> + slist_foreach(param.list, remote_devices_do_append, &array_iter);
> +
> + slist_free(param.list);

And same applies here.

Johan