X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-daemon%2Fmain.c;h=f64524a730e85bcaf1c4289135197b52cd5f2033;hb=f17d2832301b0f2fcd50fdcc6fec77666178158f;hp=7f5d1484182a6f0d53b18e40622e85d58abb20bd;hpb=ccae11c51822c2d2fd0a83012346c4c16ef86529;p=catta diff --git a/avahi-daemon/main.c b/avahi-daemon/main.c index 7f5d148..f64524a 100644 --- a/avahi-daemon/main.c +++ b/avahi-daemon/main.c @@ -49,7 +49,10 @@ #include #include #include + #include +#include +#include #include #include "main.h" @@ -62,6 +65,7 @@ #endif AvahiServer *avahi_server = NULL; +AvahiSimplePoll *simple_poll_api = NULL; typedef enum { DAEMON_RUN, @@ -104,8 +108,6 @@ static char **resolv_conf = NULL; static DaemonConfig config; -#define MAX_NAME_SERVERS 10 - static int has_prefix(const char *s, const char *prefix) { size_t l; @@ -122,17 +124,14 @@ static int load_resolv_conf(const DaemonConfig *c) { avahi_strfreev(resolv_conf); resolv_conf = NULL; - if (!c->publish_resolv_conf) - return 0; - if (!(f = fopen(RESOLV_CONF, "r"))) { avahi_log_warn("Failed to open "RESOLV_CONF"."); goto finish; } - resolv_conf = avahi_new0(char*, MAX_NAME_SERVERS+1); + resolv_conf = avahi_new0(char*, AVAHI_MAX_WIDE_AREA_SERVERS+1); - while (!feof(f) && i < MAX_NAME_SERVERS) { + while (!feof(f) && i < AVAHI_MAX_WIDE_AREA_SERVERS) { char ln[128]; char *p; @@ -179,10 +178,10 @@ static AvahiSEntryGroup* add_dns_servers(AvahiServer *s, AvahiSEntryGroup* g, ch for (p = l; *p; p++) { AvahiAddress a; - if (!avahi_address_parse(*p, AF_UNSPEC, &a)) + if (!avahi_address_parse(*p, AVAHI_PROTO_UNSPEC, &a)) avahi_log_warn("Failed to parse address '%s', ignoring.", *p); else - if (avahi_server_add_dns_server_address(s, g, -1, AF_UNSPEC, NULL, AVAHI_DNS_SERVER_RESOLVE, &a, 53) < 0) { + if (avahi_server_add_dns_server_address(s, g, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, NULL, AVAHI_DNS_SERVER_RESOLVE, &a, 53) < 0) { avahi_s_entry_group_free(g); avahi_log_error("Failed to add DNS server address: %s", avahi_strerror(avahi_server_errno(s))); return NULL; @@ -203,13 +202,28 @@ static void remove_dns_server_entry_groups(void) { avahi_s_entry_group_reset(dns_servers_entry_group); } +static void update_wide_area_servers(void) { + AvahiAddress a[AVAHI_MAX_WIDE_AREA_SERVERS]; + unsigned n = 0; + char **p; + + for (p = resolv_conf; *p && n < AVAHI_MAX_WIDE_AREA_SERVERS; p++) { + if (!avahi_address_parse(*p, AVAHI_PROTO_UNSPEC, &a[n])) + avahi_log_warn("Failed to parse address '%s', ignoring.", *p); + else + n++; + } + + avahi_server_set_wide_area_servers(avahi_server, a, n); +} + static void server_callback(AvahiServer *s, AvahiServerState state, void *userdata) { DaemonConfig *c = userdata; assert(s); assert(c); - /** This function is possibly called before the global variable + /* This function is possibly called before the global variable * avahi_server has been set, therefore we do it explicitly */ avahi_server = s; @@ -219,31 +233,46 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda dbus_protocol_server_state_changed(state); #endif - if (state == AVAHI_SERVER_RUNNING) { - avahi_log_info("Server startup complete. Host name is %s. Local service cookie is %u.", avahi_server_get_host_name_fqdn(s), avahi_server_get_local_service_cookie(s)); - static_service_add_to_server(); - - remove_dns_server_entry_groups(); - - if (resolv_conf && resolv_conf[0]) - resolv_conf_entry_group = add_dns_servers(s, resolv_conf_entry_group, resolv_conf); - - if (c->publish_dns_servers && c->publish_dns_servers[0]) - dns_servers_entry_group = add_dns_servers(s, dns_servers_entry_group, c->publish_dns_servers); - - simple_protocol_restart_queries(); - - } else if (state == AVAHI_SERVER_COLLISION) { - char *n; + switch (state) { + case AVAHI_SERVER_RUNNING: + avahi_log_info("Server startup complete. Host name is %s. Local service cookie is %u.", avahi_server_get_host_name_fqdn(s), avahi_server_get_local_service_cookie(s)); + static_service_add_to_server(); + + remove_dns_server_entry_groups(); + + if (c->publish_resolv_conf && resolv_conf && resolv_conf[0]) + resolv_conf_entry_group = add_dns_servers(s, resolv_conf_entry_group, resolv_conf); + + if (c->publish_dns_servers && c->publish_dns_servers[0]) + dns_servers_entry_group = add_dns_servers(s, dns_servers_entry_group, c->publish_dns_servers); + + simple_protocol_restart_queries(); + break; + + case AVAHI_SERVER_COLLISION: { + char *n; + + static_service_remove_from_server(); + + remove_dns_server_entry_groups(); + + n = avahi_alternative_host_name(avahi_server_get_host_name(s)); + avahi_log_warn("Host name conflict, retrying with <%s>", n); + avahi_server_set_host_name(s, n); + avahi_free(n); + break; + } - static_service_remove_from_server(); + case AVAHI_SERVER_FAILURE: - remove_dns_server_entry_groups(); + avahi_log_error("Server error: %s", avahi_strerror(avahi_server_errno(s))); + avahi_simple_poll_quit(simple_poll_api); + break; - n = avahi_alternative_host_name(avahi_server_get_host_name(s)); - avahi_log_warn("Host name conflict, retrying with <%s>", n); - avahi_server_set_host_name(s, n); - avahi_free(n); + case AVAHI_SERVER_REGISTERING: + case AVAHI_SERVER_INVALID: + break; + } } @@ -381,6 +410,8 @@ static int load_config_file(DaemonConfig *c) { c->server_config.check_response_ttl = is_yes(p->value); else if (strcasecmp(p->key, "use-iff-running") == 0) c->server_config.use_iff_running = is_yes(p->value); + else if (strcasecmp(p->key, "disallow-other-stacks") == 0) + c->server_config.disallow_other_stacks = is_yes(p->value); else if (strcasecmp(p->key, "enable-dbus") == 0) { if (*(p->value) == 'w' || *(p->value) == 'W') { @@ -426,6 +457,19 @@ static int load_config_file(DaemonConfig *c) { } } + } else if (strcasecmp(g->name, "wide-area") == 0) { + AvahiIniFilePair *p; + + for (p = g->pairs; p; p = p->pairs_next) { + + if (strcasecmp(p->key, "enable-wide-area") == 0) + c->server_config.enable_wide_area = is_yes(p->value); + else { + avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name); + goto finish; + } + } + } else if (strcasecmp(g->name, "reflector") == 0) { AvahiIniFilePair *p; @@ -517,7 +561,6 @@ static void dump(const char *text, void* userdata) { static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, void *userdata) { int sig; - AvahiSimplePoll *simple_poll_api = userdata; const AvahiPoll *poll_api; assert(watch); @@ -551,8 +594,10 @@ static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, vo avahi_s_entry_group_reset(resolv_conf_entry_group); load_resolv_conf(&config); + + update_wide_area_servers(); - if (resolv_conf && resolv_conf[0]) + if (config.publish_resolv_conf && resolv_conf && resolv_conf[0]) resolv_conf_entry_group = add_dns_servers(avahi_server, resolv_conf_entry_group, resolv_conf); break; @@ -571,7 +616,6 @@ static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, vo static int run_server(DaemonConfig *c) { int r = -1; int error; - AvahiSimplePoll *simple_poll_api; const AvahiPoll *poll_api; AvahiWatch *sig_watch; @@ -620,6 +664,7 @@ static int run_server(DaemonConfig *c) { goto finish; } + update_wide_area_servers(); if (c->daemonize) daemon_retval_send(0); @@ -652,16 +697,20 @@ finish: dbus_protocol_shutdown(); #endif - if (avahi_server) + if (avahi_server) { avahi_server_free(avahi_server); + avahi_server = NULL; + } daemon_signal_done(); if (sig_watch) poll_api->watch_free(sig_watch); - if (simple_poll_api) + if (simple_poll_api) { avahi_simple_poll_free(simple_poll_api); + simple_poll_api = NULL; + } if (r != 0 && c->daemonize) daemon_retval_send(1); @@ -695,11 +744,13 @@ static int drop_root(void) { #if defined(HAVE_SETRESGID) r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid); +#elif defined(HAVE_SETEGID) + if ((r = setgid(gr->gr_gid)) >= 0) + r = setegid(gr->gr_gid); #elif defined(HAVE_SETREGID) r = setregid(gr->gr_gid, gr->gr_gid); #else - if ((r = setgid(gr->gr_gid)) >= 0) - r = setegid(gr->gr_gid); +#error "No API to drop priviliges" #endif if (r < 0) { @@ -709,11 +760,13 @@ static int drop_root(void) { #if defined(HAVE_SETRESUID) r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); +#elif defined(HAVE_SETEUID) + if ((r = setuid(pw->pw_uid)) >= 0) + r = seteuid(pw->pw_uid); #elif defined(HAVE_SETREUID) r = setreuid(pw->pw_uid, pw->pw_uid); #else - if ((r = setuid(pw->pw_uid)) >= 0) - r = seteuid(pw->pw_uid); +#error "No API to drop priviliges" #endif if (r < 0) {