mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
pulse-server: module-zeroconf-publish: do not allocate service name dynamically
The service name cannot exceed AVAHI_LABEL_MAX-1 characters in length, so store it in the service struct instead of dynamically allocating it.
This commit is contained in:
parent
d240d7a5ef
commit
fd111da507
1 changed files with 8 additions and 15 deletions
|
|
@ -40,6 +40,7 @@
|
||||||
#include <avahi-common/alternative.h>
|
#include <avahi-common/alternative.h>
|
||||||
#include <avahi-common/error.h>
|
#include <avahi-common/error.h>
|
||||||
#include <avahi-common/domain.h>
|
#include <avahi-common/domain.h>
|
||||||
|
#include <avahi-common/malloc.h>
|
||||||
|
|
||||||
#define NAME "zeroconf-publish"
|
#define NAME "zeroconf-publish"
|
||||||
|
|
||||||
|
|
@ -67,7 +68,6 @@ enum service_subtype {
|
||||||
struct service {
|
struct service {
|
||||||
struct module_zeroconf_publish_data *userdata;
|
struct module_zeroconf_publish_data *userdata;
|
||||||
AvahiEntryGroup *entry_group;
|
AvahiEntryGroup *entry_group;
|
||||||
char *service_name;
|
|
||||||
const char *service_type;
|
const char *service_type;
|
||||||
enum service_subtype subtype;
|
enum service_subtype subtype;
|
||||||
|
|
||||||
|
|
@ -77,6 +77,8 @@ struct service {
|
||||||
struct sample_spec ss;
|
struct sample_spec ss;
|
||||||
struct channel_map cm;
|
struct channel_map cm;
|
||||||
struct pw_properties *props;
|
struct pw_properties *props;
|
||||||
|
|
||||||
|
char service_name[AVAHI_LABEL_MAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct module_zeroconf_publish_data {
|
struct module_zeroconf_publish_data {
|
||||||
|
|
@ -112,19 +114,15 @@ static const struct pw_core_events core_events = {
|
||||||
.error = on_core_error,
|
.error = on_core_error,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *get_service_name(struct pw_manager_object *o)
|
static void get_service_name(struct pw_manager_object *o, char *buf, size_t length)
|
||||||
{
|
{
|
||||||
const char *hn, *un, *n;
|
const char *hn, *un, *n;
|
||||||
char *service_name;
|
|
||||||
|
|
||||||
hn = pw_get_host_name();
|
hn = pw_get_host_name();
|
||||||
un = pw_get_user_name();
|
un = pw_get_user_name();
|
||||||
n = pw_properties_get(o->props, PW_KEY_NODE_DESCRIPTION);
|
n = pw_properties_get(o->props, PW_KEY_NODE_DESCRIPTION);
|
||||||
|
|
||||||
service_name = calloc(1, AVAHI_LABEL_MAX - 1);
|
snprintf(buf, length, "%s@%s: %s", un, hn, n);
|
||||||
snprintf(service_name, AVAHI_LABEL_MAX - 1, "%s@%s: %s", un, hn, n);
|
|
||||||
|
|
||||||
return service_name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int service_free(void *d, struct pw_manager_object *o)
|
static int service_free(void *d, struct pw_manager_object *o)
|
||||||
|
|
@ -145,11 +143,6 @@ static int service_free(void *d, struct pw_manager_object *o)
|
||||||
avahi_entry_group_free(s->entry_group);
|
avahi_entry_group_free(s->entry_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->service_name) {
|
|
||||||
pw_log_debug("Removing service: %s", s->service_name);
|
|
||||||
free(s->service_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->name) {
|
if (s->name) {
|
||||||
pw_log_debug("Removing service for node: %s", s->name);
|
pw_log_debug("Removing service for node: %s", s->name);
|
||||||
free(s->name);
|
free(s->name);
|
||||||
|
|
@ -294,7 +287,7 @@ static struct service *create_service(struct module_zeroconf_publish_data *d, st
|
||||||
|
|
||||||
s->userdata = d;
|
s->userdata = d;
|
||||||
s->entry_group = NULL;
|
s->entry_group = NULL;
|
||||||
s->service_name = get_service_name(o);
|
get_service_name(o, s->service_name, sizeof(s->service_name));
|
||||||
|
|
||||||
fill_service_data(d, s, o);
|
fill_service_data(d, s, o);
|
||||||
|
|
||||||
|
|
@ -346,8 +339,8 @@ static void service_entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupStat
|
||||||
|
|
||||||
t = avahi_alternative_service_name(s->service_name);
|
t = avahi_alternative_service_name(s->service_name);
|
||||||
pw_log_info("Name collision, renaming %s to %s.", s->service_name, t);
|
pw_log_info("Name collision, renaming %s to %s.", s->service_name, t);
|
||||||
free(s->service_name);
|
snprintf(s->service_name, sizeof(s->service_name), "%s", t);
|
||||||
s->service_name = t;
|
avahi_free(t);
|
||||||
|
|
||||||
publish_service(s);
|
publish_service(s);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue