X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-daemon%2Fmain.c;h=6f0624d3ae96389ce30c5dcefa308331a9cbf429;hb=eee711106f721fc73a1ef50348984b7a1d9cb595;hp=de74178d7079b55ad71fe6aa026fa01ccdf52a17;hpb=424aefe8a431b79496672799dc4f4430fa935252;p=catta diff --git a/avahi-daemon/main.c b/avahi-daemon/main.c index de74178..6f0624d 100644 --- a/avahi-daemon/main.c +++ b/avahi-daemon/main.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -49,8 +50,10 @@ #include #include #include + #include #include +#include #include #include "main.h" @@ -63,6 +66,7 @@ #endif AvahiServer *avahi_server = NULL; +AvahiSimplePoll *simple_poll_api = NULL; typedef enum { DAEMON_RUN, @@ -113,7 +117,7 @@ static int has_prefix(const char *s, const char *prefix) { return strlen(s) >= l && strncmp(s, prefix, l) == 0; } -static int load_resolv_conf(const DaemonConfig *c) { +static int load_resolv_conf(void) { int ret = -1; FILE *f; int i = 0; @@ -126,9 +130,9 @@ static int load_resolv_conf(const DaemonConfig *c) { goto finish; } - resolv_conf = avahi_new0(char*, AVAHI_MAX_WIDE_AREA_SERVERS+1); + resolv_conf = avahi_new0(char*, AVAHI_WIDE_AREA_SERVERS_MAX+1); - while (!feof(f) && i < AVAHI_MAX_WIDE_AREA_SERVERS) { + while (!feof(f) && i < AVAHI_WIDE_AREA_SERVERS_MAX) { char ln[128]; char *p; @@ -200,11 +204,11 @@ static void remove_dns_server_entry_groups(void) { } static void update_wide_area_servers(void) { - AvahiAddress a[AVAHI_MAX_WIDE_AREA_SERVERS]; + AvahiAddress a[AVAHI_WIDE_AREA_SERVERS_MAX]; unsigned n = 0; char **p; - for (p = resolv_conf; *p && n < AVAHI_MAX_WIDE_AREA_SERVERS; p++) { + for (p = resolv_conf; *p && n < AVAHI_WIDE_AREA_SERVERS_MAX; p++) { if (!avahi_address_parse(*p, AVAHI_PROTO_UNSPEC, &a[n])) avahi_log_warn("Failed to parse address '%s', ignoring.", *p); else @@ -212,7 +216,6 @@ static void update_wide_area_servers(void) { } avahi_server_set_wide_area_servers(avahi_server, a, n); - } static void server_callback(AvahiServer *s, AvahiServerState state, void *userdata) { @@ -221,41 +224,56 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda 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; #ifdef HAVE_DBUS - if (c->enable_dbus) + if (c->enable_dbus && state != AVAHI_SERVER_INVALID && state != AVAHI_SERVER_FAILURE) 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 (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(); - - } 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; + } } @@ -538,13 +556,12 @@ static void log_function(AvahiLogLevel level, const char *txt) { daemon_log(log_level_map[level], "%s", txt); } -static void dump(const char *text, void* userdata) { +static void dump(const char *text, AVAHI_GCC_UNUSED void* userdata) { avahi_log_info("%s", text); } -static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, void *userdata) { +static void signal_callback(AvahiWatch *watch, AVAHI_GCC_UNUSED int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { int sig; - AvahiSimplePoll *simple_poll_api = userdata; const AvahiPoll *poll_api; assert(watch); @@ -577,7 +594,7 @@ static void signal_callback(AvahiWatch *watch, int fd, AvahiWatchEvent event, vo if (resolv_conf_entry_group) avahi_s_entry_group_reset(resolv_conf_entry_group); - load_resolv_conf(&config); + load_resolv_conf(); update_wide_area_servers(); @@ -600,9 +617,8 @@ 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; + const AvahiPoll *poll_api = NULL; + AvahiWatch *sig_watch = NULL; assert(c); @@ -641,7 +657,7 @@ static int run_server(DaemonConfig *c) { #endif } - load_resolv_conf(c); + load_resolv_conf(); static_service_load(); if (!(avahi_server = avahi_server_new(poll_api, &c->server_config, server_callback, c, &error))) { @@ -682,16 +698,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); @@ -725,11 +745,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) { @@ -739,11 +761,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) { @@ -819,9 +843,10 @@ static void set_one_rlimit(int resource, rlim_t limit, const char *name) { } static void enforce_rlimits(void) { - +#ifdef RLIMIT_AS if (config.rlimit_as_set) set_one_rlimit(RLIMIT_AS, config.rlimit_as, "RLIMIT_AS"); +#endif if (config.rlimit_core_set) set_one_rlimit(RLIMIT_CORE, config.rlimit_core, "RLIMIT_CORE"); if (config.rlimit_data_set) @@ -873,7 +898,6 @@ int main(int argc, char *argv[]) { init_rand_seed(); avahi_server_config_init(&config.server_config); - config.server_config.disallow_other_stacks = 1; config.command = DAEMON_RUN; config.daemonize = 0; config.config_file = NULL; @@ -963,7 +987,7 @@ int main(int argc, char *argv[]) { /** Parent **/ if ((ret = daemon_retval_wait(20)) < 0) { - avahi_log_error("Could not recieve return value from daemon process."); + avahi_log_error("Could not receive return value from daemon process."); goto finish; }