diff --git a/src/miracled-dbus.c b/src/miracled-dbus.c index db42532..b3c234c 100644 --- a/src/miracled-dbus.c +++ b/src/miracled-dbus.c @@ -87,7 +87,6 @@ static int peer_dbus_get_link(sd_bus *bus, return 1; } -/* static int peer_dbus_get_name(sd_bus *bus, const char *path, const char *interface, @@ -96,7 +95,16 @@ static int peer_dbus_get_name(sd_bus *bus, void *data, sd_bus_error *err) { - return -EINVAL; + struct peer *p = data; + const char *name; + int r; + + name = peer_get_friendly_name(p); + r = sd_bus_message_append_basic(reply, 's', name ? name : ""); + if (r < 0) + return r; + + return 1; } static int peer_dbus_get_connected(sd_bus *bus, @@ -107,7 +115,15 @@ static int peer_dbus_get_connected(sd_bus *bus, void *data, sd_bus_error *err) { - return -EINVAL; + struct peer *p = data; + int r, val; + + val = peer_is_connected(p); + r = sd_bus_message_append_basic(reply, 'b', &val); + if (r < 0) + return r; + + return 1; } static int peer_dbus_get_interface(sd_bus *bus, @@ -118,7 +134,16 @@ static int peer_dbus_get_interface(sd_bus *bus, void *data, sd_bus_error *err) { - return -EINVAL; + struct peer *p = data; + const char *val; + int r; + + val = peer_get_interface(p); + r = sd_bus_message_append_basic(reply, 's', val ? : ""); + if (r < 0) + return r; + + return 1; } static int peer_dbus_get_local_address(sd_bus *bus, @@ -129,7 +154,16 @@ static int peer_dbus_get_local_address(sd_bus *bus, void *data, sd_bus_error *err) { - return -EINVAL; + struct peer *p = data; + const char *val; + int r; + + val = peer_get_local_address(p); + r = sd_bus_message_append_basic(reply, 's', val ? : ""); + if (r < 0) + return r; + + return 1; } static int peer_dbus_get_remote_address(sd_bus *bus, @@ -140,9 +174,17 @@ static int peer_dbus_get_remote_address(sd_bus *bus, void *data, sd_bus_error *err) { - return -EINVAL; + struct peer *p = data; + const char *val; + int r; + + val = peer_get_remote_address(p); + r = sd_bus_message_append_basic(reply, 's', val ? : ""); + if (r < 0) + return r; + + return 1; } -*/ static const sd_bus_vtable peer_dbus_vtable[] = { SD_BUS_VTABLE_START(0), @@ -171,7 +213,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = { peer_dbus_get_link, 0, SD_BUS_VTABLE_PROPERTY_CONST), -/* SD_BUS_PROPERTY("Name", "s", peer_dbus_get_name, @@ -197,7 +238,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = { peer_dbus_get_remote_address, 0, 0), -*/ SD_BUS_SIGNAL("ProvisionRequest", "ss", 0), SD_BUS_VTABLE_END }; diff --git a/src/miracled-peer.c b/src/miracled-peer.c index ba9ee95..8ad01d2 100644 --- a/src/miracled-peer.c +++ b/src/miracled-peer.c @@ -140,6 +140,61 @@ void peer_free(struct peer *p) free(p); } +const char *peer_get_friendly_name(struct peer *p) +{ + if (!p) + return NULL; + + if (p->d) + return wifi_dev_get_name(p->d); + else + return NULL; +} + +bool peer_is_connected(struct peer *p) +{ + if (!p) + return false; + + if (p->d) + return wifi_dev_is_ready(p->d); + else + return false; +} + +const char *peer_get_interface(struct peer *p) +{ + if (!p) + return NULL; + + if (p->d) + return wifi_dev_get_interface(p->d); + else + return NULL; +} + +const char *peer_get_local_address(struct peer *p) +{ + if (!p) + return NULL; + + if (p->d) + return wifi_dev_get_local_address(p->d); + else + return NULL; +} + +const char *peer_get_remote_address(struct peer *p) +{ + if (!p) + return NULL; + + if (p->d) + return wifi_dev_get_remote_address(p->d); + else + return NULL; +} + void peer_process_wifi(struct peer *p, struct wifi_event *ev) { if (!p || !p->d) diff --git a/src/miracled-wifi.c b/src/miracled-wifi.c index 28e76d8..0af675c 100644 --- a/src/miracled-wifi.c +++ b/src/miracled-wifi.c @@ -42,6 +42,7 @@ #include "miracled-wifi.h" #include "shl_dlist.h" #include "shl_log.h" +#include "shl_util.h" struct wifi { sd_event *event; @@ -69,6 +70,8 @@ struct wifi_dev { char pin[WIFI_PIN_STRLEN + 1]; unsigned int provision; + char *name; + char *ifname; unsigned int role; @@ -301,7 +304,7 @@ static ssize_t wifi_requestf_retry(struct wifi *w, const char *format, ...) static int wifi_parse_peer(struct wifi *w, size_t len, struct wifi_dev **out) { char buf[512]; - char *pos, *next; + char *pos, *next, *val; int x1, x2, x3, x4, x5, x6, r; struct wifi_dev *d; @@ -336,7 +339,13 @@ static int wifi_parse_peer(struct wifi *w, size_t len, struct wifi_dev **out) if (next) *next = 0; - log_debug("add info: %s", pos); + if ((val = shl_startswith(pos, "device_name="))) { + val = strdup(val); + if (val) { + free(d->name); + d->name = val; + } + } } *out = d; @@ -1139,6 +1148,7 @@ void wifi_dev_unref(struct wifi_dev *d) wifi_dev_set_connected(d, false, false); wifi_dev_lost(d); + free(d->name); free(d); } @@ -1244,3 +1254,35 @@ void wifi_dev_disconnect(struct wifi_dev *d) wifi_dev_set_connected(d, false, false); wifi_dev_stop(d); } + +const char *wifi_dev_get_name(struct wifi_dev *d) +{ + if (!d) + return NULL; + + return d->name; +} + +const char *wifi_dev_get_interface(struct wifi_dev *d) +{ + if (!wifi_dev_is_ready(d)) + return NULL; + + return d->ifname; +} + +const char *wifi_dev_get_local_address(struct wifi_dev *d) +{ + if (!wifi_dev_is_ready(d)) + return NULL; + + return d->local_addr; +} + +const char *wifi_dev_get_remote_address(struct wifi_dev *d) +{ + if (!wifi_dev_is_ready(d)) + return NULL; + + return d->remote_addr; +} diff --git a/src/miracled-wifi.h b/src/miracled-wifi.h index 5e4563e..dee1fc9 100644 --- a/src/miracled-wifi.h +++ b/src/miracled-wifi.h @@ -123,4 +123,9 @@ int wifi_dev_connect(struct wifi_dev *d, unsigned int provision, const char *pin); void wifi_dev_disconnect(struct wifi_dev *d); +const char *wifi_dev_get_name(struct wifi_dev *d); +const char *wifi_dev_get_interface(struct wifi_dev *d); +const char *wifi_dev_get_local_address(struct wifi_dev *d); +const char *wifi_dev_get_remote_address(struct wifi_dev *d); + #endif /* MIRACLED_WIFI_H */ diff --git a/src/miracled.h b/src/miracled.h index b600cf0..ce44a6b 100644 --- a/src/miracled.h +++ b/src/miracled.h @@ -63,8 +63,13 @@ int peer_make_name(unsigned int id, char **out); int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out); void peer_free(struct peer *p); -void peer_process_wifi(struct peer *p, struct wifi_event *ev); +const char *peer_get_friendly_name(struct peer *p); +bool peer_is_connected(struct peer *p); +const char *peer_get_interface(struct peer *p); +const char *peer_get_local_address(struct peer *p); +const char *peer_get_remote_address(struct peer *p); +void peer_process_wifi(struct peer *p, struct wifi_event *ev); /* link */