mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
miracled: split peer allocation and linking
If we don't split peer linking off, the peer might get advertised before the sub-device related data is set. With dbus, this might trigger callbacks to not return attributes as the peer-type is unknown. Therefore, properly initialize the peer before linking/advertising it. This fixes a bug where the initial InterfacesAdded signal for new peers does not include all properties of a peer. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
parent
e60e678d40
commit
837fe1cea1
1 changed files with 24 additions and 16 deletions
|
@ -53,7 +53,6 @@ int peer_make_name(unsigned int id, char **out)
|
||||||
static int peer_new(struct link *l, struct peer **out)
|
static int peer_new(struct link *l, struct peer **out)
|
||||||
{
|
{
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
size_t hash = 0;
|
|
||||||
char *name;
|
char *name;
|
||||||
struct peer *p;
|
struct peer *p;
|
||||||
int r;
|
int r;
|
||||||
|
@ -66,7 +65,7 @@ static int peer_new(struct link *l, struct peer **out)
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
if (shl_htable_lookup_str(&l->m->peers, name, &hash, NULL)) {
|
if (shl_htable_lookup_str(&l->m->peers, name, NULL, NULL)) {
|
||||||
free(name);
|
free(name);
|
||||||
return -EALREADY;
|
return -EALREADY;
|
||||||
}
|
}
|
||||||
|
@ -83,25 +82,26 @@ static int peer_new(struct link *l, struct peer **out)
|
||||||
p->id = id;
|
p->id = id;
|
||||||
p->name = name;
|
p->name = name;
|
||||||
|
|
||||||
r = shl_htable_insert_str(&l->m->peers, &p->name, &hash);
|
|
||||||
if (r < 0) {
|
|
||||||
log_vERR(r);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
++l->m->peer_cnt;
|
|
||||||
shl_dlist_link(&l->peers, &p->list);
|
|
||||||
peer_dbus_added(p);
|
|
||||||
log_info("new peer: %s@%s", p->name, l->name);
|
|
||||||
|
|
||||||
if (out)
|
if (out)
|
||||||
*out = p;
|
*out = p;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
error:
|
static int peer_link(struct peer *p)
|
||||||
peer_free(p);
|
{
|
||||||
return r;
|
int r;
|
||||||
|
|
||||||
|
r = shl_htable_insert_str(&p->l->m->peers, &p->name, NULL);
|
||||||
|
if (r < 0)
|
||||||
|
return log_ERR(r);
|
||||||
|
|
||||||
|
++p->l->m->peer_cnt;
|
||||||
|
shl_dlist_link(&p->l->peers, &p->list);
|
||||||
|
peer_dbus_added(p);
|
||||||
|
log_info("new peer: %s@%s", p->name, p->l->name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out)
|
int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out)
|
||||||
|
@ -116,10 +116,18 @@ int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out)
|
||||||
p->d = d;
|
p->d = d;
|
||||||
wifi_dev_set_data(p->d, p);
|
wifi_dev_set_data(p->d, p);
|
||||||
|
|
||||||
|
r = peer_link(p);
|
||||||
|
if (r < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (out)
|
if (out)
|
||||||
*out = p;
|
*out = p;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
peer_free(p);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void peer_free(struct peer *p)
|
void peer_free(struct peer *p)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue