From: Lennart Poettering Date: Fri, 12 Dec 2008 21:34:08 +0000 (+0100) Subject: Merge commit 'flameeyes/master' X-Git-Url: http://git.meshlink.io/?a=commitdiff_plain;h=c3c0f3d47e49ab6814d4de3ee41a0c5caf0265b9;hp=01905caa58178302d2bc910893e09eeca81ef320;p=catta Merge commit 'flameeyes/master' --- diff --git a/avahi-autoipd/main.c b/avahi-autoipd/main.c index ef529b9..eb71c3b 100644 --- a/avahi-autoipd/main.c +++ b/avahi-autoipd/main.c @@ -1281,7 +1281,7 @@ static int loop(int iface, uint32_t addr) { DEBUG(daemon_log(LOG_DEBUG, "Ignoring irrelevant ARP packet.")); } - } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED) { + } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED && !force_bind) { daemon_log(LOG_INFO, "A routable address has been configured."); @@ -1306,7 +1306,7 @@ static int loop(int iface, uint32_t addr) { elapse_time(&next_wakeup, 0, PROBE_WAIT*1000); next_wakeup_valid = 1; - } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING && !force_bind) { + } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING) { /* The user requested a reannouncing of the address by a SIGHUP */ daemon_log(LOG_INFO, "Reannouncing address."); diff --git a/avahi-common/Makefile.am b/avahi-common/Makefile.am index b00cd78..b4bc917 100644 --- a/avahi-common/Makefile.am +++ b/avahi-common/Makefile.am @@ -71,7 +71,7 @@ libavahi_common_la_SOURCES = \ i18n.c i18n.h libavahi_common_la_CFLAGS = $(AM_CFLAGS) $(PTHREAD_CFLAGS) -DAVAHI_LOCALEDIR=\"$(avahilocaledir)\" -libavahi_common_la_LIBADD = $(AM_LDADD) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) +libavahi_common_la_LIBADD = $(AM_LDADD) $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) $(LIBINTL) libavahi_common_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBAVAHI_COMMON_VERSION_INFO) strlst_test_SOURCES = \ diff --git a/avahi-common/gccmacro.h b/avahi-common/gccmacro.h index 78a09a7..dd49502 100644 --- a/avahi-common/gccmacro.h +++ b/avahi-common/gccmacro.h @@ -28,6 +28,15 @@ AVAHI_C_DECL_BEGIN +#if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3) +#define AVAHI_GCC_ALLOC_SIZE(x) __attribute__ ((__alloc_size__(x))) +#define AVAHI_GCC_ALLOC_SIZE2(x,y) __attribute__ ((__alloc_size__(x,y))) +#else +/** Macro for usage of GCC's alloc_size attribute */ +#define AVAHI_GCC_ALLOC_SIZE(x) +#define AVAHI_GCC_ALLOC_SIZE2(x,y) +#endif + #if defined(__GNUC__) && (__GNUC__ >= 4) #define AVAHI_GCC_SENTINEL __attribute__ ((sentinel)) #else diff --git a/avahi-common/malloc.h b/avahi-common/malloc.h index 2430199..511b51c 100644 --- a/avahi-common/malloc.h +++ b/avahi-common/malloc.h @@ -35,19 +35,19 @@ AVAHI_C_DECL_BEGIN /** Allocate some memory, just like the libc malloc() */ -void *avahi_malloc(size_t size); +void *avahi_malloc(size_t size) AVAHI_GCC_ALLOC_SIZE(1); /** Similar to avahi_malloc() but set the memory to zero */ -void *avahi_malloc0(size_t size); +void *avahi_malloc0(size_t size) AVAHI_GCC_ALLOC_SIZE(1); /** Free some memory */ void avahi_free(void *p); /** Similar to libc's realloc() */ -void *avahi_realloc(void *p, size_t size); +void *avahi_realloc(void *p, size_t size) AVAHI_GCC_ALLOC_SIZE(2); /** Internal helper for avahi_new() */ -static inline void* avahi_new_internal(unsigned n, size_t k) { +static inline void* AVAHI_GCC_ALLOC_SIZE2(1,2) avahi_new_internal(unsigned n, size_t k) { assert(n < INT_MAX/k); return avahi_malloc(n*k); } @@ -56,7 +56,7 @@ static inline void* avahi_new_internal(unsigned n, size_t k) { #define avahi_new(type, n) ((type*) avahi_new_internal((n), sizeof(type))) /** Internal helper for avahi_new0() */ -static inline void* avahi_new0_internal(unsigned n, size_t k) { +static inline void* AVAHI_GCC_ALLOC_SIZE2(1,2) avahi_new0_internal(unsigned n, size_t k) { assert(n < INT_MAX/k); return avahi_malloc0(n*k); } @@ -71,14 +71,14 @@ char *avahi_strdup(const char *s); char *avahi_strndup(const char *s, size_t l); /** Duplicate the given memory block into a new one allocated with avahi_malloc() */ -void *avahi_memdup(const void *s, size_t l); +void *avahi_memdup(const void *s, size_t l) AVAHI_GCC_ALLOC_SIZE(2); /** Wraps allocator functions */ typedef struct AvahiAllocator { - void* (*malloc)(size_t size); - void (*free)(void *p); - void* (*realloc)(void *p, size_t size); - void* (*calloc)(size_t nmemb, size_t size); /**< May be NULL */ + void* (*malloc)(size_t size) AVAHI_GCC_ALLOC_SIZE(1); + void (*free)(void *p); + void* (*realloc)(void *p, size_t size) AVAHI_GCC_ALLOC_SIZE(2); + void* (*calloc)(size_t nmemb, size_t size) AVAHI_GCC_ALLOC_SIZE2(1,2); /**< May be NULL */ } AvahiAllocator; /** Change the allocator. May be NULL to return to default (libc) diff --git a/avahi-common/thread-watch.c b/avahi-common/thread-watch.c index 1a5d9d2..4f23608 100644 --- a/avahi-common/thread-watch.c +++ b/avahi-common/thread-watch.c @@ -2,17 +2,17 @@ /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -53,7 +53,7 @@ static int poll_func(struct pollfd *ufds, unsigned int nfds, int timeout, void * /* Before entering poll() we unlock the mutex, so that * avahi_simple_poll_quit() can succeed from another thread. */ - + pthread_mutex_unlock(mutex); r = poll(ufds, nfds, timeout); pthread_mutex_lock(mutex); @@ -68,11 +68,11 @@ static void* thread(void *userdata){ /* Make sure that signals are delivered to the main thread */ sigfillset(&mask); pthread_sigmask(SIG_BLOCK, &mask, NULL); - + pthread_mutex_lock(&p->mutex); p->retval = avahi_simple_poll_loop(p->simple_poll); pthread_mutex_unlock(&p->mutex); - + return NULL; } @@ -81,14 +81,14 @@ AvahiThreadedPoll *avahi_threaded_poll_new(void) { if (!(p = avahi_new(AvahiThreadedPoll, 1))) goto fail; /* OOM */ - + if (!(p->simple_poll = avahi_simple_poll_new())) goto fail; - + pthread_mutex_init(&p->mutex, NULL); avahi_simple_poll_set_func(p->simple_poll, poll_func, &p->mutex); - + p->thread_running = 0; return p; @@ -136,6 +136,8 @@ int avahi_threaded_poll_start(AvahiThreadedPoll *p) { if (pthread_create(&p->thread_id, NULL, thread, p) < 0) return -1; + p->thread_running = 1; + return 0; } @@ -151,7 +153,7 @@ int avahi_threaded_poll_stop(AvahiThreadedPoll *p) { pthread_mutex_lock(&p->mutex); avahi_simple_poll_quit(p->simple_poll); pthread_mutex_unlock(&p->mutex); - + pthread_join(p->thread_id, NULL); p->thread_running = 0; @@ -172,7 +174,7 @@ void avahi_threaded_poll_lock(AvahiThreadedPoll *p) { /* Make sure that this function is not called from the helper thread */ assert(!p->thread_running || !pthread_equal(pthread_self(), p->thread_id)); - + pthread_mutex_lock(&p->mutex); } @@ -181,6 +183,6 @@ void avahi_threaded_poll_unlock(AvahiThreadedPoll *p) { /* Make sure that this function is not called from the helper thread */ assert(!p->thread_running || !pthread_equal(pthread_self(), p->thread_id)); - + pthread_mutex_unlock(&p->mutex); } diff --git a/avahi-core/core.h b/avahi-core/core.h index 55aafe2..94d1970 100644 --- a/avahi-core/core.h +++ b/avahi-core/core.h @@ -47,6 +47,8 @@ typedef struct AvahiServerConfig { char *domain_name; /**< Default domain name. If left empty defaults to .local */ int use_ipv4; /**< Enable IPv4 support */ int use_ipv6; /**< Enable IPv6 support */ + AvahiStringList *allow_interfaces;/**< Allow specific interface to be used for Avahi */ + AvahiStringList *deny_interfaces; /**< Deny specific interfaces to be used for Avahi */ int publish_hinfo; /**< Register a HINFO record for the host containing the local OS and CPU type */ int publish_addresses; /**< Register A, AAAA and PTR records for all local IP addresses */ int publish_workstation; /**< Register a _workstation._tcp service */ diff --git a/avahi-core/iface-pfroute.c b/avahi-core/iface-pfroute.c index f96bfc2..391081e 100644 --- a/avahi-core/iface-pfroute.c +++ b/avahi-core/iface-pfroute.c @@ -125,7 +125,7 @@ static void rtm_addr(struct rt_msghdr *rtm, AvahiInterfaceMonitor *m) int raddr_valid = 0; struct ifa_msghdr *ifam = (struct ifa_msghdr *) rtm; char *cp = (char *)(ifam + 1); - int addrs = ifam->ifam_addrs; + char *cp0; int i; int prefixlen = 0; struct sockaddr *sa =NULL; @@ -135,17 +135,30 @@ static void rtm_addr(struct rt_msghdr *rtm, AvahiInterfaceMonitor *m) ((struct sockaddr *)cp)->sa_family = AF_INET; #endif - if(((struct sockaddr *)cp)->sa_family != AF_INET && ((struct sockaddr *)cp)->sa_family != AF_INET6) + for (cp0 = cp, i = 0; i < RTAX_MAX; i++) { + if (!(ifam->ifam_addrs & (1<sa_family != AF_INET && sa->sa_family != AF_INET6) return; - if (!(iface = avahi_interface_monitor_get_interface(m, (AvahiIfIndex) ifam->ifam_index, avahi_af_to_proto(((struct sockaddr *)cp)->sa_family)))) + if (!(iface = avahi_interface_monitor_get_interface(m, (AvahiIfIndex) ifam->ifam_index, avahi_af_to_proto(sa->sa_family)))) return; - raddr.proto = avahi_af_to_proto(((struct sockaddr *)cp)->sa_family); + raddr.proto = avahi_af_to_proto(sa->sa_family); - for(i = 0; addrs != 0 && i < RTAX_MAX; addrs &= ~(1<ifam_addrs & (1<sin6_addr, sizeof(struct in6_addr)); +#ifdef __KAME__ + if (IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)raddr.data.data)) + { + ((struct in6_addr *)raddr.data.data)->s6_addr[2] = 0; + ((struct in6_addr *)raddr.data.data)->s6_addr[3] = 0; + } +#endif raddr_valid = 1; default: break; @@ -196,9 +216,12 @@ static void rtm_addr(struct rt_msghdr *rtm, AvahiInterfaceMonitor *m) if (!(addriface = avahi_interface_monitor_get_address(m, iface, &raddr))) if (!(addriface = avahi_interface_address_new(m, iface, &raddr, prefixlen))) return; /* OOM */ - /* FIXME */ - /* addriface->global_scope = ifaddrmsg->ifa_scope == RT_SCOPE_UNIVERSE || ifaddrmsg->ifa_scope == RT_SCOPE_SITE; */ - addriface->global_scope = 1; + if (raddr.proto == AVAHI_PROTO_INET6) + { + addriface->global_scope = !(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)raddr.data.data) || IN6_IS_ADDR_MULTICAST((struct in6_addr *)raddr.data.data)); + } + else + addriface->global_scope = 1; } else { diff --git a/avahi-core/iface.c b/avahi-core/iface.c index 8098de4..5fbfc19 100644 --- a/avahi-core/iface.c +++ b/avahi-core/iface.c @@ -2,17 +2,17 @@ /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -59,19 +59,19 @@ void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs m->server->state == AVAHI_SERVER_REGISTERING)) { /* Fill the entry group */ - if (!a->entry_group) + if (!a->entry_group) a->entry_group = avahi_s_entry_group_new(m->server, avahi_host_rr_entry_group_callback, NULL); if (!a->entry_group) /* OOM */ return; - + if (avahi_s_entry_group_is_empty(a->entry_group)) { char t[AVAHI_ADDRESS_STR_MAX]; AvahiProtocol p; p = (a->interface->protocol == AVAHI_PROTO_INET && m->server->config.publish_a_on_ipv6) || (a->interface->protocol == AVAHI_PROTO_INET6 && m->server->config.publish_aaaa_on_ipv4) ? AVAHI_PROTO_UNSPEC : a->interface->protocol; - + avahi_address_snprint(t, sizeof(t), &a->address); avahi_log_info("Registering new address record for %s on %s.%s.", t, a->interface->hardware->name, p == AVAHI_PROTO_UNSPEC ? "*" : avahi_proto_to_string(p)); @@ -97,15 +97,15 @@ void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs avahi_server_decrease_host_rr_pending(m->server); avahi_log_info("Withdrawing address record for %s on %s.", t, a->interface->hardware->name); - + avahi_s_entry_group_reset(a->entry_group); } - } + } } void avahi_interface_update_rrs(AvahiInterface *i, int remove_rrs) { AvahiInterfaceAddress *a; - + assert(i); for (a = i->addresses; a; a = a->address_next) @@ -132,21 +132,21 @@ void avahi_hw_interface_update_rrs(AvahiHwInterface *hw, int remove_rrs) { if (!hw->entry_group) return; /* OOM */ - + if (avahi_s_entry_group_is_empty(hw->entry_group)) { char name[AVAHI_LABEL_MAX], mac[256]; avahi_format_mac_address(mac, sizeof(mac), hw->mac_address, hw->mac_address_size); snprintf(name, sizeof(name), "%s [%s]", m->server->host_name, mac); - if (avahi_server_add_service(m->server, hw->entry_group, hw->index, AVAHI_PROTO_UNSPEC, 0, name, "_workstation._tcp", NULL, NULL, 9, NULL) < 0) { + if (avahi_server_add_service(m->server, hw->entry_group, hw->index, AVAHI_PROTO_UNSPEC, 0, name, "_workstation._tcp", NULL, NULL, 9, NULL) < 0) { avahi_log_warn(__FILE__": avahi_server_add_service() failed: %s", avahi_strerror(m->server->error)); avahi_s_entry_group_free(hw->entry_group); hw->entry_group = NULL; } else avahi_s_entry_group_commit(hw->entry_group); } - + } else { if (hw->entry_group && !avahi_s_entry_group_is_empty(hw->entry_group)) { @@ -179,7 +179,7 @@ static int interface_mdns_mcast_join(AvahiInterface *i, int join) { if ((i->protocol == AVAHI_PROTO_INET6 && i->monitor->server->fd_ipv6 < 0) || (i->protocol == AVAHI_PROTO_INET && i->monitor->server->fd_ipv4 < 0)) return -1; - + if (join) { AvahiInterfaceAddress *a; @@ -210,7 +210,7 @@ static int interface_mdns_mcast_join(AvahiInterface *i, int join) { r = avahi_mdns_mcast_join_ipv6(i->monitor->server->fd_ipv6, &i->local_mcast_address.data.ipv6, i->hardware->index, join); else { assert(i->protocol == AVAHI_PROTO_INET); - + r = avahi_mdns_mcast_join_ipv4(i->monitor->server->fd_ipv4, &i->local_mcast_address.data.ipv4, i->hardware->index, join); } @@ -218,7 +218,7 @@ static int interface_mdns_mcast_join(AvahiInterface *i, int join) { i->mcast_joined = 0; else i->mcast_joined = join; - + return 0; } @@ -231,11 +231,11 @@ static int interface_mdns_mcast_rejoin(AvahiInterface *i) { /* Check whether old address we joined with is still available. If * not, rejoin using an other address. */ - + for (a = i->addresses; a; a = a->address_next) { if (a->global_scope && !usable) usable = a; - + if (avahi_address_cmp(&a->address, &i->local_mcast_address) == 0) { if (a->global_scope) @@ -250,7 +250,7 @@ static int interface_mdns_mcast_rejoin(AvahiInterface *i) { if (found && !usable) /* No action necessary: the address still exists and no better one has been found */ return 0; - + interface_mdns_mcast_join(i, 0); return interface_mdns_mcast_join(i, 1); } @@ -266,7 +266,7 @@ void avahi_interface_address_free(AvahiInterfaceAddress *a) { avahi_s_entry_group_free(a->entry_group); interface_mdns_mcast_rejoin(a->interface); - + avahi_free(a); } @@ -280,14 +280,14 @@ void avahi_interface_free(AvahiInterface *i, int send_goodbye) { if (i->mcast_joined) interface_mdns_mcast_join(i, 0); - + /* Remove queriers */ avahi_querier_free_all(i); avahi_hashmap_free(i->queriers_by_key); /* Remove local RRs */ avahi_interface_update_rrs(i, 1); - + while (i->addresses) avahi_interface_address_free(i->addresses); @@ -295,10 +295,10 @@ void avahi_interface_free(AvahiInterface *i, int send_goodbye) { avahi_query_scheduler_free(i->query_scheduler); avahi_probe_scheduler_free(i->probe_scheduler); avahi_cache_free(i->cache); - + AVAHI_LLIST_REMOVE(AvahiInterface, interface, i->monitor->interfaces, i); AVAHI_LLIST_REMOVE(AvahiInterface, by_hardware, i->hardware->interfaces, i); - + avahi_free(i); } @@ -306,13 +306,13 @@ void avahi_hw_interface_free(AvahiHwInterface *hw, int send_goodbye) { assert(hw); avahi_hw_interface_update_rrs(hw, 1); - + while (hw->interfaces) avahi_interface_free(hw->interfaces, send_goodbye); if (hw->entry_group) avahi_s_entry_group_free(hw->entry_group); - + AVAHI_LLIST_REMOVE(AvahiHwInterface, hardware, hw->monitor->hw_interfaces, hw); avahi_hashmap_remove(hw->monitor->hashmap, &hw->index); @@ -322,14 +322,14 @@ void avahi_hw_interface_free(AvahiHwInterface *hw, int send_goodbye) { AvahiInterface* avahi_interface_new(AvahiInterfaceMonitor *m, AvahiHwInterface *hw, AvahiProtocol protocol) { AvahiInterface *i; - + assert(m); assert(hw); assert(AVAHI_PROTO_VALID(protocol)); if (!(i = avahi_new(AvahiInterface, 1))) goto fail; /* OOM */ - + i->monitor = m; i->hardware = hw; i->protocol = protocol; @@ -354,7 +354,7 @@ AvahiInterface* avahi_interface_new(AvahiInterfaceMonitor *m, AvahiHwInterface * AVAHI_LLIST_PREPEND(AvahiInterface, interface, m->interfaces, i); return i; - + fail: if (i) { @@ -373,13 +373,13 @@ fail: AvahiHwInterface *avahi_hw_interface_new(AvahiInterfaceMonitor *m, AvahiIfIndex idx) { AvahiHwInterface *hw; - + assert(m); assert(AVAHI_IF_VALID(idx)); if (!(hw = avahi_new(AvahiHwInterface, 1))) return NULL; - + hw->monitor = m; hw->name = NULL; hw->flags_ok = 0; @@ -390,7 +390,7 @@ AvahiHwInterface *avahi_hw_interface_new(AvahiInterfaceMonitor *m, AvahiIfIndex AVAHI_LLIST_HEAD_INIT(AvahiInterface, hw->interfaces); AVAHI_LLIST_PREPEND(AvahiHwInterface, hardware, m->hw_interfaces, hw); - + avahi_hashmap_insert(m->hashmap, &hw->index, hw); if (m->server->fd_ipv4 >= 0 || m->server->config.publish_a_on_ipv6) @@ -441,7 +441,7 @@ void avahi_interface_check_relevant(AvahiInterface *i) { avahi_announce_interface(m->server, i); avahi_multicast_lookup_engine_new_interface(m->server->multicast_lookup_engine, i); } - + } else if (!b && i->announcing) { avahi_log_info("Interface %s.%s no longer relevant for mDNS.", i->hardware->name, avahi_proto_to_string(i->protocol)); @@ -456,14 +456,14 @@ void avahi_interface_check_relevant(AvahiInterface *i) { avahi_cache_flush(i->cache); i->announcing = 0; - + } else interface_mdns_mcast_rejoin(i); } void avahi_hw_interface_check_relevant(AvahiHwInterface *hw) { AvahiInterface *i; - + assert(hw); for (i = hw->interfaces; i; i = i->by_hardware_next) @@ -484,7 +484,7 @@ AvahiInterfaceMonitor *avahi_interface_monitor_new(AvahiServer *s) { if (!(m = avahi_new0(AvahiInterfaceMonitor, 1))) return NULL; /* OOM */ - + m->server = s; m->list_complete = 0; m->hashmap = avahi_hashmap_new(avahi_int_hash, avahi_int_equal, NULL, NULL); @@ -511,7 +511,7 @@ void avahi_interface_monitor_free(AvahiInterfaceMonitor *m) { assert(!m->interfaces); avahi_interface_monitor_free_osdep(m); - + if (m->hashmap) avahi_hashmap_free(m->hashmap); @@ -522,7 +522,7 @@ void avahi_interface_monitor_free(AvahiInterfaceMonitor *m) { AvahiInterface* avahi_interface_monitor_get_interface(AvahiInterfaceMonitor *m, AvahiIfIndex idx, AvahiProtocol protocol) { AvahiHwInterface *hw; AvahiInterface *i; - + assert(m); assert(idx >= 0); assert(protocol != AVAHI_PROTO_UNSPEC); @@ -546,7 +546,7 @@ AvahiHwInterface* avahi_interface_monitor_get_hw_interface(AvahiInterfaceMonitor AvahiInterfaceAddress* avahi_interface_monitor_get_address(AvahiInterfaceMonitor *m, AvahiInterface *i, const AvahiAddress *raddr) { AvahiInterfaceAddress *ia; - + assert(m); assert(i); assert(raddr); @@ -564,7 +564,7 @@ void avahi_interface_send_packet_unicast(AvahiInterface *i, AvahiDnsPacket *p, c if (!i->announcing) return; - + assert(!a || a->proto == i->protocol); if (i->protocol == AVAHI_PROTO_INET && i->monitor->server->fd_ipv4 >= 0) @@ -586,7 +586,7 @@ int avahi_interface_post_query(AvahiInterface *i, AvahiKey *key, int immediately if (!i->announcing) return 0; - + return avahi_query_scheduler_post(i->query_scheduler, key, immediately, ret_id); } @@ -601,14 +601,14 @@ int avahi_interface_post_response(AvahiInterface *i, AvahiRecord *record, int fl if (!i->announcing) return 0; - + return avahi_response_scheduler_post(i->response_scheduler, record, flush_cache, querier, immediately); } int avahi_interface_post_probe(AvahiInterface *i, AvahiRecord *record, int immediately) { assert(i); assert(record); - + if (!i->announcing) return 0; @@ -632,21 +632,42 @@ int avahi_dump_caches(AvahiInterfaceMonitor *m, AvahiDumpCallback callback, void return 0; } -int avahi_interface_is_relevant(AvahiInterface *i) { +static int avahi_interface_is_relevant_internal(AvahiInterface *i) { AvahiInterfaceAddress *a; - + assert(i); if (!i->hardware->flags_ok) return 0; - + for (a = i->addresses; a; a = a->address_next) if (avahi_interface_address_is_relevant(a)) return 1; return 0; } - + +int avahi_interface_is_relevant(AvahiInterface *i) { + AvahiStringList *l; + assert(i); + + for (l = i->monitor->server->config.deny_interfaces; l; l = l->next) + if (strcasecmp((char*) l->text, i->hardware->name) == 0) + return 0; + + if (i->monitor->server->config.allow_interfaces) { + + for (l = i->monitor->server->config.allow_interfaces; l; l = l->next) + if (strcasecmp((char*) l->text, i->hardware->name) == 0) + goto good; + + return 0; + } + +good: + return avahi_interface_is_relevant_internal(i); +} + int avahi_interface_address_is_relevant(AvahiInterfaceAddress *a) { AvahiInterfaceAddress *b; assert(a); @@ -655,12 +676,12 @@ int avahi_interface_address_is_relevant(AvahiInterfaceAddress *a) { if (a->global_scope) return 1; else { - + /* Publish link local IP addresses if they are the only ones on the link */ for (b = a->interface->addresses; b; b = b->address_next) { if (b == a) continue; - + if (b->global_scope) return 0; } @@ -673,7 +694,7 @@ int avahi_interface_address_is_relevant(AvahiInterfaceAddress *a) { int avahi_interface_match(AvahiInterface *i, AvahiIfIndex idx, AvahiProtocol protocol) { assert(i); - + if (idx != AVAHI_IF_UNSPEC && idx != i->hardware->index) return 0; @@ -686,14 +707,14 @@ int avahi_interface_match(AvahiInterface *i, AvahiIfIndex idx, AvahiProtocol pro void avahi_interface_monitor_walk(AvahiInterfaceMonitor *m, AvahiIfIndex interface, AvahiProtocol protocol, AvahiInterfaceMonitorWalkCallback callback, void* userdata) { assert(m); assert(callback); - + if (interface != AVAHI_IF_UNSPEC) { if (protocol != AVAHI_PROTO_UNSPEC) { AvahiInterface *i; - + if ((i = avahi_interface_monitor_get_interface(m, interface, protocol))) callback(m, i, userdata); - + } else { AvahiHwInterface *hw; AvahiInterface *i; @@ -703,10 +724,10 @@ void avahi_interface_monitor_walk(AvahiInterfaceMonitor *m, AvahiIfIndex interfa if (avahi_interface_match(i, interface, protocol)) callback(m, i, userdata); } - + } else { AvahiInterface *i; - + for (i = m->interfaces; i; i = i->interface_next) if (avahi_interface_match(i, interface, protocol)) callback(m, i, userdata); @@ -730,7 +751,7 @@ int avahi_address_is_local(AvahiInterfaceMonitor *m, const AvahiAddress *a) { int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) { AvahiInterfaceAddress *ia; - + assert(i); assert(a); @@ -741,9 +762,9 @@ int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) { if (a->proto == AVAHI_PROTO_INET) { uint32_t m; - + m = ~(((uint32_t) -1) >> ia->prefix_len); - + if ((ntohl(a->data.ipv4.address) & m) == (ntohl(ia->address.data.ipv4.address) & m)) return 1; } else { @@ -752,13 +773,13 @@ int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) { assert(a->proto == AVAHI_PROTO_INET6); pl = ia->prefix_len; - + for (j = 0; j < 16; j++) { uint8_t m; if (pl == 0) return 1; - + if (pl >= 8) { m = 0xFF; pl -= 8; @@ -766,7 +787,7 @@ int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) { m = ~(0xFF >> pl); pl = 0; } - + if ((a->data.ipv6.address[j] & m) != (ia->address.data.ipv6.address[j] & m)) break; } @@ -779,7 +800,7 @@ int avahi_interface_address_on_link(AvahiInterface *i, const AvahiAddress *a) { int avahi_interface_has_address(AvahiInterfaceMonitor *m, AvahiIfIndex iface, const AvahiAddress *a) { AvahiInterface *i; AvahiInterfaceAddress *j; - + assert(m); assert(iface != AVAHI_IF_UNSPEC); assert(a); @@ -809,7 +830,7 @@ AvahiIfIndex avahi_find_interface_for_address(AvahiInterfaceMonitor *m, const Av if (i->protocol != a->proto) continue; - + for (ai = i->addresses; ai; ai = ai->address_next) if (avahi_address_cmp(a, &ai->address) == 0) return i->hardware->index; diff --git a/avahi-core/server.c b/avahi-core/server.c index 453db09..73ae1cb 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -2,17 +2,17 @@ /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -59,7 +59,7 @@ static void enum_aux_records(AvahiServer *s, AvahiInterface *i, const char *name if (type == AVAHI_DNS_TYPE_ANY) { AvahiEntry *e; - + for (e = s->entries; e; e = e->entries_next) if (!e->dead && avahi_entry_is_registered(s, e, i) && @@ -70,14 +70,14 @@ static void enum_aux_records(AvahiServer *s, AvahiInterface *i, const char *name } else { AvahiEntry *e; AvahiKey *k; - + if (!(k = avahi_key_new(name, AVAHI_DNS_CLASS_IN, type))) return; /** OOM */ - + for (e = avahi_hashmap_lookup(s->entries_by_key, k); e; e = e->by_key_next) - if (!e->dead && avahi_entry_is_registered(s, e, i)) + if (!e->dead && avahi_entry_is_registered(s, e, i)) callback(s, e->record, e->flags & AVAHI_PUBLISH_UNIQUE, userdata); - + avahi_key_unref(k); } } @@ -89,7 +89,7 @@ void avahi_server_enumerate_aux_records(AvahiServer *s, AvahiInterface *i, Avahi assert(callback); /* Call the specified callback far all records referenced by the one specified in *r */ - + if (r->key->clazz == AVAHI_DNS_CLASS_IN) { if (r->key->type == AVAHI_DNS_TYPE_PTR) { enum_aux_records(s, i, r->data.ptr.name, AVAHI_DNS_TYPE_SRV, callback, userdata); @@ -121,7 +121,7 @@ void avahi_server_prepare_matching_responses(AvahiServer *s, AvahiInterface *i, AvahiEntry *e; /* Handle ANY query */ - + for (e = s->entries; e; e = e->entries_next) if (!e->dead && avahi_key_pattern_match(k, e->record->key) && avahi_entry_is_registered(s, e, i)) avahi_server_prepare_response(s, i, e, unicast_response, 0); @@ -130,7 +130,7 @@ void avahi_server_prepare_matching_responses(AvahiServer *s, AvahiInterface *i, AvahiEntry *e; /* Handle all other queries */ - + for (e = avahi_hashmap_lookup(s->entries_by_key, k); e; e = e->by_key_next) if (!e->dead && avahi_entry_is_registered(s, e, i)) avahi_server_prepare_response(s, i, e, unicast_response, 0); @@ -145,7 +145,7 @@ void avahi_server_prepare_matching_responses(AvahiServer *s, AvahiInterface *i, if (!(cname_key = avahi_key_new(k->name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_CNAME))) return; - + avahi_server_prepare_matching_responses(s, i, cname_key, unicast_response); avahi_key_unref(cname_key); } @@ -160,11 +160,11 @@ static void withdraw_entry(AvahiServer *s, AvahiEntry *e) { if (e->dead) return; - + if (e->group) { AvahiEntry *k; - - for (k = e->group->entries; k; k = k->by_group_next) + + for (k = e->group->entries; k; k = k->by_group_next) if (!k->dead) { avahi_goodbye_entry(s, k, 0, 1); k->dead = 1; @@ -183,12 +183,12 @@ static void withdraw_entry(AvahiServer *s, AvahiEntry *e) { static void withdraw_rrset(AvahiServer *s, AvahiKey *key) { AvahiEntry *e; - + assert(s); assert(key); /* Withdraw an entry RRSset */ - + for (e = avahi_hashmap_lookup(s->entries_by_key, key); e; e = e->by_key_next) withdraw_entry(s, e); } @@ -196,25 +196,25 @@ static void withdraw_rrset(AvahiServer *s, AvahiKey *key) { static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface *i) { AvahiEntry *e, *n; int ours = 0, won = 0, lost = 0; - + assert(s); assert(record); assert(i); /* Handle incoming probes and check if they conflict our own probes */ - + for (e = avahi_hashmap_lookup(s->entries_by_key, record->key); e; e = n) { int cmp; n = e->by_key_next; if (e->dead) continue; - + if ((cmp = avahi_record_lexicographical_compare(e->record, record)) == 0) { ours = 1; break; } else { - + if (avahi_entry_is_probing(s, e, i)) { if (cmp > 0) won = 1; @@ -226,14 +226,14 @@ static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface * if (!ours) { char *t = avahi_record_to_string(record); - + if (won) avahi_log_debug("Received conflicting probe [%s]. Local host won.", t); else if (lost) { avahi_log_debug("Received conflicting probe [%s]. Local host lost. Withdrawing.", t); withdraw_rrset(s, record->key); } - + avahi_free(t); } } @@ -241,13 +241,13 @@ static void incoming_probe(AvahiServer *s, AvahiRecord *record, AvahiInterface * static int handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *record, int unique) { int valid = 1, ours = 0, conflict = 0, withdraw_immediately = 0; AvahiEntry *e, *n, *conflicting_entry = NULL; - + assert(s); assert(i); assert(record); /* Check whether an incoming record conflicts with one of our own */ - + for (e = avahi_hashmap_lookup(s->entries_by_key, record->key); e; e = n) { n = e->by_key_next; @@ -261,7 +261,7 @@ static int handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *recor char *t; /* Refresh */ - t = avahi_record_to_string(record); + t = avahi_record_to_string(record); avahi_log_debug("Received goodbye record for one of our records [%s]. Refreshing.", t); avahi_server_prepare_matching_responses(s, i, e->record->key, 0); @@ -273,36 +273,36 @@ static int handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *recor /* If the goodybe packet doesn't match one of our own RRs, we simply ignore it. */ continue; } - + if (!(e->flags & AVAHI_PUBLISH_UNIQUE) && !unique) continue; /* Either our entry or the other is intended to be unique, so let's check */ - + if (avahi_record_equal_no_ttl(e->record, record)) { ours = 1; /* We have an identical record, so this is no conflict */ - + /* Check wheter there is a TTL conflict */ if (record->ttl <= e->record->ttl/2 && avahi_entry_is_registered(s, e, i)) { char *t; /* Refresh */ - t = avahi_record_to_string(record); - + t = avahi_record_to_string(record); + avahi_log_debug("Received record with bad TTL [%s]. Refreshing.", t); avahi_server_prepare_matching_responses(s, i, e->record->key, 0); valid = 0; - + avahi_free(t); } - + /* There's no need to check the other entries of this RRset */ break; } else { - + if (avahi_entry_is_registered(s, e, i)) { - + /* A conflict => we have to return to probe mode */ conflict = 1; conflicting_entry = e; @@ -320,11 +320,11 @@ static int handle_conflict(AvahiServer *s, AvahiInterface *i, AvahiRecord *recor if (!ours && conflict) { char *t; - + valid = 0; - t = avahi_record_to_string(record); - + t = avahi_record_to_string(record); + if (withdraw_immediately) { avahi_log_debug("Received conflicting record [%s] with local record to be. Withdrawing.", t); withdraw_rrset(s, record->key); @@ -349,7 +349,7 @@ static void append_aux_callback(AvahiServer *s, AvahiRecord *r, int flush_cache, assert(s); assert(r); assert(unicast_response); - + avahi_record_list_push(s->record_list, r, flush_cache, *unicast_response, 1); } @@ -372,11 +372,11 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP if (!(reply = avahi_dns_packet_new_reply(p, 512 + AVAHI_DNS_PACKET_EXTRA_SIZE /* unicast DNS maximum packet size is 512 */ , 1, 1))) return; /* OOM */ - + while ((r = avahi_record_list_next(s->record_list, NULL, NULL, NULL))) { append_aux_records_to_list(s, i, r, 0); - + if (avahi_dns_packet_append_record(reply, r, 0, 10)) avahi_dns_packet_inc_field(reply, AVAHI_DNS_FIELD_ANCOUNT); else { @@ -402,7 +402,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP immediately, because known answer suppression records might be contained in later packets */ int tc = p && !!(avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS) & AVAHI_DNS_FLAG_TC); - + while ((r = avahi_record_list_next(s->record_list, &flush_cache, &unicast_response, &auxiliary))) { int im = immediately; @@ -411,7 +411,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP * unique entry AND it is not in reply to a truncated * packet AND it is not an auxiliary record AND all other * responses for this record are unique too. */ - + if (flush_cache && !tc && !auxiliary && avahi_record_list_all_flush_cache(s->record_list)) im = 1; @@ -422,21 +422,21 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP * case. Therefore we prepare such a response */ append_aux_records_to_list(s, i, r, unicast_response); - + for (;;) { - + if (!reply) { assert(p); if (!(reply = avahi_dns_packet_new_reply(p, i->hardware->mtu, 0, 0))) break; /* OOM */ } - + if (avahi_dns_packet_append_record(reply, r, flush_cache, 0)) { /* Appending this record succeeded, so incremeant * the specific header field, and return to the caller */ - + avahi_dns_packet_inc_field(reply, AVAHI_DNS_FIELD_ANCOUNT); break; } @@ -456,7 +456,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP /* Appending this record succeeded, so incremeant * the specific header field, and return to the caller */ - + avahi_dns_packet_inc_field(reply, AVAHI_DNS_FIELD_ANCOUNT); break; @@ -465,7 +465,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP /* We completely fucked up, there's * nothing we can do. The RR just doesn't * fit in. Let's ignore it. */ - + char *t; avahi_dns_packet_free(reply); reply = NULL; @@ -487,7 +487,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP } if (reply) { - if (avahi_dns_packet_get_field(reply, AVAHI_DNS_FIELD_ANCOUNT) != 0) + if (avahi_dns_packet_get_field(reply, AVAHI_DNS_FIELD_ANCOUNT) != 0) avahi_interface_send_packet_unicast(i, reply, a, port); avahi_dns_packet_free(reply); } @@ -498,7 +498,7 @@ void avahi_server_generate_response(AvahiServer *s, AvahiInterface *i, AvahiDnsP static void reflect_response(AvahiServer *s, AvahiInterface *i, AvahiRecord *r, int flush_cache) { AvahiInterface *j; - + assert(s); assert(i); assert(r); @@ -525,7 +525,7 @@ static void* reflect_cache_walk_callback(AvahiCache *c, AvahiKey *pattern, Avahi static void reflect_query(AvahiServer *s, AvahiInterface *i, AvahiKey *k) { AvahiInterface *j; - + assert(s); assert(i); assert(k); @@ -547,7 +547,7 @@ static void reflect_query(AvahiServer *s, AvahiInterface *i, AvahiKey *k) { static void reflect_probe(AvahiServer *s, AvahiInterface *i, AvahiRecord *r) { AvahiInterface *j; - + assert(s); assert(i); assert(r); @@ -563,7 +563,7 @@ static void reflect_probe(AvahiServer *s, AvahiInterface *i, AvahiRecord *r) { static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a, uint16_t port, int legacy_unicast, int from_local_iface) { size_t n; int is_probe; - + assert(s); assert(p); assert(i); @@ -572,7 +572,7 @@ static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterfac assert(avahi_record_list_is_empty(s->record_list)); is_probe = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT) > 0; - + /* Handle the questions */ for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_QDCOUNT); n > 0; n --) { AvahiKey *key; @@ -594,7 +594,7 @@ static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterfac /* Allow our own queries to be suppressed by incoming * queries only when they do not include known answers */ avahi_query_scheduler_incoming(i->query_scheduler, key); - + avahi_server_prepare_matching_responses(s, i, key, unicast_response); avahi_key_unref(key); } @@ -605,35 +605,35 @@ static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterfac for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT); n > 0; n --) { AvahiRecord *record; int unique = 0; - + if (!(record = avahi_dns_packet_consume_record(p, &unique))) { avahi_log_warn(__FILE__": Packet too short or invalid while reading known answer record. (Maybe a UTF-8 problem?)"); goto fail; } - + avahi_response_scheduler_suppress(i->response_scheduler, record, a); avahi_record_list_drop(s->record_list, record); avahi_cache_stop_poof(i->cache, record, a); - + avahi_record_unref(record); } - + /* Probe record */ for (n = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT); n > 0; n --) { AvahiRecord *record; int unique = 0; - + if (!(record = avahi_dns_packet_consume_record(p, &unique))) { avahi_log_warn(__FILE__": Packet too short or invalid while reading probe record. (Maybe a UTF-8 problem?)"); goto fail; } - + if (!avahi_key_is_pattern(record->key)) { if (!from_local_iface) reflect_probe(s, i, record); incoming_probe(s, record, i); } - + avahi_record_unref(record); } } @@ -642,14 +642,14 @@ static void handle_query_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterfac avahi_server_generate_response(s, i, p, a, port, legacy_unicast, is_probe); return; - + fail: avahi_record_list_flush(s->record_list); } static void handle_response_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInterface *i, const AvahiAddress *a, int from_local_iface) { unsigned n; - + assert(s); assert(p); assert(i); @@ -660,7 +660,7 @@ static void handle_response_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInter AvahiRecord *record; int cache_flush = 0; /* char *txt; */ - + if (!(record = avahi_dns_packet_consume_record(p, &cache_flush))) { avahi_log_warn(__FILE__": Packet too short or invalid while reading response record. (Maybe a UTF-8 problem?)"); break; @@ -675,7 +675,7 @@ static void handle_response_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInter avahi_response_scheduler_incoming(i->response_scheduler, record, cache_flush); } } - + avahi_record_unref(record); } @@ -689,7 +689,7 @@ static void handle_response_packet(AvahiServer *s, AvahiDnsPacket *p, AvahiInter static AvahiLegacyUnicastReflectSlot* allocate_slot(AvahiServer *s) { unsigned n, idx = (unsigned) -1; AvahiLegacyUnicastReflectSlot *slot; - + assert(s); if (!s->legacy_unicast_reflect_slots) @@ -697,7 +697,7 @@ static AvahiLegacyUnicastReflectSlot* allocate_slot(AvahiServer *s) { for (n = 0; n < AVAHI_LEGACY_UNICAST_REFLECT_SLOTS_MAX; n++, s->legacy_unicast_reflect_id++) { idx = s->legacy_unicast_reflect_id % AVAHI_LEGACY_UNICAST_REFLECT_SLOTS_MAX; - + if (!s->legacy_unicast_reflect_slots[idx]) break; } @@ -711,7 +711,7 @@ static AvahiLegacyUnicastReflectSlot* allocate_slot(AvahiServer *s) { s->legacy_unicast_reflect_slots[idx] = slot; slot->id = s->legacy_unicast_reflect_id++; slot->server = s; - + return slot; } @@ -726,7 +726,7 @@ static void deallocate_slot(AvahiServer *s, AvahiLegacyUnicastReflectSlot *slot) assert(s->legacy_unicast_reflect_slots[idx] == slot); avahi_time_event_free(slot->time_event); - + avahi_free(slot); s->legacy_unicast_reflect_slots[idx] = NULL; } @@ -748,12 +748,12 @@ static void free_slots(AvahiServer *s) { static AvahiLegacyUnicastReflectSlot* find_slot(AvahiServer *s, uint16_t id) { unsigned idx; - + assert(s); if (!s->legacy_unicast_reflect_slots) return NULL; - + idx = id % AVAHI_LEGACY_UNICAST_REFLECT_SLOTS_MAX; if (!s->legacy_unicast_reflect_slots[idx] || s->legacy_unicast_reflect_slots[idx]->id != id) @@ -782,7 +782,7 @@ static void reflect_legacy_unicast_query_packet(AvahiServer *s, AvahiDnsPacket * assert(a); assert(port > 0); assert(i->protocol == a->proto); - + if (!s->config.enable_reflector) return; @@ -810,7 +810,7 @@ static void reflect_legacy_unicast_query_packet(AvahiServer *s, AvahiDnsPacket * /* Patch the packet with our new locally generatet id */ avahi_dns_packet_set_field(p, AVAHI_DNS_FIELD_ID, slot->id); - + for (j = s->monitor->interfaces; j; j = j->interface_next) if (j->announcing && j != i && @@ -833,14 +833,14 @@ static int originates_from_local_legacy_unicast_socket(AvahiServer *s, const Ava if (!s->config.enable_reflector) return 0; - + if (!avahi_address_is_local(s->monitor, address)) return 0; - + if (address->proto == AVAHI_PROTO_INET && s->fd_legacy_unicast_ipv4 >= 0) { struct sockaddr_in lsa; socklen_t l = sizeof(lsa); - + if (getsockname(s->fd_legacy_unicast_ipv4, (struct sockaddr*) &lsa, &l) != 0) avahi_log_warn("getsockname(): %s", strerror(errno)); else @@ -884,7 +884,7 @@ static int originates_from_local_iface(AvahiServer *s, AvahiIfIndex iface, const static void dispatch_packet(AvahiServer *s, AvahiDnsPacket *p, const AvahiAddress *src_address, uint16_t port, const AvahiAddress *dst_address, AvahiIfIndex iface, int ttl) { AvahiInterface *i; int from_local_iface = 0; - + assert(s); assert(p); assert(src_address); @@ -898,6 +898,12 @@ static void dispatch_packet(AvahiServer *s, AvahiDnsPacket *p, const AvahiAddres return; } + if (port <= 0) { + /* This fixes RHBZ #475394 */ + avahi_log_warn("Received packet from invalid source port %u.", (unsigned) port); + return; + } + if (avahi_address_is_ipv4_in_ipv6(src_address)) /* This is an IPv4 address encapsulated in IPv6, so let's ignore it. */ return; @@ -931,36 +937,40 @@ static void dispatch_packet(AvahiServer *s, AvahiDnsPacket *p, const AvahiAddres avahi_log_warn("Invalid legacy unicast query packet."); return; } - + legacy_unicast = 1; } if (legacy_unicast) reflect_legacy_unicast_query_packet(s, p, i, src_address, port); - + handle_query_packet(s, p, i, src_address, port, legacy_unicast, from_local_iface); - + } else { + char t[AVAHI_ADDRESS_STR_MAX]; + if (port != AVAHI_MDNS_PORT) { - avahi_log_warn("Received response with invalid source port %u on interface '%s.%i'", port, i->hardware->name, i->protocol); + avahi_log_warn("Received response from host %s with invalid source port %u on interface '%s.%i'", avahi_address_snprint(t, sizeof(t), src_address), port, i->hardware->name, i->protocol); return; } if (ttl != 255 && s->config.check_response_ttl) { - avahi_log_warn("Received response with invalid TTL %u on interface '%s.%i'.", ttl, i->hardware->name, i->protocol); + avahi_log_warn("Received response from host %s with invalid TTL %u on interface '%s.%i'.", avahi_address_snprint(t, sizeof(t), src_address), ttl, i->hardware->name, i->protocol); return; } if (!is_mdns_mcast_address(dst_address) && !avahi_interface_address_on_link(i, src_address)) { - avahi_log_warn("Received non-local response on interface '%s.%i'.", i->hardware->name, i->protocol); + + avahi_log_warn("Received non-local response from host %s on interface '%s.%i'.", avahi_address_snprint(t, sizeof(t), src_address), i->hardware->name, i->protocol); return; } - + if (avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_QDCOUNT) != 0 || avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_ANCOUNT) == 0 || avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_NSCOUNT) != 0) { - avahi_log_warn("Invalid response packet."); + + avahi_log_warn("Invalid response packet from host %s.", avahi_address_snprint(t, sizeof(t), src_address)); return; } @@ -971,7 +981,7 @@ static void dispatch_packet(AvahiServer *s, AvahiDnsPacket *p, const AvahiAddres static void dispatch_legacy_unicast_packet(AvahiServer *s, AvahiDnsPacket *p) { AvahiInterface *j; AvahiLegacyUnicastReflectSlot *slot; - + assert(s); assert(p); @@ -1001,7 +1011,7 @@ static void dispatch_legacy_unicast_packet(AvahiServer *s, AvahiDnsPacket *p) { static void cleanup_dead(AvahiServer *s) { assert(s); - + avahi_cleanup_dead_entries(s); avahi_browser_cleanup(s); } @@ -1017,7 +1027,7 @@ static void mcast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, vo assert(w); assert(fd >= 0); assert(events & AVAHI_WATCH_IN); - + if (fd == s->fd_ipv4) { dest.proto = src.proto = AVAHI_PROTO_INET; p = avahi_recv_dns_packet_ipv4(s->fd_ipv4, &src.data.ipv4, &port, &dest.data.ipv4, &iface, &ttl); @@ -1026,11 +1036,11 @@ static void mcast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent events, vo dest.proto = src.proto = AVAHI_PROTO_INET6; p = avahi_recv_dns_packet_ipv6(s->fd_ipv6, &src.data.ipv6, &port, &dest.data.ipv6, &iface, &ttl); } - + if (p) { - if (iface == AVAHI_IF_UNSPEC) + if (iface == AVAHI_IF_UNSPEC) iface = avahi_find_interface_for_address(s->monitor, &dest); - + if (iface != AVAHI_IF_UNSPEC) dispatch_packet(s, p, &src, port, &dest, iface, ttl); else @@ -1049,7 +1059,7 @@ static void legacy_unicast_socket_event(AvahiWatch *w, int fd, AvahiWatchEvent e assert(w); assert(fd >= 0); assert(events & AVAHI_WATCH_IN); - + if (fd == s->fd_legacy_unicast_ipv4) p = avahi_recv_dns_packet_ipv4(s->fd_legacy_unicast_ipv4, NULL, NULL, NULL, NULL, NULL); else { @@ -1070,11 +1080,11 @@ static void server_set_state(AvahiServer *s, AvahiServerState state) { if (s->state == state) return; - + s->state = state; avahi_interface_monitor_update_rrs(s->monitor, 0); - + if (s->callback) s->callback(s, state, s->userdata); } @@ -1094,7 +1104,7 @@ static void withdraw_host_rrs(AvahiServer *s) { void avahi_server_decrease_host_rr_pending(AvahiServer *s) { assert(s); - + assert(s->n_host_rr_pending > 0); if (--s->n_host_rr_pending == 0) @@ -1108,12 +1118,12 @@ void avahi_host_rr_entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, Ava if (state == AVAHI_ENTRY_GROUP_REGISTERING && s->state == AVAHI_SERVER_REGISTERING) s->n_host_rr_pending ++; - + else if (state == AVAHI_ENTRY_GROUP_COLLISION && (s->state == AVAHI_SERVER_REGISTERING || s->state == AVAHI_SERVER_RUNNING)) { withdraw_host_rrs(s); server_set_state(s, AVAHI_SERVER_COLLISION); - + } else if (state == AVAHI_ENTRY_GROUP_ESTABLISHED && s->state == AVAHI_SERVER_REGISTERING) avahi_server_decrease_host_rr_pending(s); @@ -1122,9 +1132,9 @@ void avahi_host_rr_entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, Ava static void register_hinfo(AvahiServer *s) { struct utsname utsname; AvahiRecord *r; - + assert(s); - + if (!s->config.publish_hinfo) return; @@ -1137,19 +1147,19 @@ static void register_hinfo(AvahiServer *s) { avahi_log_warn("Failed to create HINFO entry group: %s", avahi_strerror(s->error)); return; } - + /* Fill in HINFO rr */ if ((r = avahi_record_new_full(s->host_name_fqdn, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_HINFO, AVAHI_DEFAULT_TTL_HOST_NAME))) { if (uname(&utsname) < 0) avahi_log_warn("uname() failed: %s\n", avahi_strerror(errno)); else { - + r->data.hinfo.cpu = avahi_strdup(avahi_strup(utsname.machine)); r->data.hinfo.os = avahi_strdup(avahi_strup(utsname.sysname)); - + avahi_log_info("Registering HINFO record with values '%s'/'%s'.", r->data.hinfo.cpu, r->data.hinfo.os); - + if (avahi_server_add(s, s->hinfo_entry_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UNIQUE, r) < 0) { avahi_log_warn("Failed to add HINFO RR: %s", avahi_strerror(s->error)); return; @@ -1167,7 +1177,7 @@ static void register_hinfo(AvahiServer *s) { static void register_localhost(AvahiServer *s) { AvahiAddress a; assert(s); - + /* Add localhost entries */ avahi_address_parse("127.0.0.1", AVAHI_PROTO_INET, &a); avahi_server_add_address(s, NULL, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_NO_PROBE|AVAHI_PUBLISH_NO_ANNOUNCE, "localhost", &a); @@ -1194,7 +1204,7 @@ static void register_browse_domain(AvahiServer *s) { avahi_log_warn("Failed to create browse domain entry group: %s", avahi_strerror(s->error)); return; } - + if (avahi_server_add_ptr(s, s->browse_domain_entry_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, AVAHI_DEFAULT_TTL, "b._dns-sd._udp.local", s->domain_name) < 0) { avahi_log_warn("Failed to add browse domain RR: %s", avahi_strerror(s->error)); return; @@ -1215,14 +1225,14 @@ static void register_stuff(AvahiServer *s) { avahi_interface_monitor_update_rrs(s->monitor, 0); s->n_host_rr_pending --; - + if (s->n_host_rr_pending == 0) server_set_state(s, AVAHI_SERVER_RUNNING); } static void update_fqdn(AvahiServer *s) { char *n; - + assert(s); assert(s->host_name); assert(s->domain_name); @@ -1237,7 +1247,7 @@ static void update_fqdn(AvahiServer *s) { int avahi_server_set_host_name(AvahiServer *s, const char *host_name) { char *hn = NULL; assert(s); - + AVAHI_CHECK_VALIDITY(s, !host_name || avahi_is_valid_host_name(host_name), AVAHI_ERR_INVALID_HOST_NAME); if (!host_name) { @@ -1250,12 +1260,12 @@ int avahi_server_set_host_name(AvahiServer *s, const char *host_name) { avahi_free(hn); return avahi_server_set_errno(s, AVAHI_ERR_NO_CHANGE); } - + withdraw_host_rrs(s); avahi_free(s->host_name); s->host_name = hn ? hn : avahi_strdup(host_name); - + update_fqdn(s); register_stuff(s); @@ -1272,7 +1282,7 @@ int avahi_server_set_domain_name(AvahiServer *s, const char *domain_name) { dn = avahi_strdup("local"); domain_name = dn; } - + if (avahi_domain_equal(s->domain_name, domain_name)) { avahi_free(dn); return avahi_server_set_errno(s, AVAHI_ERR_NO_CHANGE); @@ -1297,10 +1307,10 @@ static int valid_server_config(const AvahiServerConfig *sc) { if (sc->n_wide_area_servers > AVAHI_WIDE_AREA_SERVERS_MAX) return AVAHI_ERR_INVALID_CONFIG; - + if (sc->host_name && !avahi_is_valid_host_name(sc->host_name)) return AVAHI_ERR_INVALID_HOST_NAME; - + if (sc->domain_name && !avahi_is_valid_domain_name(sc->domain_name)) return AVAHI_ERR_INVALID_DOMAIN_NAME; @@ -1313,10 +1323,10 @@ static int valid_server_config(const AvahiServerConfig *sc) { static int setup_sockets(AvahiServer *s) { assert(s); - + s->fd_ipv4 = s->config.use_ipv4 ? avahi_open_socket_ipv4(s->config.disallow_other_stacks) : -1; s->fd_ipv6 = s->config.use_ipv6 ? avahi_open_socket_ipv6(s->config.disallow_other_stacks) : -1; - + if (s->fd_ipv6 < 0 && s->fd_ipv4 < 0) return AVAHI_ERR_NO_NETWORK; @@ -1327,35 +1337,35 @@ static int setup_sockets(AvahiServer *s) { s->fd_legacy_unicast_ipv4 = s->fd_ipv4 >= 0 && s->config.enable_reflector ? avahi_open_unicast_socket_ipv4() : -1; s->fd_legacy_unicast_ipv6 = s->fd_ipv6 >= 0 && s->config.enable_reflector ? avahi_open_unicast_socket_ipv6() : -1; - + s->watch_ipv4 = s->watch_ipv6 = s->watch_legacy_unicast_ipv4 = s->watch_legacy_unicast_ipv6 = NULL; - + if (s->fd_ipv4 >= 0) s->watch_ipv4 = s->poll_api->watch_new(s->poll_api, s->fd_ipv4, AVAHI_WATCH_IN, mcast_socket_event, s); if (s->fd_ipv6 >= 0) s->watch_ipv6 = s->poll_api->watch_new(s->poll_api, s->fd_ipv6, AVAHI_WATCH_IN, mcast_socket_event, s); - + if (s->fd_legacy_unicast_ipv4 >= 0) s->watch_legacy_unicast_ipv4 = s->poll_api->watch_new(s->poll_api, s->fd_legacy_unicast_ipv4, AVAHI_WATCH_IN, legacy_unicast_socket_event, s); if (s->fd_legacy_unicast_ipv6 >= 0) s->watch_legacy_unicast_ipv6 = s->poll_api->watch_new(s->poll_api, s->fd_legacy_unicast_ipv6, AVAHI_WATCH_IN, legacy_unicast_socket_event, s); - + return 0; } AvahiServer *avahi_server_new(const AvahiPoll *poll_api, const AvahiServerConfig *sc, AvahiServerCallback callback, void* userdata, int *error) { AvahiServer *s; int e; - + if (sc && (e = valid_server_config(sc)) < 0) { if (error) *error = e; return NULL; } - + if (!(s = avahi_new(AvahiServer, 1))) { if (error) *error = AVAHI_ERR_NO_MEMORY; @@ -1376,10 +1386,10 @@ AvahiServer *avahi_server_new(const AvahiPoll *poll_api, const AvahiServerConfig avahi_server_config_free(&s->config); avahi_free(s); - + return NULL; } - + s->n_host_rr_pending = 0; s->need_entry_cleanup = 0; s->need_group_cleanup = 0; @@ -1412,7 +1422,7 @@ AvahiServer *avahi_server_new(const AvahiPoll *poll_api, const AvahiServerConfig s->legacy_unicast_reflect_id = 0; s->record_list = avahi_record_list_new(); - + /* Get host name */ s->host_name = s->config.host_name ? avahi_normalize_name_strdup(s->config.host_name) : avahi_get_host_name_strdup(); s->host_name[strcspn(s->host_name, ".")] = 0; @@ -1431,13 +1441,13 @@ AvahiServer *avahi_server_new(const AvahiPoll *poll_api, const AvahiServerConfig s->wide_area_lookup_engine = NULL; s->multicast_lookup_engine = avahi_multicast_lookup_engine_new(s); - + s->monitor = avahi_interface_monitor_new(s); avahi_interface_monitor_sync(s->monitor); register_localhost(s); register_stuff(s); - + return s; } @@ -1462,7 +1472,7 @@ void avahi_server_free(AvahiServer* s) { avahi_s_service_resolver_free(s->service_resolvers); while (s->record_browsers) avahi_s_record_browser_destroy(s->record_browsers); - + /* Remove all locally rgeistered stuff */ while(s->entries) @@ -1484,33 +1494,33 @@ void avahi_server_free(AvahiServer* s) { avahi_multicast_lookup_engine_free(s->multicast_lookup_engine); avahi_time_event_queue_free(s->time_event_queue); - + /* Free watches */ - + if (s->watch_ipv4) s->poll_api->watch_free(s->watch_ipv4); if (s->watch_ipv6) s->poll_api->watch_free(s->watch_ipv6); - + if (s->watch_legacy_unicast_ipv4) s->poll_api->watch_free(s->watch_legacy_unicast_ipv4); if (s->watch_legacy_unicast_ipv6) s->poll_api->watch_free(s->watch_legacy_unicast_ipv6); /* Free sockets */ - + if (s->fd_ipv4 >= 0) close(s->fd_ipv4); if (s->fd_ipv6 >= 0) close(s->fd_ipv6); - + if (s->fd_legacy_unicast_ipv4 >= 0) close(s->fd_legacy_unicast_ipv4); if (s->fd_legacy_unicast_ipv6 >= 0) close(s->fd_legacy_unicast_ipv6); - + /* Free other stuff */ - + avahi_free(s->host_name); avahi_free(s->domain_name); avahi_free(s->host_name_fqdn); @@ -1562,6 +1572,8 @@ AvahiServerConfig* avahi_server_config_init(AvahiServerConfig *c) { memset(c, 0, sizeof(AvahiServerConfig)); c->use_ipv6 = 1; c->use_ipv4 = 1; + c->allow_interfaces = NULL; + c->deny_interfaces = NULL; c->host_name = NULL; c->domain_name = NULL; c->check_response_ttl = 0; @@ -1581,7 +1593,7 @@ AvahiServerConfig* avahi_server_config_init(AvahiServerConfig *c) { c->allow_point_to_point = 0; c->publish_aaaa_on_ipv4 = 1; c->publish_a_on_ipv6 = 0; - + return c; } @@ -1591,11 +1603,13 @@ void avahi_server_config_free(AvahiServerConfig *c) { avahi_free(c->host_name); avahi_free(c->domain_name); avahi_string_list_free(c->browse_domains); + avahi_string_list_free(c->allow_interfaces); + avahi_string_list_free(c->deny_interfaces); } AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiServerConfig *c) { char *d = NULL, *h = NULL; - AvahiStringList *l = NULL; + AvahiStringList *browse = NULL, *allow = NULL, *deny = NULL; assert(ret); assert(c); @@ -1609,23 +1623,40 @@ AvahiServerConfig* avahi_server_config_copy(AvahiServerConfig *ret, const AvahiS return NULL; } - if (!(l = avahi_string_list_copy(c->browse_domains)) && c->browse_domains) { + if (!(browse = avahi_string_list_copy(c->browse_domains)) && c->browse_domains) { + avahi_free(h); + avahi_free(d); + return NULL; + } + + if (!(allow = avahi_string_list_copy(c->allow_interfaces)) && c->allow_interfaces) { + avahi_string_list_free(browse); + avahi_free(h); + avahi_free(d); + return NULL; + } + + if (!(deny = avahi_string_list_copy(c->deny_interfaces)) && c->deny_interfaces) { + avahi_string_list_free(allow); + avahi_string_list_free(browse); avahi_free(h); avahi_free(d); return NULL; } - + *ret = *c; ret->host_name = h; ret->domain_name = d; - ret->browse_domains = l; + ret->browse_domains = browse; + ret->allow_interfaces = allow; + ret->deny_interfaces = deny; return ret; } int avahi_server_errno(AvahiServer *s) { assert(s); - + return s->error; } @@ -1644,7 +1675,7 @@ uint32_t avahi_server_get_local_service_cookie(AvahiServer *s) { static AvahiEntry *find_entry(AvahiServer *s, AvahiIfIndex interface, AvahiProtocol protocol, AvahiKey *key) { AvahiEntry *e; - + assert(s); assert(key); @@ -1664,7 +1695,7 @@ int avahi_server_get_group_of_service(AvahiServer *s, AvahiIfIndex interface, Av AvahiEntry *e; int ret; char n[AVAHI_DOMAIN_NAME_MAX]; - + assert(s); assert(name); assert(type); @@ -1678,7 +1709,7 @@ int avahi_server_get_group_of_service(AvahiServer *s, AvahiIfIndex interface, Av if ((ret = avahi_service_name_join(n, sizeof(n), name, type, domain) < 0)) return avahi_server_set_errno(s, ret); - + if (!(key = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) return avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY); @@ -1702,7 +1733,7 @@ int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex interface, AvahiP if (!s->host_name_fqdn) return 0; - + if (!(key = avahi_key_new(name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) return 0; @@ -1711,7 +1742,7 @@ int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex interface, AvahiP if (!e) return 0; - + return avahi_domain_equal(s->host_name_fqdn, e->record->data.srv.name); } @@ -1720,7 +1751,7 @@ int avahi_server_is_record_local(AvahiServer *s, AvahiIfIndex interface, AvahiPr assert(s); assert(record); - + for (e = avahi_hashmap_lookup(s->entries_by_key, record->key); e; e = e->by_key_next) if ((e->interface == interface || e->interface <= 0 || interface <= 0) && @@ -1752,13 +1783,13 @@ const AvahiServerConfig* avahi_server_get_config(AvahiServer *s) { /** Set the browsing domains */ int avahi_server_set_browse_domains(AvahiServer *s, AvahiStringList *domains) { AvahiStringList *l; - + assert(s); for (l = s->config.browse_domains; l; l = l->next) if (!avahi_is_valid_domain_name((char*) l->text)) return avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME); - + avahi_string_list_free(s->config.browse_domains); s->config.browse_domains = avahi_string_list_copy(domains); diff --git a/avahi-daemon/Makefile.am b/avahi-daemon/Makefile.am index 622b4de..0aac0fc 100644 --- a/avahi-daemon/Makefile.am +++ b/avahi-daemon/Makefile.am @@ -53,8 +53,7 @@ avahi_daemon_SOURCES = \ static-hosts.c static-hosts.h \ ini-file-parser.c ini-file-parser.h \ setproctitle.c setproctitle.h \ - ../avahi-client/check-nss.c \ - inotify-nosys.h + ../avahi-client/check-nss.c avahi_daemon_CFLAGS = $(AM_CFLAGS) $(LIBDAEMON_CFLAGS) $(XML_CFLAGS) avahi_daemon_LDADD = $(AM_LDADD) ../avahi-common/libavahi-common.la ../avahi-core/libavahi-core.la $(LIBDAEMON_LIBS) $(XML_LIBS) diff --git a/avahi-daemon/avahi-daemon.conf b/avahi-daemon/avahi-daemon.conf index 69df050..ad69c73 100644 --- a/avahi-daemon/avahi-daemon.conf +++ b/avahi-daemon/avahi-daemon.conf @@ -26,6 +26,8 @@ browse-domains=0pointer.de, zeroconf.org use-ipv4=yes use-ipv6=no +#allow-interfaces=eth0 +#deny-interfaces=eth1 #check-response-ttl=no #use-iff-running=no #enable-dbus=yes diff --git a/avahi-daemon/inotify-nosys.h b/avahi-daemon/inotify-nosys.h deleted file mode 100644 index 6af44dc..0000000 --- a/avahi-daemon/inotify-nosys.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This header is used if cannot be found. - * - * Inode based directory notification for Linux - * - * Copyright (C) 2005 John McCutchan - */ - -#ifndef _LINUX_INOTIFY_H -#define _LINUX_INOTIFY_H - -#include -#include -#include -#include - -/* - * struct inotify_event - structure read from the inotify device for each event - * - * When you are watching a directory, you will receive the filename for events - * such as IN_CREATE, IN_DELETE, IN_OPEN, IN_CLOSE, ..., relative to the wd. - */ -struct inotify_event { - int wd; /* watch descriptor */ - uint32_t mask; /* watch mask */ - uint32_t cookie; /* cookie to synchronize two events */ - uint32_t len; /* length (including nulls) of name */ - char name __flexarr; /* stub for possible name */ -}; - -/* the following are legal, implemented events that user-space can watch for */ -#define IN_ACCESS 0x00000001 /* File was accessed */ -#define IN_MODIFY 0x00000002 /* File was modified */ -#define IN_ATTRIB 0x00000004 /* Metadata changed */ -#define IN_CLOSE_WRITE 0x00000008 /* Writtable file was closed */ -#define IN_CLOSE_NOWRITE 0x00000010 /* Unwrittable file closed */ -#define IN_OPEN 0x00000020 /* File was opened */ -#define IN_MOVED_FROM 0x00000040 /* File was moved from X */ -#define IN_MOVED_TO 0x00000080 /* File was moved to Y */ -#define IN_CREATE 0x00000100 /* Subfile was created */ -#define IN_DELETE 0x00000200 /* Subfile was deleted */ -#define IN_DELETE_SELF 0x00000400 /* Self was deleted */ -#define IN_MOVE_SELF 0x00000800 /* Self was moved */ - -/* the following are legal events. they are sent as needed to any watch */ -#define IN_UNMOUNT 0x00002000 /* Backing fs was unmounted */ -#define IN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */ -#define IN_IGNORED 0x00008000 /* File was ignored */ - -/* helper events */ -#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */ -#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO) /* moves */ - -/* special flags */ -#define IN_ONLYDIR 0x01000000 /* only watch the path if it is a directory */ -#define IN_DONT_FOLLOW 0x02000000 /* don't follow a sym link */ -#define IN_MASK_ADD 0x20000000 /* add to the mask of an already existing watch */ -#define IN_ISDIR 0x40000000 /* event occurred against dir */ -#define IN_ONESHOT 0x80000000 /* only send event once */ - -/* - * All of the events - we build the list by hand so that we can add flags in - * the future and not break backward compatibility. Apps will get only the - * events that they originally wanted. Be sure to add new events here! - */ -#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \ - IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \ - IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \ - IN_MOVE_SELF) - -#if 0 -#if defined (__alpha__) -# define __NR_inotify_init 444 -# define __NR_inotify_add_watch 445 -# define __NR_inotify_rm_watch 446 - -#elif defined (__arm__) -# define __NR_inotify_init (__NR_SYSCALL_BASE+316) -# define __NR_inotify_add_watch (__NR_SYSCALL_BASE+317) -# define __NR_inotify_rm_watch (__NR_SYSCALL_BASE+318) - -#elif defined (__frv__) -# define __NR_inotify_init 291 -# define __NR_inotify_add_watch 292 -# define __NR_inotify_rm_watch 293 - -#elif defined(__i386__) -# define __NR_inotify_init 291 -# define __NR_inotify_add_watch 292 -# define __NR_inotify_rm_watch 293 - -#elif defined (__ia64__) -# define __NR_inotify_init 1277 -# define __NR_inotify_add_watch 1278 -# define __NR_inotify_rm_watch 1279 - -#elif defined (__mips__) -# if _MIPS_SIM == _MIPS_SIM_ABI32 -# define __NR_inotify_init (__NR_Linux + 284) -# define __NR_inotify_add_watch (__NR_Linux + 285) -# define __NR_inotify_rm_watch (__NR_Linux + 286) -# endif -# if _MIPS_SIM == _MIPS_SIM_ABI64 -# define __NR_inotify_init (__NR_Linux + 243) -# define __NR_inotify_add_watch (__NR_Linux + 243) -# define __NR_inotify_rm_watch (__NR_Linux + 243) -# endif -# if _MIPS_SIM == _MIPS_SIM_NABI32 -# define __NR_inotify_init (__NR_Linux + 247) -# define __NR_inotify_add_watch (__NR_Linux + 248) -# define __NR_inotify_rm_watch (__NR_Linux + 249) -# endif - -#elif defined(__parisc__) -# define __NR_inotify_init (__NR_Linux + 269) -# define __NR_inotify_add_watch (__NR_Linux + 270) -# define __NR_inotify_rm_watch (__NR_Linux + 271) - -#elif defined(__powerpc__) || defined(__powerpc64__) -# define __NR_inotify_init 275 -# define __NR_inotify_add_watch 276 -# define __NR_inotify_rm_watch 277 - -#elif defined (__s390__) -# define __NR_inotify_init 284 -# define __NR_inotify_add_watch 285 -# define __NR_inotify_rm_watch 286 - -#elif defined (__sh__) -# define __NR_inotify_init 290 -# define __NR_inotify_add_watch 291 -# define __NR_inotify_rm_watch 292 - -#elif defined (__sh64__) -# define __NR_inotify_init 318 -# define __NR_inotify_add_watch 319 -# define __NR_inotify_rm_watch 320 - -#elif defined (__sparc__) || defined (__sparc64__) -# define __NR_inotify_init 151 -# define __NR_inotify_add_watch 152 -# define __NR_inotify_rm_watch 156 - -#elif defined(__x86_64__) -# define __NR_inotify_init 253 -# define __NR_inotify_add_watch 254 -# define __NR_inotify_rm_watch 255 - -#else -# error "Unsupported architecture!" -#endif -#endif - -#ifndef __NR_inotify_init -# error "Unsupported architecture!" -#endif -#ifndef __NR_inotify_add_watch -# error "Unsupported architecture!" -#endif -#ifndef __NR_inotify_rm_watch -# error "Unsupported architecture!" -#endif - - -static inline int inotify_init (void) -{ - return syscall (__NR_inotify_init); -} - -static inline int inotify_add_watch (int fd, const char *name, uint32_t mask) -{ - return syscall (__NR_inotify_add_watch, fd, name, mask); -} - -static inline int inotify_rm_watch (int fd, uint32_t wd) -{ - return syscall (__NR_inotify_rm_watch, fd, wd); -} - - -#endif /* _LINUX_INOTIFY_H */ diff --git a/avahi-daemon/main.c b/avahi-daemon/main.c index d8f9aa6..c3cbb0e 100644 --- a/avahi-daemon/main.c +++ b/avahi-daemon/main.c @@ -2,17 +2,17 @@ /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -43,11 +43,7 @@ #include #ifdef HAVE_INOTIFY -#ifdef HAVE_SYS_INOTIFY_H #include -#else -#include "inotify-nosys.h" -#endif #endif #ifdef HAVE_KQUEUE @@ -148,7 +144,7 @@ static int has_prefix(const char *s, const char *prefix) { size_t l; l = strlen(prefix); - + return strlen(s) >= l && strncmp(s, prefix, l) == 0; } @@ -156,19 +152,19 @@ static int load_resolv_conf(void) { int ret = -1; FILE *f; int i = 0, j = 0; - + avahi_strfreev(resolv_conf_name_servers); resolv_conf_name_servers = NULL; avahi_strfreev(resolv_conf_search_domains); resolv_conf_search_domains = NULL; - + #ifdef ENABLE_CHROOT f = avahi_chroot_helper_get_file(RESOLV_CONF); #else f = fopen(RESOLV_CONF, "r"); #endif - + if (!f) { avahi_log_warn("Failed to open "RESOLV_CONF": %s", strerror(errno)); goto finish; @@ -223,7 +219,7 @@ finish: if (ret != 0) { avahi_strfreev(resolv_conf_name_servers); resolv_conf_name_servers = NULL; - + avahi_strfreev(resolv_conf_search_domains); resolv_conf_search_domains = NULL; } @@ -240,14 +236,14 @@ static AvahiSEntryGroup* add_dns_servers(AvahiServer *s, AvahiSEntryGroup* g, ch assert(s); assert(l); - if (!g) + if (!g) g = avahi_s_entry_group_new(s, NULL, NULL); assert(avahi_s_entry_group_is_empty(g)); for (p = l; *p; p++) { AvahiAddress a; - + if (!avahi_address_parse(*p, AVAHI_PROTO_UNSPEC, &a)) avahi_log_warn("Failed to parse address '%s', ignoring.", *p); else @@ -267,8 +263,8 @@ static void remove_dns_server_entry_groups(void) { if (resolv_conf_entry_group) avahi_s_entry_group_reset(resolv_conf_entry_group); - - if (dns_servers_entry_group) + + if (dns_servers_entry_group) avahi_s_entry_group_reset(dns_servers_entry_group); } @@ -297,10 +293,10 @@ static AvahiStringList *filter_duplicate_domains(AvahiStringList *l) { if (!l) return l; - + for (p = l, e = l->next; e; e = n) { n = e->next; - + if (avahi_domain_equal((char*) e->text, (char*) l->text)) { p->next = e->next; avahi_free(e); @@ -323,7 +319,7 @@ static void update_browse_domains(void) { } l = avahi_string_list_copy(config.server_config.browse_domains); - + for (p = resolv_conf_search_domains, n = 0; *p && n < BROWSE_DOMAINS_MAX; p++, n++) { if (!avahi_is_valid_domain_name(*p)) avahi_log_warn("'%s' is no valid domain name, ignoring.", *p); @@ -332,13 +328,13 @@ static void update_browse_domains(void) { } l = filter_duplicate_domains(l); - + avahi_server_set_browse_domains(avahi_server, l); } static void server_callback(AvahiServer *s, AvahiServerState state, void *userdata) { DaemonConfig *c = userdata; - + assert(s); assert(c); @@ -346,7 +342,7 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda * avahi_server has been set, therefore we do it explicitly */ avahi_server = s; - + #ifdef HAVE_DBUS if (c->enable_dbus && state != AVAHI_SERVER_INVALID && state != AVAHI_SERVER_FAILURE) dbus_protocol_server_state_changed(state); @@ -355,28 +351,28 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda 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)); - + avahi_set_proc_title(argv0, "%s: running [%s]", argv0, avahi_server_get_host_name_fqdn(s)); - + static_service_add_to_server(); static_hosts_add_to_server(); - + remove_dns_server_entry_groups(); - + if (c->publish_resolv_conf && resolv_conf_name_servers && resolv_conf_name_servers[0]) resolv_conf_entry_group = add_dns_servers(s, resolv_conf_entry_group, resolv_conf_name_servers); - + 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; - + avahi_set_proc_title(argv0, "%s: collision", argv0); - + static_service_remove_from_server(); static_hosts_remove_from_server(); remove_dns_server_entry_groups(); @@ -398,16 +394,16 @@ static void server_callback(AvahiServer *s, AvahiServerState state, void *userda case AVAHI_SERVER_REGISTERING: avahi_set_proc_title(argv0, "%s: registering [%s]", argv0, avahi_server_get_host_name_fqdn(s)); - + static_service_remove_from_server(); static_hosts_remove_from_server(); remove_dns_server_entry_groups(); - + break; case AVAHI_SERVER_INVALID: break; - + } } @@ -425,9 +421,9 @@ static void help(FILE *f) { " "AVAHI_CONFIG_FILE"\n" " --no-rlimits Don't enforce resource limits\n" " --no-drop-root Don't drop privileges\n" -#ifdef ENABLE_CHROOT +#ifdef ENABLE_CHROOT " --no-chroot Don't chroot()\n" -#endif +#endif " --no-proc-title Don't modify process title\n" " --debug Increase verbosity\n", argv0); @@ -440,13 +436,13 @@ static int parse_command_line(DaemonConfig *c, int argc, char *argv[]) { enum { OPTION_NO_RLIMITS = 256, OPTION_NO_DROP_ROOT, -#ifdef ENABLE_CHROOT +#ifdef ENABLE_CHROOT OPTION_NO_CHROOT, #endif OPTION_NO_PROC_TITLE, OPTION_DEBUG }; - + static const struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "daemonize", no_argument, NULL, 'D' }, @@ -522,13 +518,13 @@ static int parse_command_line(DaemonConfig *c, int argc, char *argv[]) { fprintf(stderr, "Too many arguments\n"); return -1; } - + return 0; } static int is_yes(const char *s) { assert(s); - + return *s == 'y' || *s == 'Y' || *s == '1' || *s == 't' || *s == 'T'; } @@ -541,9 +537,9 @@ static int load_config_file(DaemonConfig *c) { if (!(f = avahi_ini_file_load(c->config_file ? c->config_file : AVAHI_CONFIG_FILE))) goto finish; - + for (g = f->groups; g; g = g->groups_next) { - + if (strcasecmp(g->name, "server") == 0) { AvahiIniFilePair *p; @@ -559,7 +555,7 @@ static int load_config_file(DaemonConfig *c) { char **e, **t; e = avahi_split_csv(p->value); - + for (t = e; *t; t++) { char cleaned[AVAHI_DOMAIN_NAME_MAX]; @@ -571,7 +567,7 @@ static int load_config_file(DaemonConfig *c) { c->server_config.browse_domains = avahi_string_list_add(c->server_config.browse_domains, cleaned); } - + avahi_strfreev(e); c->server_config.browse_domains = filter_duplicate_domains(c->server_config.browse_domains); @@ -601,17 +597,39 @@ static int load_config_file(DaemonConfig *c) { } } #endif - else { + else if (strcasecmp(p->key, "allow-interfaces") == 0) { + char **e, **t; + + avahi_string_list_free(c->server_config.allow_interfaces); + c->server_config.allow_interfaces = NULL; + e = avahi_split_csv(p->value); + + for (t = e; *t; t++) + c->server_config.allow_interfaces = avahi_string_list_add(c->server_config.allow_interfaces, *t); + + avahi_strfreev(e); + } else if (strcasecmp(p->key, "deny-interfaces") == 0) { + char **e, **t; + + avahi_string_list_free(c->server_config.deny_interfaces); + c->server_config.deny_interfaces = NULL; + e = avahi_split_csv(p->value); + + for (t = e; *t; t++) + c->server_config.deny_interfaces = avahi_string_list_add(c->server_config.deny_interfaces, *t); + + avahi_strfreev(e); + } else { avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name); goto finish; } } - + } else if (strcasecmp(g->name, "publish") == 0) { AvahiIniFilePair *p; for (p = g->pairs; p; p = p->pairs_next) { - + if (strcasecmp(p->key, "publish-addresses") == 0) c->server_config.publish_addresses = is_yes(p->value); else if (strcasecmp(p->key, "publish-hinfo") == 0) @@ -645,7 +663,7 @@ static int load_config_file(DaemonConfig *c) { 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 { @@ -653,12 +671,12 @@ static int load_config_file(DaemonConfig *c) { goto finish; } } - + } else if (strcasecmp(g->name, "reflector") == 0) { AvahiIniFilePair *p; for (p = g->pairs; p; p = p->pairs_next) { - + if (strcasecmp(p->key, "enable-reflector") == 0) c->server_config.enable_reflector = is_yes(p->value); else if (strcasecmp(p->key, "reflect-ipv") == 0) @@ -668,12 +686,12 @@ static int load_config_file(DaemonConfig *c) { goto finish; } } - + } else if (strcasecmp(g->name, "rlimits") == 0) { AvahiIniFilePair *p; for (p = g->pairs; p; p = p->pairs_next) { - + if (strcasecmp(p->key, "rlimit-as") == 0) { c->rlimit_as_set = 1; c->rlimit_as = atoi(p->value); @@ -705,7 +723,7 @@ static int load_config_file(DaemonConfig *c) { } } - + } else { avahi_log_error("Invalid configuration file group \"%s\".\n", g->name); goto finish; @@ -718,7 +736,7 @@ finish: if (f) avahi_ini_file_free(f); - + return r; } @@ -731,7 +749,7 @@ static void log_function(AvahiLogLevel level, const char *txt) { LOG_INFO, LOG_DEBUG }; - + assert(level < AVAHI_LOG_LEVEL_MAX); assert(txt); @@ -758,7 +776,7 @@ static void add_inotify_watches(void) { #ifdef ENABLE_CHROOT c = config.use_chroot; #endif - + inotify_add_watch(inotify_fd, c ? "/services" : AVAHI_SERVICE_DIR, IN_CLOSE_WRITE|IN_DELETE|IN_DELETE_SELF|IN_MOVED_FROM|IN_MOVED_TO|IN_MOVE_SELF #ifdef IN_ONLYDIR |IN_ONLYDIR @@ -837,18 +855,18 @@ static void reload_config(void) { #else static_service_load(0); static_hosts_load(0); -#endif +#endif static_service_add_to_server(); static_hosts_add_to_server(); - + if (resolv_conf_entry_group) avahi_s_entry_group_reset(resolv_conf_entry_group); - + load_resolv_conf(); - + update_wide_area_servers(); update_browse_domains(); - + if (config.publish_resolv_conf && resolv_conf_name_servers && resolv_conf_name_servers[0]) resolv_conf_entry_group = add_dns_servers(avahi_server, resolv_conf_entry_group, resolv_conf_name_servers); } @@ -908,7 +926,7 @@ static void kqueue_callback(AvahiWatch *watch, int fd, AVAHI_GCC_UNUSED AvahiWat static void signal_callback(AvahiWatch *watch, AVAHI_GCC_UNUSED int fd, AVAHI_GCC_UNUSED AvahiWatchEvent event, AVAHI_GCC_UNUSED void *userdata) { int sig; const AvahiPoll *poll_api; - + assert(watch); assert(simple_poll_api); @@ -1013,17 +1031,17 @@ static int run_server(DaemonConfig *c) { avahi_log_error("Failed to chroot(): %s", strerror(errno)); goto finish; } - + avahi_log_info("Successfully called chroot()."); chdir("/"); - + if (avahi_caps_drop_all() < 0) { avahi_log_error("Failed to drop capabilities."); goto finish; } avahi_log_info("Successfully dropped remaining capabilities."); } - + #endif #ifdef HAVE_INOTIFY @@ -1031,7 +1049,7 @@ static int run_server(DaemonConfig *c) { avahi_log_warn( "Failed to initialize inotify: %s", strerror(errno)); else { add_inotify_watches(); - + if (!(inotify_watch = poll_api->watch_new(poll_api, inotify_fd, AVAHI_WATCH_IN, inotify_callback, NULL))) { avahi_log_error( "Failed to create inotify watcher"); goto finish; @@ -1080,17 +1098,17 @@ static int run_server(DaemonConfig *c) { /* We handle signals through an FD, so let's continue */ if (errno == EINTR) continue; - + avahi_log_error("poll(): %s", strerror(errno)); goto finish; } else if (r > 0) /* Quit */ break; } - + finish: - + static_service_remove_from_server(); static_service_free_all(); @@ -1098,7 +1116,7 @@ finish: static_hosts_free_all(); remove_dns_server_entry_groups(); - + simple_protocol_shutdown(); #ifdef HAVE_DBUS @@ -1133,7 +1151,7 @@ finish: close(kfds[i]); } #endif - + if (simple_poll_api) { avahi_simple_poll_free(simple_poll_api); simple_poll_api = NULL; @@ -1141,7 +1159,7 @@ finish: if (!retval_is_sent && c->daemonize) daemon_retval_send(1); - + return r; } @@ -1151,7 +1169,7 @@ static int drop_root(void) { struct passwd *pw; struct group * gr; int r; - + if (!(pw = getpwnam(AVAHI_USER))) { avahi_log_error( "Failed to find user '"AVAHI_USER"'."); return -1; @@ -1234,12 +1252,12 @@ static int make_runtime_dir(void) { u = umask(0000); reset_umask = 1; - + if (mkdir(AVAHI_DAEMON_RUNTIME_DIR, 0755) < 0 && errno != EEXIST) { avahi_log_error("mkdir(\""AVAHI_DAEMON_RUNTIME_DIR"\"): %s", strerror(errno)); goto fail; } - + chown(AVAHI_DAEMON_RUNTIME_DIR, pw->pw_uid, gr->gr_gid); if (stat(AVAHI_DAEMON_RUNTIME_DIR, &st) < 0) { @@ -1322,7 +1340,7 @@ int main(int argc, char *argv[]) { avahi_set_log_function(log_function); init_rand_seed(); - + avahi_server_config_init(&config.server_config); config.command = DAEMON_RUN; config.daemonize = 0; @@ -1331,7 +1349,7 @@ int main(int argc, char *argv[]) { config.enable_dbus = 1; config.fail_on_missing_dbus = 1; #endif - + config.drop_root = 1; config.set_rlimits = 1; #ifdef ENABLE_CHROOT @@ -1353,7 +1371,7 @@ int main(int argc, char *argv[]) { #ifdef RLIMIT_NPROC config.rlimit_nproc_set = 0; #endif - + if ((argv0 = strrchr(argv[0], '/'))) argv0 = avahi_strdup(argv0 + 1); else @@ -1362,7 +1380,7 @@ int main(int argc, char *argv[]) { daemon_pid_file_ident = (const char *) argv0; daemon_log_ident = (char*) argv0; daemon_pid_file_proc = pid_file_proc; - + if (parse_command_line(&config, argc, argv) < 0) goto finish; @@ -1372,7 +1390,7 @@ int main(int argc, char *argv[]) { #ifdef ENABLE_CHROOT config.use_chroot = config.use_chroot && config.drop_root; #endif - + if (config.command == DAEMON_HELP) { help(stdout); r = 0; @@ -1394,7 +1412,7 @@ int main(int argc, char *argv[]) { } r = 0; - + } else if (config.command == DAEMON_CHECK) r = (daemon_pid_file_is_running() >= 0) ? 0 : 1; else if (config.command == DAEMON_RUN) { @@ -1404,7 +1422,7 @@ int main(int argc, char *argv[]) { avahi_log_error("This program is intended to be run as root."); goto finish; } - + if ((pid = daemon_pid_file_is_running()) >= 0) { avahi_log_error("Daemon already running on PID %u", pid); goto finish; @@ -1412,10 +1430,10 @@ int main(int argc, char *argv[]) { if (load_config_file(&config) < 0) goto finish; - + if (config.daemonize) { daemon_retval_init(); - + if ((pid = daemon_fork()) < 0) goto finish; else if (pid != 0) { @@ -1441,7 +1459,7 @@ int main(int argc, char *argv[]) { avahi_log_error("Failed to close remaining file descriptors: %s", strerror(errno)); goto finish; } - + if (make_runtime_dir() < 0) goto finish; @@ -1451,7 +1469,7 @@ int main(int argc, char *argv[]) { if (avahi_caps_reduce() < 0) goto finish; #endif - + if (drop_root() < 0) goto finish; @@ -1486,11 +1504,11 @@ int main(int argc, char *argv[]) { avahi_log_info("%s "PACKAGE_VERSION" starting up.", argv0); avahi_set_proc_title(argv0, "%s: starting up", argv0); - + if (run_server(&config) == 0) r = 0; } - + finish: if (config.daemonize) @@ -1515,6 +1533,6 @@ finish: #endif avahi_free(argv0); - + return r; } diff --git a/avahi-discover-standalone/Makefile.am b/avahi-discover-standalone/Makefile.am index ca007be..542aeae 100644 --- a/avahi-discover-standalone/Makefile.am +++ b/avahi-discover-standalone/Makefile.am @@ -52,7 +52,7 @@ else if HAVE_PYTHON_DBUS -interfaces_DATA = $(interfaces) +interfaces_DATA = endif endif diff --git a/avahi-python/Makefile.am b/avahi-python/Makefile.am index 09ad6de..4989b4b 100644 --- a/avahi-python/Makefile.am +++ b/avahi-python/Makefile.am @@ -29,7 +29,6 @@ SUBDIRS=avahi avahi-discover if HAVE_PYTHON if HAVE_PYTHON_DBUS -if HAVE_PYGTK pythonscripts = \ avahi-bookmarks @@ -43,4 +42,3 @@ CLEANFILES = $(pythonscripts) endif endif -endif diff --git a/avahi-python/avahi-bookmarks.in b/avahi-python/avahi-bookmarks.in index a1e8d0c..172abb3 100755 --- a/avahi-python/avahi-bookmarks.in +++ b/avahi-python/avahi-bookmarks.in @@ -24,7 +24,7 @@ import sys, getopt, os try: import avahi, gobject, dbus except ImportError: - print "Sorry, to use this tool you need to install Avahi, pygtk and python-dbus." + print "Sorry, to use this tool you need to install Avahi and python-dbus." sys.exit(1) try: diff --git a/avahi-python/avahi-discover/Makefile.am b/avahi-python/avahi-discover/Makefile.am index c1d6cab..a44a071 100644 --- a/avahi-python/avahi-discover/Makefile.am +++ b/avahi-python/avahi-discover/Makefile.am @@ -23,7 +23,7 @@ EXTRA_DIST = \ __init__.py \ SimpleGladeApp.py \ avahi-discover.in \ - avahi-discover.desktop.in + avahi-discover.desktop.in.in if HAVE_PYTHON if HAVE_PYTHON_DBUS @@ -41,6 +41,7 @@ if HAVE_GDBM pythonscripts += \ avahi-discover desktop_DATA += avahi-discover.desktop +@INTLTOOL_DESKTOP_RULE@ avahi_discover_PYTHON += __init__.py SimpleGladeApp.py endif @@ -48,19 +49,23 @@ if HAVE_DBM pythonscripts += \ avahi-discover desktop_DATA += avahi-discover.desktop +@INTLTOOL_DESKTOP_RULE@ avahi_discover_PYTHON += __init__.py SimpleGladeApp.py endif -avahi-discover.desktop: avahi-discover.desktop.in +avahi-discover.desktop.in: avahi-discover.desktop.in.in sed -e 's,@bindir\@,$(bindir),g' $< > $@ avahi-discover: avahi-discover.in sed -e 's,@PYTHON\@,$(PYTHON),g' \ + -e 's,@GETTEXT_PACKAGE\@,"$(GETTEXT_PACKAGE)",g' \ + -e 's,@LOCALEDIR\@,"$(datadir)/locale",g' \ -e 's,@interfacesdir\@,$(interfacesdir),g' $< > $@ chmod +x $@ bin_SCRIPTS = $(pythonscripts) -CLEANFILES = $(pythonscripts) $(desktop_DATA) *.pyc *.pyo + +CLEANFILES = $(pythonscripts) $(desktop_DATA) *.pyc *.pyo avahi-discover.desktop.in endif endif diff --git a/avahi-python/avahi-discover/avahi-discover.desktop.in b/avahi-python/avahi-discover/avahi-discover.desktop.in deleted file mode 100644 index e896192..0000000 --- a/avahi-python/avahi-discover/avahi-discover.desktop.in +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Version=1.0 -Encoding=UTF-8 -Name=Avahi Zeroconf Browser -Comment=Browse for Zeroconf services available on your network -Exec=@bindir@/avahi-discover -Terminal=false -Type=Application -Icon=network-wired -Categories=GNOME;Application;System; -StartupNotify=false -GenericName= diff --git a/avahi-python/avahi-discover/avahi-discover.desktop.in.in b/avahi-python/avahi-discover/avahi-discover.desktop.in.in new file mode 100644 index 0000000..031024c --- /dev/null +++ b/avahi-python/avahi-discover/avahi-discover.desktop.in.in @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Encoding=UTF-8 +_Name=Avahi Zeroconf Browser +_Comment=Browse for Zeroconf services available on your network +Exec=@bindir@/avahi-discover +Terminal=false +Type=Application +Icon=network-wired +Categories=GNOME;Application;System; +StartupNotify=false +GenericName= diff --git a/avahi-python/avahi-discover/avahi-discover.in b/avahi-python/avahi-discover/avahi-discover.in index 229c7bd..0558424 100755 --- a/avahi-python/avahi-discover/avahi-discover.in +++ b/avahi-python/avahi-discover/avahi-discover.in @@ -22,8 +22,11 @@ import os, sys try: - import avahi, gtk, gobject, dbus, avahi.ServiceTypeDatabase + import avahi, gettext, gtk, gobject, dbus, avahi.ServiceTypeDatabase from avahi_discover.SimpleGladeApp import SimpleGladeApp + gtk.glade.bindtextdomain(@GETTEXT_PACKAGE@, @LOCALEDIR@) + gtk.glade.textdomain(@GETTEXT_PACKAGE@) + _ = gettext.gettext except ImportError, e: print "Sorry, to use this tool you need to install Avahi, pygtk and python-dbus.\n Error: %s" % e sys.exit(1) @@ -61,7 +64,9 @@ class Main_window(SimpleGladeApp): def on_tree_view_cursor_changed(self, widget, *args): (model, iter) = widget.get_selection().get_selected() - (name,interface,protocol,stype,domain) = self.treemodel.get(iter,1,2,3,4,5) + stype = None + if iter is not None: + (name,interface,protocol,stype,domain) = self.treemodel.get(iter,1,2,3,4,5) if stype == None: self.info_label.set_markup("No service currently selected.") return diff --git a/avahi-python/avahi/Makefile.am b/avahi-python/avahi/Makefile.am index 4a73022..c0c9c34 100644 --- a/avahi-python/avahi/Makefile.am +++ b/avahi-python/avahi/Makefile.am @@ -52,12 +52,10 @@ endif avahi_PYTHON = $(avahi_SCRIPTS) -if HAVE_PYGTK if HAVE_PYTHON_DBUS avahi_PYTHON += __init__.py -endif endif endif diff --git a/avahi-ui/Makefile.am b/avahi-ui/Makefile.am index 910dc6b..6dbbd24 100644 --- a/avahi-ui/Makefile.am +++ b/avahi-ui/Makefile.am @@ -29,8 +29,8 @@ desktop_DATA_in_in = bssh.desktop.in.in bvnc.desktop.in.in EXTRA_DIST = $(desktop_DATA_in_in) - if HAVE_GTK +AM_CFLAGS += -DGNOMELOCALEDIR=\"$(datadir)/locale\" if HAVE_DBUS if HAVE_GLIB @@ -61,6 +61,7 @@ endif bin_PROGRAMS = bssh desktop_DATA += bssh.desktop bvnc.desktop +@INTLTOOL_DESKTOP_RULE@ bssh_SOURCES = bssh.c bssh_CFLAGS = $(AM_CFLAGS) $(GTK20_CFLAGS) diff --git a/avahi-ui/avahi-ui.c b/avahi-ui/avahi-ui.c index a54cbe9..bd2b3cc 100644 --- a/avahi-ui/avahi-ui.c +++ b/avahi-ui/avahi-ui.c @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -184,64 +185,64 @@ static void aui_service_dialog_class_init(AuiServiceDialogClass *klass) { g_object_class_install_property( object_class, PROP_BROWSE_SERVICE_TYPES, - g_param_spec_pointer("browse_service_types", "Browse Service Types", "A NULL terminated list of service types to browse for", + g_param_spec_pointer("browse_service_types", _("Browse Service Types"), _("A NULL terminated list of service types to browse for"), G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_DOMAIN, - g_param_spec_string("domain", "Domain", "The domain to browse in, or NULL for the default domain", + g_param_spec_string("domain", _("Domain"), _("The domain to browse in, or NULL for the default domain"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_SERVICE_TYPE, - g_param_spec_string("service_type", "Service Type", "The service type of the selected service", + g_param_spec_string("service_type", _("Service Type"), _("The service type of the selected service"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_SERVICE_NAME, - g_param_spec_string("service_name", "Service Name", "The service name of the selected service", + g_param_spec_string("service_name", _("Service Name"), _("The service name of the selected service"), NULL, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_ADDRESS, - g_param_spec_pointer("address", "Address", "The address of the resolved service", + g_param_spec_pointer("address", _("Address"), _("The address of the resolved service"), G_PARAM_READABLE)); g_object_class_install_property( object_class, PROP_PORT, - g_param_spec_uint("port", "Port", "The IP port number of the resolved service", + g_param_spec_uint("port", _("Port"), _("The IP port number of the resolved service"), 0, 0xFFFF, 0, G_PARAM_READABLE)); g_object_class_install_property( object_class, PROP_HOST_NAME, - g_param_spec_string("host_name", "Host Name", "The host name of the resolved service", + g_param_spec_string("host_name", _("Host Name"), _("The host name of the resolved service"), NULL, G_PARAM_READABLE)); g_object_class_install_property( object_class, PROP_TXT_DATA, - g_param_spec_pointer("txt_data", "TXT Data", "The TXT data of the resolved service", + g_param_spec_pointer("txt_data", _("TXT Data"), _("The TXT data of the resolved service"), G_PARAM_READABLE)); g_object_class_install_property( object_class, PROP_RESOLVE_SERVICE, - g_param_spec_boolean("resolve_service", "Resolve service", "Resolve service", + g_param_spec_boolean("resolve_service", _("Resolve service"), _("Resolve service"), TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_RESOLVE_HOST_NAME, - g_param_spec_boolean("resolve_host_name", "Resolve service host name", "Resolve service host name", + g_param_spec_boolean("resolve_host_name", _("Resolve service host name"), _("Resolve service host name"), TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE)); g_object_class_install_property( object_class, PROP_ADDRESS_FAMILY, - g_param_spec_int("address_family", "Address family", "The address family for host name resolution", + g_param_spec_int("address_family", _("Address family"), _("The address family for host name resolution"), AVAHI_PROTO_UNSPEC, AVAHI_PROTO_INET6, AVAHI_PROTO_UNSPEC, G_PARAM_READABLE | G_PARAM_WRITABLE)); } @@ -703,7 +704,7 @@ static gboolean start_callback(gpointer data) { d->priv->start_idle = 0; if (!d->priv->browse_service_types || !*d->priv->browse_service_types) { - g_warning("Browse service type list is empty!"); + g_warning(_("Browse service type list is empty!")); return FALSE; } @@ -1026,7 +1027,7 @@ static void domain_button_clicked(GtkButton *button G_GNUC_UNUSED, gpointer user gtk_container_add(GTK_CONTAINER(scrolled_window), p->domain_tree_view); p->domain_progress_bar = gtk_progress_bar_new(); - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(p->domain_progress_bar), _("Browsing ...")); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(p->domain_progress_bar), _("Browsing...")); gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(p->domain_progress_bar), 0.1); gtk_box_pack_end(GTK_BOX(vbox2), p->domain_progress_bar, FALSE, FALSE, 0); @@ -1139,17 +1140,17 @@ static void aui_service_dialog_init(AuiServiceDialog *d) { g_signal_connect(selection, "changed", G_CALLBACK(service_selection_changed_callback), d); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Location", renderer, "text", SERVICE_COLUMN_PRETTY_IFACE, NULL); + column = gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", SERVICE_COLUMN_PRETTY_IFACE, NULL); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(p->service_tree_view), column); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", SERVICE_COLUMN_NAME, NULL); + column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "text", SERVICE_COLUMN_NAME, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(p->service_tree_view), column); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes("Type", renderer, "text", SERVICE_COLUMN_PRETTY_TYPE, NULL); + column = gtk_tree_view_column_new_with_attributes(_("Type"), renderer, "text", SERVICE_COLUMN_PRETTY_TYPE, NULL); gtk_tree_view_column_set_visible(column, FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(p->service_tree_view), column); @@ -1157,7 +1158,7 @@ static void aui_service_dialog_init(AuiServiceDialog *d) { gtk_container_add(GTK_CONTAINER(scrolled_window), p->service_tree_view); p->service_progress_bar = gtk_progress_bar_new(); - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(p->service_progress_bar), _("Browsing ...")); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(p->service_progress_bar), _("Browsing...")); gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(p->service_progress_bar), 0.1); gtk_box_pack_end(GTK_BOX(vbox2), p->service_progress_bar, FALSE, FALSE, 0); diff --git a/avahi-ui/avahi-ui.h b/avahi-ui/avahi-ui.h index eee0b34..d780f83 100644 --- a/avahi-ui/avahi-ui.h +++ b/avahi-ui/avahi-ui.h @@ -22,8 +22,7 @@ USA. ***/ -#include -#include +#include #include diff --git a/avahi-ui/bssh.c b/avahi-ui/bssh.c index fea1071..e4a190b 100644 --- a/avahi-ui/bssh.c +++ b/avahi-ui/bssh.c @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -135,6 +136,10 @@ int main(int argc, char*argv[]) { return 1; } + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + gtk_init(&argc, &argv); switch (config.command) { diff --git a/configure.ac b/configure.ac index 4826a60..b6e44b3 100644 --- a/configure.ac +++ b/configure.ac @@ -21,21 +21,21 @@ # USA. AC_PREREQ(2.57) -AC_INIT([avahi],[0.6.23],[avahi (at) lists (dot) freedesktop (dot) org]) +AC_INIT([avahi],[0.6.24],[avahi (at) lists (dot) freedesktop (dot) org]) AC_CONFIG_SRCDIR([avahi-core/server.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE([foreign 1.9 -Wall]) AC_SUBST(PACKAGE_URL, [http://avahi.org/]) -AC_SUBST(LIBAVAHI_COMMON_VERSION_INFO, [8:0:5]) -AC_SUBST(LIBAVAHI_CORE_VERSION_INFO, [5:5:0]) -AC_SUBST(LIBAVAHI_CLIENT_VERSION_INFO, [5:4:2]) +AC_SUBST(LIBAVAHI_COMMON_VERSION_INFO, [8:1:5]) +AC_SUBST(LIBAVAHI_CORE_VERSION_INFO, [6:0:0]) +AC_SUBST(LIBAVAHI_CLIENT_VERSION_INFO, [5:5:2]) AC_SUBST(LIBAVAHI_GLIB_VERSION_INFO, [1:1:0]) AC_SUBST(LIBAVAHI_GOBJECT_VERSION_INFO, [0:1:0]) AC_SUBST(LIBAVAHI_QT3_VERSION_INFO, [1:2:0]) AC_SUBST(LIBAVAHI_QT4_VERSION_INFO, [1:2:0]) -AC_SUBST(LIBAVAHI_UI_VERSION_INFO, [1:0:1]) +AC_SUBST(LIBAVAHI_UI_VERSION_INFO, [1:1:1]) # Do not touch these, since they we took this version-info from upstream HOWL/Bonjour AC_SUBST(LIBAVAHI_COMPAT_LIBDNS_SD_VERSION_INFO, [1:0:0]) @@ -387,7 +387,6 @@ fi AM_CONDITIONAL(HAVE_DLOPEN, test "x$HAVE_DLOPEN" = "xyes") have_inotify=no -AC_CHECK_HEADERS([linux/inotify.h], [have_inotify=yes]) AC_CHECK_HEADERS([sys/inotify.h], [have_inotify=yes]) AM_CONDITIONAL(HAVE_INOTIFY, test "x$have_inotify" = "xyes") diff --git a/docs/NEWS b/docs/NEWS index 7b49d63..19bbaad 100644 --- a/docs/NEWS +++ b/docs/NEWS @@ -1,3 +1,17 @@ +Avahi 0.6.24 +============ + +This is mostly a bugfix release. + + * A huge number of bug fixes, including a security relavant one (low + risk) + * Add two new configuration directives "allow-interfaces" and + "deny-interfaces" which can be used to make Avahi ignore certain + network interfaces or only use certain network interfaces. + * A lot of translation updates + +This release is backwards compatible with Avahi 0.6.x with x < 24. + Avahi 0.6.23 ============ diff --git a/initscript/fedora/avahi-daemon.in b/initscript/fedora/avahi-daemon.in index d309866..c5b3230 100644 --- a/initscript/fedora/avahi-daemon.in +++ b/initscript/fedora/avahi-daemon.in @@ -2,19 +2,19 @@ # # avahi-daemon: Starts the Avahi Daemon # -# chkconfig: 345 96 02 +# chkconfig: 345 24 02 # description: This is a daemon which runs on client machines to perform \ # Zeroconf service discovery on a network. avahi-daemon must be \ # running on systems that use Avahi for service discovery. \ # Avahi-daemon should not be running otherwise. # processname: avahi-daemon -# config: +# config: AVAHI_BIN=@sbindir@/avahi-daemon -if [ "$1" == 'status' ]; then +if [ "$1" = 'status' ]; then test -x $AVAHI_BIN || exit 4 -else +else test -x $AVAHI_BIN || exit 5 fi @@ -91,7 +91,7 @@ case "$1" in restart ;; reload) - reload + reload ;; condrestart) if [ -f $LOCKFILE ]; then @@ -105,4 +105,3 @@ case "$1" in esac exit $RETVAL - diff --git a/initscript/fedora/avahi-dnsconfd.in b/initscript/fedora/avahi-dnsconfd.in index 284c10b..de49d7f 100644 --- a/initscript/fedora/avahi-dnsconfd.in +++ b/initscript/fedora/avahi-dnsconfd.in @@ -12,7 +12,7 @@ AVAHI_BIN=@sbindir@/avahi-dnsconfd -if [ "$1" == 'status' ]; then +if [ "$1" = 'status' ]; then test -x $AVAHI_BIN || exit 4 else test -x $AVAHI_BIN || exit 5 diff --git a/man/Makefile.am b/man/Makefile.am index 8f85f3c..7d08828 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -65,8 +65,11 @@ endif if HAVE_PYTHON man_MANS += \ - avahi-discover.1 \ avahi-bookmarks.1 +if HAVE_GTK +man_MANS += \ + avahi-discover.1 +endif endif endif @@ -233,16 +236,22 @@ EXTRA_DIST = \ if HAVE_DBUS +BSSH_LN = +if HAVE_GTK +if HAVE_GLIB +BSSH_LN += $(LN_S) bssh.1 bvnc.1 && +endif +endif install-exec-local: mkdir -p $(DESTDIR)/$(mandir)/man1 && \ cd $(DESTDIR)/$(mandir)/man1 && \ rm -f avahi-resolve-host-name.1 avahi-resolve-address.1 avahi-browse-domains.1 avahi-publish-address.1 avahi-publish-service.1 bvnc.1 && \ + $(BSSH_LN) \ $(LN_S) avahi-resolve.1 avahi-resolve-host-name.1 && \ $(LN_S) avahi-resolve.1 avahi-resolve-address.1 && \ $(LN_S) avahi-browse.1 avahi-browse-domains.1 && \ $(LN_S) avahi-publish.1 avahi-publish-address.1 && \ - $(LN_S) avahi-publish.1 avahi-publish-service.1 && \ - $(LN_S) bssh.1 bvnc.1 + $(LN_S) avahi-publish.1 avahi-publish-service.1 endif diff --git a/man/avahi-daemon.conf.5.xml.in b/man/avahi-daemon.conf.5.xml.in index e00a911..08992fa 100644 --- a/man/avahi-daemon.conf.5.xml.in +++ b/man/avahi-daemon.conf.5.xml.in @@ -4,19 +4,19 @@ -