]> git.meshlink.io Git - catta/commitdiff
daemon: make internal limits configurable
authorLennart Poettering <lennart@poettering.net>
Fri, 25 Jun 2010 21:12:26 +0000 (23:12 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 25 Jun 2010 21:12:26 +0000 (23:12 +0200)
20 files changed:
avahi-core/cache.c
avahi-core/core.h
avahi-core/server.c
avahi-daemon/avahi-daemon.conf
avahi-daemon/dbus-async-address-resolver.c
avahi-daemon/dbus-async-host-name-resolver.c
avahi-daemon/dbus-async-service-resolver.c
avahi-daemon/dbus-domain-browser.c
avahi-daemon/dbus-entry-group.c
avahi-daemon/dbus-internal.h
avahi-daemon/dbus-protocol.c
avahi-daemon/dbus-protocol.h
avahi-daemon/dbus-record-browser.c
avahi-daemon/dbus-service-browser.c
avahi-daemon/dbus-service-type-browser.c
avahi-daemon/dbus-sync-address-resolver.c
avahi-daemon/dbus-sync-host-name-resolver.c
avahi-daemon/dbus-sync-service-resolver.c
avahi-daemon/main.c
man/avahi-daemon.conf.5.xml.in

index c0745795a5d51adc400ce31b5d14c5b4914600e0..454aac53a5efa068be431b00285b068373d93ea4 100644 (file)
@@ -32,8 +32,6 @@
 #include "log.h"
 #include "rr-util.h"
 
-#define AVAHI_CACHE_ENTRIES_MAX 500
-
 static void remove_entry(AvahiCache *c, AvahiCacheEntry *e) {
     AvahiCacheEntry *t;
 
@@ -340,7 +338,7 @@ void avahi_cache_update(AvahiCache *c, AvahiRecord *r, int cache_flush, const Av
 
 /*             avahi_log_debug("cache: couldn't find matching cache entry for %s", txt);   */
 
-            if (c->n_entries >= AVAHI_CACHE_ENTRIES_MAX)
+            if (c->n_entries >= c->server->config.n_cache_entries_max)
                 return;
 
             if (!(e = avahi_new(AvahiCacheEntry, 1))) {
@@ -513,6 +511,3 @@ void avahi_cache_stop_poof(AvahiCache *c, AvahiRecord *record, const AvahiAddres
             next_expiry(c, e, 80);
         }
 }
-
-
-
index 28de91712bc733e037c4c75b6b500a3b9572813a..1f5012691affa92a397dd8f829899ca7ad6a1de1 100644 (file)
@@ -65,6 +65,7 @@ typedef struct AvahiServerConfig {
     int allow_point_to_point;         /**< Enable publishing on POINTOPOINT interfaces */
     int publish_a_on_ipv6;            /**< Publish an IPv4 A RR on IPv6 sockets */
     int publish_aaaa_on_ipv4;         /**< Publish an IPv4 A RR on IPv6 sockets */
+    unsigned n_cache_entries_max;     /**< Maximum number of cache entries per interface */
 } AvahiServerConfig;
 
 /** Allocate a new mDNS responder object. */
index 6eedd6e8963d68a80af9c569f26d49e1d967b9fe..938c54de362574153c6a2284ed9f823d830c2856 100644 (file)
@@ -49,6 +49,8 @@
 #include "domain-util.h"
 #include "rr-util.h"
 
+#define AVAHI_DEFAULT_CACHE_ENTRIES_MAX 500
+
 static void enum_aux_records(AvahiServer *s, AvahiInterface *i, const char *name, uint16_t type, void (*callback)(AvahiServer *s, AvahiRecord *r, int flush_cache, void* userdata), void* userdata) {
     assert(s);
     assert(i);
@@ -1583,6 +1585,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;
+    c->n_cache_entries_max = AVAHI_DEFAULT_CACHE_ENTRIES_MAX;
 
     return c;
 }
index 38f1d49e8f845dccdc346d777a98202b458df146..b3185c771ae696bbe7f229aca308fe2096692ee1 100644 (file)
@@ -1,5 +1,5 @@
 # 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 of the
@@ -31,6 +31,10 @@ use-ipv6=no
 #enable-dbus=yes
 #disallow-other-stacks=no
 #allow-point-to-point=no
+#cache-entries-max=500
+#clients-max=256
+#objects-per-client-max=250
+#entries-per-entry-group-max=20
 
 [wide-area]
 enable-wide-area=yes
index 195984176e28b1121ed76323ccfe10807c8868ee..dcb15e73f0bd8e65d444616b2cfd959b87529c39 100644 (file)
@@ -44,8 +44,8 @@ void avahi_dbus_async_address_resolver_free(AsyncAddressResolverInfo *i) {
 
     AVAHI_LLIST_REMOVE(AsyncAddressResolverInfo, async_address_resolvers, i->client->async_address_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index 7f8adb66e96540805f0fe742f0c9acbd27a9f830..936c3f97e30698997160e3a244b530ab9925fa33 100644 (file)
@@ -43,8 +43,8 @@ void avahi_dbus_async_host_name_resolver_free(AsyncHostNameResolverInfo *i) {
     }
     AVAHI_LLIST_REMOVE(AsyncHostNameResolverInfo, async_host_name_resolvers, i->client->async_host_name_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
@@ -133,4 +133,3 @@ fail:
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
-
index 462f9b3e9ee7a952408e0445ebc45d43d252f297..023543d87ecec40404f9c6f981f2596cb22de276 100644 (file)
@@ -44,8 +44,8 @@ void avahi_dbus_async_service_resolver_free(AsyncServiceResolverInfo *i) {
 
     AVAHI_LLIST_REMOVE(AsyncServiceResolverInfo, async_service_resolvers, i->client->async_service_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
@@ -172,4 +172,3 @@ fail:
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
-
index 8c698b0714a82c1a0c2fccf34e93a05d9341f50a..80155b28ab93b0bc185bd3dc0b9f4f20948151f2 100644 (file)
@@ -44,8 +44,8 @@ void avahi_dbus_domain_browser_free(DomainBrowserInfo *i) {
 
     AVAHI_LLIST_REMOVE(DomainBrowserInfo, domain_browsers, i->client->domain_browsers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
@@ -125,4 +125,3 @@ void avahi_dbus_domain_browser_callback(AvahiSDomainBrowser *b, AvahiIfIndex int
     dbus_connection_send(server->bus, m, NULL);
     dbus_message_unref(m);
 }
-
index b2fb1651f6b68a8b3eb2541c26ca6a9efa479187..45c9be3d7625df12e33a9cf1b81aeebae6d90531 100644 (file)
@@ -45,8 +45,8 @@ void avahi_dbus_entry_group_free(EntryGroupInfo *i) {
     }
     AVAHI_LLIST_REMOVE(EntryGroupInfo, entry_groups, i->client->entry_groups, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
@@ -135,7 +135,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
         }
 
         avahi_s_entry_group_reset(i->entry_group);
-       i->n_entries = 0;
+        i->n_entries = 0;
         return avahi_dbus_respond_ok(c, m);
 
     } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "IsEmpty")) {
@@ -182,7 +182,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
             goto fail;
         }
 
-        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) {
+        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max) {
             avahi_string_list_free(strlst);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
         }
@@ -225,7 +225,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
             goto fail;
         }
 
-        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX)
+        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max)
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
 
         if (domain && !*domain)
@@ -290,7 +290,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
             goto fail;
         }
 
-        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX)
+        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max)
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
 
         if (!(avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a)))
@@ -326,7 +326,7 @@ DBusHandlerResult avahi_dbus_msg_entry_group_impl(DBusConnection *c, DBusMessage
             goto fail;
         }
 
-        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX)
+        if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= server->n_entries_per_entry_group_max)
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
 
         if (!avahi_is_valid_domain_name (name))
index d721d383c7ae039fd8f29cd461a5e7ab0793e550..a786d628ce4952754d519a6e1957ec3e285911d8 100644 (file)
@@ -43,9 +43,9 @@ typedef struct SyncServiceResolverInfo SyncServiceResolverInfo;
 typedef struct AsyncServiceResolverInfo AsyncServiceResolverInfo;
 typedef struct RecordBrowserInfo RecordBrowserInfo;
 
-#define CLIENTS_MAX 256
-#define OBJECTS_PER_CLIENT_MAX 250
-#define ENTRIES_PER_ENTRY_GROUP_MAX 20
+#define DEFAULT_CLIENTS_MAX 256
+#define DEFAULT_OBJECTS_PER_CLIENT_MAX 250
+#define DEFAULT_ENTRIES_PER_ENTRY_GROUP_MAX 20
 
 struct EntryGroupInfo {
     unsigned id;
@@ -53,7 +53,7 @@ struct EntryGroupInfo {
     AvahiSEntryGroup *entry_group;
     char *path;
 
-    int n_entries;
+    unsigned n_entries;
 
     AVAHI_LLIST_FIELDS(EntryGroupInfo, entry_groups);
 };
@@ -149,7 +149,7 @@ struct Client {
     unsigned id;
     char *name;
     unsigned current_id;
-    int n_objects;
+    unsigned n_objects;
 
     AVAHI_LLIST_FIELDS(Client, clients);
     AVAHI_LLIST_HEAD(EntryGroupInfo, entry_groups);
@@ -169,11 +169,17 @@ struct Server {
     const AvahiPoll *poll_api;
     DBusConnection *bus;
     AVAHI_LLIST_HEAD(Client, clients);
-    int n_clients;
+    unsigned n_clients;
     unsigned current_id;
 
     AvahiTimeout *reconnect_timeout;
     int reconnect;
+
+    unsigned n_clients_max;
+    unsigned n_objects_per_client_max;
+    unsigned n_entries_per_entry_group_max;
+
+    int disable_user_service_publishing;
 };
 
 extern Server *server;
index 283c27b5ac00aac3a7b55351920a225a40443d9e..937e64df9f5e0920a79210e932cc76d02db3838d 100644 (file)
@@ -63,8 +63,6 @@
 
 Server *server = NULL;
 
-static int disable_user_service_publishing = 0;
-
 static int dbus_connect(void);
 static void dbus_disconnect(void);
 
@@ -112,8 +110,8 @@ static void client_free(Client *c) {
     AVAHI_LLIST_REMOVE(Client, clients, server->clients, c);
     avahi_free(c);
 
+    assert(server->n_clients >= 1);
     server->n_clients --;
-    assert(server->n_clients >= 0);
 }
 
 static Client *client_get(const char *name, int create) {
@@ -129,7 +127,7 @@ static Client *client_get(const char *name, int create) {
     if (!create)
         return NULL;
 
-    if (server->n_clients >= CLIENTS_MAX)
+    if (server->n_clients >= server->n_clients_max)
         return NULL;
 
     /* If not existent yet, create a new entry */
@@ -344,7 +342,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
 
     } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetNetworkInterfaceNameByIndex")) {
         int32_t idx;
-       char name[IF_NAMESIZE];
+        char name[IF_NAMESIZE];
 
         if (!(dbus_message_get_args(m, &error, DBUS_TYPE_INT32, &idx, DBUS_TYPE_INVALID))) {
             avahi_log_warn("Error parsing Server::GetNetworkInterfaceNameByIndex message");
@@ -429,7 +427,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             goto fail;
         }
 
-        if (disable_user_service_publishing)
+        if (server->disable_user_service_publishing)
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_NOT_PERMITTED, NULL);
 
         if (!(client = client_get(dbus_message_get_sender(m), TRUE))) {
@@ -437,7 +435,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -483,7 +481,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -528,7 +526,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -578,7 +576,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -633,7 +631,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -689,7 +687,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -739,7 +737,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -797,7 +795,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -858,7 +856,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -914,7 +912,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -973,7 +971,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAH
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
         }
 
-        if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
+        if (client->n_objects >= server->n_objects_per_client_max) {
             avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
             return avahi_dbus_respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
         }
@@ -1157,9 +1155,13 @@ static void dbus_disconnect(void) {
     }
 }
 
-int dbus_protocol_setup(const AvahiPoll *poll_api, int _disable_user_service_publishing, int force) {
+int dbus_protocol_setup(const AvahiPoll *poll_api,
+                        int _disable_user_service_publishing,
+                        int _n_clients_max,
+                        int _n_objects_per_client_max,
+                        int _n_entries_per_entry_group_max,
+                        int force) {
 
-    disable_user_service_publishing = _disable_user_service_publishing;
 
     server = avahi_new(Server, 1);
     AVAHI_LLIST_HEAD_INIT(Clients, server->clients);
@@ -1169,6 +1171,10 @@ int dbus_protocol_setup(const AvahiPoll *poll_api, int _disable_user_service_pub
     server->poll_api = poll_api;
     server->reconnect_timeout = NULL;
     server->reconnect = force;
+    server->disable_user_service_publishing = _disable_user_service_publishing;
+    server->n_clients_max = _n_clients_max > 0 ? _n_clients_max : DEFAULT_CLIENTS_MAX;
+    server->n_objects_per_client_max = _n_objects_per_client_max > 0 ? _n_objects_per_client_max : DEFAULT_OBJECTS_PER_CLIENT_MAX;
+    server->n_entries_per_entry_group_max = _n_entries_per_entry_group_max > 0 ? _n_entries_per_entry_group_max : DEFAULT_ENTRIES_PER_ENTRY_GROUP_MAX;
 
     if (dbus_connect() < 0) {
         struct timeval tv;
index 66b2f7497e1ca07d9f0d83b29f91ea334b31cd13..218448732685393e467ba305017c448f14770bac 100644 (file)
   USA.
 ***/
 
-int dbus_protocol_setup(const AvahiPoll *poll_api, int disable_user_service_publishing, int force);
+int dbus_protocol_setup(const AvahiPoll *poll_api,
+                        int _disable_user_service_publishing,
+                        int _n_clients_max,
+                        int _n_objects_per_client_max,
+                        int _n_entries_per_entry_group_max,
+                        int force);
 void dbus_protocol_shutdown(void);
 void dbus_protocol_server_state_changed(AvahiServerState state);
 
index 752510b68860ef65b4e8002ee5bf899d88377d14..57be6e8d2961d7a26ea19dfb8a63e55cb80edfd5 100644 (file)
@@ -43,8 +43,8 @@ void avahi_dbus_record_browser_free(RecordBrowserInfo *i) {
     }
     AVAHI_LLIST_REMOVE(RecordBrowserInfo, record_browsers, i->client->record_browsers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index 39251f5e78fb0903c5111c7a3aaed3ed57a3ff5b..f945e65dff6048eaddb9602f1801006db37c4869 100644 (file)
@@ -44,8 +44,8 @@ void avahi_dbus_service_browser_free(ServiceBrowserInfo *i) {
 
     AVAHI_LLIST_REMOVE(ServiceBrowserInfo, service_browsers, i->client->service_browsers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index db7a038160bf52ed438b9ce5378bc325ff01732d..ce4787f3f8a0d40574e9ccee5a8ed2ad76058f71 100644 (file)
@@ -44,8 +44,8 @@ void avahi_dbus_service_type_browser_free(ServiceTypeBrowserInfo *i) {
 
     AVAHI_LLIST_REMOVE(ServiceTypeBrowserInfo, service_type_browsers, i->client->service_type_browsers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
@@ -127,5 +127,3 @@ void avahi_dbus_service_type_browser_callback(AvahiSServiceTypeBrowser *b, Avahi
     dbus_connection_send(server->bus, m, NULL);
     dbus_message_unref(m);
 }
-
-
index c35711bc7d417934a86ad52c7600cb413beec768..5cad5a7d3a33727f007703138ad26a2403f87425 100644 (file)
@@ -40,8 +40,8 @@ void avahi_dbus_sync_address_resolver_free(SyncAddressResolverInfo *i) {
     dbus_message_unref(i->message);
     AVAHI_LLIST_REMOVE(SyncAddressResolverInfo, sync_address_resolvers, i->client->sync_address_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index 16b6451fdd9d9b9bc2b14038b56413423f4f7fb2..febbd25ee5f5d9f225667fe2c8a76ee010ff2fd2 100644 (file)
@@ -40,8 +40,8 @@ void avahi_dbus_sync_host_name_resolver_free(SyncHostNameResolverInfo *i) {
     dbus_message_unref(i->message);
     AVAHI_LLIST_REMOVE(SyncHostNameResolverInfo, sync_host_name_resolvers, i->client->sync_host_name_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index 719cbaa1d00b12705eb6d3d42cc9b2f51a9d2204..6d39d4e9901192284e2359f1e8b1e31374aace99 100644 (file)
@@ -40,8 +40,8 @@ void avahi_dbus_sync_service_resolver_free(SyncServiceResolverInfo *i) {
     dbus_message_unref(i->message);
     AVAHI_LLIST_REMOVE(SyncServiceResolverInfo, sync_service_resolvers, i->client->sync_service_resolvers, i);
 
+    assert(i->client->n_objects >= 1);
     i->client->n_objects--;
-    assert(i->client->n_objects >= 0);
 
     avahi_free(i);
 }
index d270c318b6ffc9841de3ffa576a7fc1abe86d8e0..d1a3b3e773d8efad276d164f457e2b3bd2ef16e1 100644 (file)
@@ -106,6 +106,9 @@ typedef struct {
 #ifdef HAVE_DBUS
     int enable_dbus;
     int fail_on_missing_dbus;
+    unsigned n_clients_max;
+    unsigned n_objects_per_client_max;
+    unsigned n_entries_per_entry_group_max;
 #endif
     int drop_root;
     int set_rlimits;
@@ -527,6 +530,26 @@ static int is_yes(const char *s) {
     return *s == 'y' || *s == 'Y' || *s == '1' || *s == 't' || *s == 'T';
 }
 
+static int parse_unsigned(const char *s, unsigned *u) {
+    char *e = NULL;
+    unsigned long ul;
+    unsigned k;
+
+    errno = 0;
+    ul = strtoul(s, &e, 0);
+
+    if (!e || *e || errno != 0)
+        return -1;
+
+    k = (unsigned) ul;
+
+    if ((unsigned long) k != ul)
+        return -1;
+
+    *u = k;
+    return 0;
+}
+
 static int load_config_file(DaemonConfig *c) {
     int r = -1;
     AvahiIniFile *f;
@@ -618,6 +641,44 @@ static int load_config_file(DaemonConfig *c) {
                         c->server_config.deny_interfaces = avahi_string_list_add(c->server_config.deny_interfaces, *t);
 
                     avahi_strfreev(e);
+                } else if (strcasecmp(p->key, "cache-entries-max") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid cache-entries-max setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->server_config.n_cache_entries_max = k;
+#ifdef HAVE_DBUS
+                } else if (strcasecmp(p->key, "clients-max") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid clients-max setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->n_clients_max = k;
+                } else if (strcasecmp(p->key, "objects-per-client-max") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid objects-per-client-max setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->n_objects_per_client_max = k;
+                } else if (strcasecmp(p->key, "entries-per-entry-group-max") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid entries-per-entry-group-max setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->n_entries_per_entry_group_max = k;
+#endif
                 } else {
                     avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name);
                     goto finish;
@@ -1009,7 +1070,12 @@ static int run_server(DaemonConfig *c) {
 
 #ifdef HAVE_DBUS
     if (c->enable_dbus) {
-        if (dbus_protocol_setup(poll_api, config.disable_user_service_publishing, !c->fail_on_missing_dbus
+        if (dbus_protocol_setup(poll_api,
+                                config.disable_user_service_publishing,
+                                config.n_clients_max,
+                                config.n_objects_per_client_max,
+                                config.n_entries_per_entry_group_max,
+                                !c->fail_on_missing_dbus
 #ifdef ENABLE_CHROOT
                                 && !config.use_chroot
 #endif
@@ -1347,6 +1413,9 @@ int main(int argc, char *argv[]) {
 #ifdef HAVE_DBUS
     config.enable_dbus = 1;
     config.fail_on_missing_dbus = 1;
+    config.n_clients_max = 0;
+    config.n_objects_per_client_max = 0;
+    config.n_entries_per_entry_group_max = 0;
 #endif
 
     config.drop_root = 1;
index 7e44690cc13716db9a7c984d8426871dda42392f..3c8153ed751be4f76d8e08561e36ec896ad0a587 100644 (file)
   USA.
 -->
 
-  <manpage name="avahi-daemon.conf" section="5" desc="avahi-daemon configuration file">
-
-       <synopsis>
-      <cmd>@pkgsysconfdir@/avahi-daemon.conf</cmd>
-       </synopsis>
-
-    <description>
-      <p><file>avahi-daemon.conf</file> is the configuration file for avahi-daemon.</p>
-       </description>
-
-       <section name="Section [Server]">
-
-      <option>
-        <p><opt>host-name=</opt> Set the host name avahi-daemon tries
-        to register on the LAN. If omited defaults to the system host
-        name as set with the sethostname() system call.</p>
-      </option>
-
-      <option>
-        <p><opt>domain-name=</opt> Set the default domain name avahi-daemon
-        tries to register its host name and services on the LAN in. If
-        omitted defaults to ".local".</p>
-      </option>
-
-      <option>
-        <p><opt>browse-domains=</opt> Set a comma separated list of
-        browsing domains (in addition to the default one and those
-        announced inside the default browsing domain). Please note
-        that the user may specify additional browsing domains on the
-        client side, either by setting $AVAHI_BROWSE_DOMAINS to a list
-        of colon separated domains or by adding them to the XDG config
-        file <file>~/.config/avahi/browse-domains</file> (separated by
-        newlines).</p>
-
-      </option>
-
-      <option>
-        <p><opt>use-ipv4=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "no" avahi-daemon will not use IPv4
-        sockets. Default is "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>use-ipv6=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "no" avahi-daemon will not use IPv6
-        sockets. Default is "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>allow-interfaces=</opt> Set a comma separated list of
-        allowed network interfaces that should be used by the
-        avahi-daemon.  Other interfaces will be ignored. If set to the
-        empty list all local interfaces except loopback and
-        point-to-point will be used.</p>
-      </option>
-
-      <option>
-        <p><opt>deny-interfaces=</opt> Set a comma separated list of
-        network interfaces that should be ignored by avahi-daemon.
-       Other not specified interfaces will be used, unless
-       <opt>allow-interfaces</opt> is set. This option takes
-       precedence over <opt>deny-interfaces</opt>.</p>
-      </option>
-
-      <option>
-        <p><opt>check-response-ttl=</opt> Takes a boolean value ("yes"
-        or "no"). If set to "yes", an additional security check is
-        activated: incoming IP packets will be ignored unless the IP
-        TTL is 255. Earlier mDNS specifications required this
-        check. Since this feature may be incompatible with newer
-        implementations of mDNS it defaults to "no". On the other hand
-        it provides extra security.</p>
-      </option>
-
-      <option>
-        <p><opt>use-iff-running=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "yes" avahi-daemon monitors the IFF_RUNNING
-        flag bit which is used by some (modern) network drivers to
-        tell user space if a network cable is plugged in (in case of
-        copper ethernet), or the network card is associated with some
-        kind of network (in case of WLAN). If IFF_RUNNING is set
-        avahi-daemon will automatically announce its services on that
-        network. Unfortunately far too many network drivers do not
-        support this flag or support it in a broken way. Therefore
-        this option defaults to "no".</p>
-      </option>
-
-      <option>
-        <p><opt>enable-dbus=</opt> Takes either "yes", "no" or
-        "warn". If set to "yes" avahi-daemon connects to D-Bus,
-        offering an object oriented client API. It is only available
-        if Avahi has been compiled with <opt>--enable-dbus</opt> in
-        which case it defaults to "yes". "warn" behaves like "yes",
-        but the daemon starts up even when it fails to connect to a
-        D-Bus daemon. In addition, if the connection to the D-Bus
-        daemon is terminated we try to reconnect. (Unless we are in a
-        chroot() environment where this definitely will fail.) </p>
-      </option>
-
-      <option>
-        <p><opt>disallow-other-stacks=</opt> Takes a boolean value
-        ("yes" or "no"). If set to "yes" no other process is allowed
-        to bind to UDP port 5353. This effectively impedes other mDNS
-        stacks from running on the host. Use this as a security
-        measure to make sure that only Avahi is responsible for mDNS
-        traffic. Please note that we do not recommend running multiple
-        mDNS stacks on the same host simultaneously. This hampers
-        reliability and is a waste of resources. However, to not annoy
-        people this option defaults to "no".</p>
-      </option>
-
-      <option>
-        <p><opt>allow-point-to-point=</opt> Takes a boolean value
-        ("yes" or "no"). If set to "yes" avahi-daemon will make use of
-        interfaces with the POINTOPOINT flag set. This option defaults
-        to "no" as it might make mDNS unreliable due to usually large
-        latencies with such links and opens a potential security hole
-        by allowing mDNS access from Internet connections. Use with
-        care and YMMV!</p>
-      </option>
-
-       </section>
-
-       <section name="Section [wide-area]">
-      <option>
-        <p><opt>enable-wide-area=</opt> Takes a boolean value
-        ("yes" or "no"). Enable wide-area DNS-SD, aka
-        DNS-SD over unicast DNS. If this is enabled only domains
-        ending in .local will be resolved on mDNS, all other domains
-        are resolved via unicast DNS. If you want to maintain multiple
-        different multicast DNS domains even with this option enabled
-        we encourage you to use subdomains of .local, such as
-        "kitchen.local". This option defaults to "yes".</p>
-      </option>
-
-    </section>
-
-       <section name="Section [publish]">
-
-      <option><p><opt>disable-publishing=</opt> Takes a boolean value
-      ("yes" or "no"). If set to "yes", no record will be published by
-      Avahi, not even address records for the local host. Avahi will
-      be started in a querying-only mode. Use this is a security
-      measure. This option defaults to "no"</p></option>
-
-      <option><p><opt>disable-user-service-publishing=</opt> Takes a boolean value
-      ("yes" or "no"). If set to "yes", Avahi will still publish
-      address records and suchlike but will not allow user
-      applications to publish services. Use this is a security
-      measure. This option defaults to "no"</p></option>
-
-      <option>
-        <p><opt>add-service-cookie=</opt> Takes a boolean value ("yes"
-        or "no"). If set to "yes" an implicit TXT entry will be added
-        to all locally registered services, containing a cookie value
-        which is chosen randomly on daemon startup. This can be used
-        to detect if two services on two different
-        interfaces/protocols are actually identical. Defaults to
-        "no".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-addresses=</opt> Takes a boolean value ("yes"
-        or "no"). If set to "yes" avahi-daemon will register mDNS
-        address records for all local IP addresses. Unless you want to
-        use avahi-daemon exclusively for browsing it's recommended to
-        enable this. If you plan to register local services you need
-        to enable this option. Defaults to "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-hinfo=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "yes" avahi-daemon will register an mDNS
-        HINFO record on all interfaces which contains information
-        about the local operating system and CPU, which might be
-        useful for administrative purposes. This is recommended by the
-        mDNS specification but not required. For the sake of privacy
-        you might choose to disable this feature. Defaults to
-        "yes."</p>
-      </option>
-
-      <option>
-        <p><opt>publish-workstation=</opt> Takes a boolean value
-        ("yes" or "no"). If set to "yes" avahi-daemon will register a
-        service of type "_workstation._tcp" on the local LAN. This
-        might be useful for administrative purposes (i.e. browse for
-        all PCs on the LAN), but is not required or recommended by any
-        specification. Newer MacOS X releases register a service of
-        this type. Defaults to "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-domain=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "yes" avahi-daemon will announce the locally
-        used domain name (see above) for browsing by other
-        hosts. Defaults to "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-dns-servers=</opt> Takes a comma separated
-        list of IP addresses for unicast DNS servers. You can use this
-        to announce unicast DNS servers via mDNS. When used in
-        conjunction with avahi-dnsconfd on the client
-        side this allows DHCP-like configuration of unicast DNS
-        servers.</p>
-      </option>
-
-      <option>
-        <p><opt>publish-resolv-conf-dns-servers=</opt> Takes a boolean
-        value ("yes" or "no"). If set to "yes" avahi-daemon will
-        publish the unicast DNS servers specified in
-        <file>/etc/resolv.conf</file> in addition to those specified
-        with <opt>publish-dns-servers</opt>. Send avahi-daemon a
-        SIGHUP to have it reload this file. Defaults to "no".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-aaaa-on-ipv4=</opt> Takes a boolean value
-        ("yes" or "no"). If set to "yes" avahi-daemon will publish an
-        IPv6 AAAA record via IPv4, i.e. the local IPv6 addresses can be
-        resolved using an IPv4 transport. Only useful when IPv4 is
-        enabled with <opt>use-ipv4=true</opt>. Defaults to "yes".</p>
-      </option>
-
-      <option>
-        <p><opt>publish-a-on-ipv6=</opt> Takes a boolean value
-        ("yes" or "no"). If set to "yes" avahi-daemon will publish an
-        IPv4 A record via IPv6, i.e. the local IPv4 addresses can be
-        resolved using an IPv6 transport. Only useful when IPv6 is
-        enabled with <opt>use-ipv6=true</opt>. Defaults to "no".</p>
-      </option>
-
-    </section>
-
-       <section name="Section [reflector]">
-      <option>
-        <p><opt>enable-reflector=</opt> Takes a boolean value ("yes"
-        or "no"). If set to "yes" avahi-daemon will reflect incoming
-        mDNS requests to all local network interfaces, effectively
-        allowing clients to browse mDNS/DNS-SD services on all
-        networks connected to the gateway. The gateway is somewhat
-        intelligent and should work with all kinds of mDNS traffic,
-        though some functionality is lost (specifically the unicast
-        reply bit, which is used rarely anyway). Make sure to not run
-        multiple reflectors between the same networks, this might
-        cause them to play Ping Pong with mDNS packets. Defaults to
-        "no".</p>
-      </option>
-
-      <option>
-        <p><opt>reflect-ipv=</opt> Takes a boolean value ("yes" or
-        "no"). If set to "yes" and <opt>enable-reflector</opt> is
-        enabled, avahi-daemon will forward mDNS traffic between IPv4
-        and IPv6, which is usually not recommended. Defaults to "no".</p>
-      </option>
-    </section>
-
-    <section name="Section [rlimits]">
-      <p>This section is used to define system resource limits for the
-      daemon. See <manref section="2" name="setrlimit"/> for more
-      information. If any of the options is not specified in the configuration
-      file, avahi-daemon does not change it from the system
-      defaults.</p>
-
-
-      <option>
-        <p><opt>rlimit-as=</opt> Value in bytes for RLIMIT_AS (maximum size of the process's virtual memory). Sensible values are heavily system dependent.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-core=</opt> Value in bytes for RLIMIT_CORE (maximum core file size). Unless you want to debug avahi-daemon, it is safe to set this to 0.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-data=</opt> Value in bytes for RLIMIT_DATA (maximum size of the process's data segment). Sensible values are heavily system dependent.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-fsize=</opt> Value for RLIMIT_FSIZE (maximum size of files the process may create). Since avahi-daemon shouldn't write any files to disk, it is safe to set this to 0.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-nofile=</opt> Value for RLIMIT_NOFILE (open file descriptors). avahi-daemon shouldn't need more than 15 to 20 open file descriptors concurrently.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-stack=</opt> Value in bytes for RLIMIT_STACK (maximum size of the process stack). Sensible values are heavily system dependent.</p>
-      </option>
-
-      <option>
-        <p><opt>rlimit-nproc=</opt> Value for RLIMIT_NPROC (number of process of user). avahi-daemon forks of a helper process on systems where <manref name="chroot" section="2"/> is available. Therefore this value should not be set below 2.</p>
-      </option>
-
-    </section>
-
-       <section name="Authors">
-         <p>The Avahi Developers &lt;@PACKAGE_BUGREPORT@&gt;; Avahi is
-         available from <url href="@PACKAGE_URL@"/></p>
-       </section>
-
-       <section name="See also">
-         <p>
-        <manref name="avahi-daemon" section="8"/>, <manref name="avahi-dnsconfd" section="8"/>
-         </p>
-       </section>
-
-       <section name="Comments">
-         <p>This man page was written using <manref name="xml2man" section="1"
-                 href="http://masqmail.cx/xml2man/"/> by Oliver Kurth.</p>
-       </section>
-
-  </manpage>
+<manpage name="avahi-daemon.conf" section="5" desc="avahi-daemon configuration file">
+
+  <synopsis>
+    <cmd>@pkgsysconfdir@/avahi-daemon.conf</cmd>
+  </synopsis>
+
+  <description>
+    <p><file>avahi-daemon.conf</file> is the configuration file for avahi-daemon.</p>
+  </description>
+
+  <section name="Section [Server]">
+
+    <option>
+      <p><opt>host-name=</opt> Set the host name avahi-daemon tries
+      to register on the LAN. If omited defaults to the system host
+      name as set with the sethostname() system call.</p>
+    </option>
+
+    <option>
+      <p><opt>domain-name=</opt> Set the default domain name avahi-daemon
+      tries to register its host name and services on the LAN in. If
+      omitted defaults to ".local".</p>
+    </option>
+
+    <option>
+      <p><opt>browse-domains=</opt> Set a comma separated list of
+      browsing domains (in addition to the default one and those
+      announced inside the default browsing domain). Please note
+      that the user may specify additional browsing domains on the
+      client side, either by setting $AVAHI_BROWSE_DOMAINS to a list
+      of colon separated domains or by adding them to the XDG config
+      file <file>~/.config/avahi/browse-domains</file> (separated by
+      newlines).</p>
+
+    </option>
+
+    <option>
+      <p><opt>use-ipv4=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "no" avahi-daemon will not use IPv4
+      sockets. Default is "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>use-ipv6=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "no" avahi-daemon will not use IPv6
+      sockets. Default is "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>allow-interfaces=</opt> Set a comma separated list of
+      allowed network interfaces that should be used by the
+      avahi-daemon.  Other interfaces will be ignored. If set to the
+      empty list all local interfaces except loopback and
+      point-to-point will be used.</p>
+    </option>
+
+    <option>
+      <p><opt>deny-interfaces=</opt> Set a comma separated list of
+      network interfaces that should be ignored by avahi-daemon.
+      Other not specified interfaces will be used, unless
+      <opt>allow-interfaces</opt> is set. This option takes
+      precedence over <opt>deny-interfaces</opt>.</p>
+    </option>
+
+    <option>
+      <p><opt>check-response-ttl=</opt> Takes a boolean value ("yes"
+      or "no"). If set to "yes", an additional security check is
+      activated: incoming IP packets will be ignored unless the IP
+      TTL is 255. Earlier mDNS specifications required this
+      check. Since this feature may be incompatible with newer
+      implementations of mDNS it defaults to "no". On the other hand
+      it provides extra security.</p>
+    </option>
+
+    <option>
+      <p><opt>use-iff-running=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "yes" avahi-daemon monitors the IFF_RUNNING
+      flag bit which is used by some (modern) network drivers to
+      tell user space if a network cable is plugged in (in case of
+      copper ethernet), or the network card is associated with some
+      kind of network (in case of WLAN). If IFF_RUNNING is set
+      avahi-daemon will automatically announce its services on that
+      network. Unfortunately far too many network drivers do not
+      support this flag or support it in a broken way. Therefore
+      this option defaults to "no".</p>
+    </option>
+
+    <option>
+      <p><opt>enable-dbus=</opt> Takes either "yes", "no" or
+      "warn". If set to "yes" avahi-daemon connects to D-Bus,
+      offering an object oriented client API. It is only available
+      if Avahi has been compiled with <opt>--enable-dbus</opt> in
+      which case it defaults to "yes". "warn" behaves like "yes",
+      but the daemon starts up even when it fails to connect to a
+      D-Bus daemon. In addition, if the connection to the D-Bus
+      daemon is terminated we try to reconnect. (Unless we are in a
+      chroot() environment where this definitely will fail.) </p>
+    </option>
+
+    <option>
+      <p><opt>disallow-other-stacks=</opt> Takes a boolean value
+      ("yes" or "no"). If set to "yes" no other process is allowed
+      to bind to UDP port 5353. This effectively impedes other mDNS
+      stacks from running on the host. Use this as a security
+      measure to make sure that only Avahi is responsible for mDNS
+      traffic. Please note that we do not recommend running multiple
+      mDNS stacks on the same host simultaneously. This hampers
+      reliability and is a waste of resources. However, to not annoy
+      people this option defaults to "no".</p>
+    </option>
+
+    <option>
+      <p><opt>allow-point-to-point=</opt> Takes a boolean value
+      ("yes" or "no"). If set to "yes" avahi-daemon will make use of
+      interfaces with the POINTOPOINT flag set. This option defaults
+      to "no" as it might make mDNS unreliable due to usually large
+      latencies with such links and opens a potential security hole
+      by allowing mDNS access from Internet connections. Use with
+      care and YMMV!</p>
+    </option>
+
+    <option>
+      <p><opt>cache-entries-max=</opt> Takes an unsigned integer
+      specifying how many resource records are cached per
+      interface. Bigger values allow mDNS work correctly in large LANs
+      but also increase memory consumption.</p>
+    </option>
+
+    <option>
+      <p><opt>clients-max=</opt> Takes an unsigned integer. The
+      maximum number of concurrent D-Bus clients allowed. If the
+      maximum number is reached further clients will be refused until
+      at least one existing client disconnects.</p>
+    </option>
+
+    <option>
+      <p><opt>objects-per-client-max=</opt> Takes an unsigned
+      integer. The maximum number of objects (entry groups, browsers,
+      resolvers) that may be registered per client at a time. If the
+      maximum number is reached further object creation will be
+      refused until at least one object is freed.</p>
+    </option>
+
+    <option>
+      <p><opt>entries-per-entry-group-max=</opt> Takes an unsigned
+      integer. The maximum number of entries (resource records) per
+      entry group at a time. If the maximum number is reached further
+      resource records may not be added to an entry group.</p>
+    </option>
+
+  </section>
+
+  <section name="Section [wide-area]">
+    <option>
+      <p><opt>enable-wide-area=</opt> Takes a boolean value
+      ("yes" or "no"). Enable wide-area DNS-SD, aka
+      DNS-SD over unicast DNS. If this is enabled only domains
+      ending in .local will be resolved on mDNS, all other domains
+      are resolved via unicast DNS. If you want to maintain multiple
+      different multicast DNS domains even with this option enabled
+      we encourage you to use subdomains of .local, such as
+      "kitchen.local". This option defaults to "yes".</p>
+    </option>
+
+  </section>
+
+  <section name="Section [publish]">
+
+    <option><p><opt>disable-publishing=</opt> Takes a boolean value
+    ("yes" or "no"). If set to "yes", no record will be published by
+    Avahi, not even address records for the local host. Avahi will
+    be started in a querying-only mode. Use this is a security
+    measure. This option defaults to "no"</p></option>
+
+    <option><p><opt>disable-user-service-publishing=</opt> Takes a boolean value
+    ("yes" or "no"). If set to "yes", Avahi will still publish
+    address records and suchlike but will not allow user
+    applications to publish services. Use this is a security
+    measure. This option defaults to "no"</p></option>
+
+    <option>
+      <p><opt>add-service-cookie=</opt> Takes a boolean value ("yes"
+      or "no"). If set to "yes" an implicit TXT entry will be added
+      to all locally registered services, containing a cookie value
+      which is chosen randomly on daemon startup. This can be used
+      to detect if two services on two different
+      interfaces/protocols are actually identical. Defaults to
+      "no".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-addresses=</opt> Takes a boolean value ("yes"
+      or "no"). If set to "yes" avahi-daemon will register mDNS
+      address records for all local IP addresses. Unless you want to
+      use avahi-daemon exclusively for browsing it's recommended to
+      enable this. If you plan to register local services you need
+      to enable this option. Defaults to "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-hinfo=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "yes" avahi-daemon will register an mDNS
+      HINFO record on all interfaces which contains information
+      about the local operating system and CPU, which might be
+      useful for administrative purposes. This is recommended by the
+      mDNS specification but not required. For the sake of privacy
+      you might choose to disable this feature. Defaults to
+      "yes."</p>
+    </option>
+
+    <option>
+      <p><opt>publish-workstation=</opt> Takes a boolean value
+      ("yes" or "no"). If set to "yes" avahi-daemon will register a
+      service of type "_workstation._tcp" on the local LAN. This
+      might be useful for administrative purposes (i.e. browse for
+      all PCs on the LAN), but is not required or recommended by any
+      specification. Newer MacOS X releases register a service of
+      this type. Defaults to "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-domain=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "yes" avahi-daemon will announce the locally
+      used domain name (see above) for browsing by other
+      hosts. Defaults to "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-dns-servers=</opt> Takes a comma separated
+      list of IP addresses for unicast DNS servers. You can use this
+      to announce unicast DNS servers via mDNS. When used in
+      conjunction with avahi-dnsconfd on the client
+      side this allows DHCP-like configuration of unicast DNS
+      servers.</p>
+    </option>
+
+    <option>
+      <p><opt>publish-resolv-conf-dns-servers=</opt> Takes a boolean
+      value ("yes" or "no"). If set to "yes" avahi-daemon will
+      publish the unicast DNS servers specified in
+      <file>/etc/resolv.conf</file> in addition to those specified
+      with <opt>publish-dns-servers</opt>. Send avahi-daemon a
+      SIGHUP to have it reload this file. Defaults to "no".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-aaaa-on-ipv4=</opt> Takes a boolean value
+      ("yes" or "no"). If set to "yes" avahi-daemon will publish an
+      IPv6 AAAA record via IPv4, i.e. the local IPv6 addresses can be
+      resolved using an IPv4 transport. Only useful when IPv4 is
+      enabled with <opt>use-ipv4=true</opt>. Defaults to "yes".</p>
+    </option>
+
+    <option>
+      <p><opt>publish-a-on-ipv6=</opt> Takes a boolean value
+      ("yes" or "no"). If set to "yes" avahi-daemon will publish an
+      IPv4 A record via IPv6, i.e. the local IPv4 addresses can be
+      resolved using an IPv6 transport. Only useful when IPv6 is
+      enabled with <opt>use-ipv6=true</opt>. Defaults to "no".</p>
+    </option>
+
+  </section>
+
+  <section name="Section [reflector]">
+    <option>
+      <p><opt>enable-reflector=</opt> Takes a boolean value ("yes"
+      or "no"). If set to "yes" avahi-daemon will reflect incoming
+      mDNS requests to all local network interfaces, effectively
+      allowing clients to browse mDNS/DNS-SD services on all
+      networks connected to the gateway. The gateway is somewhat
+      intelligent and should work with all kinds of mDNS traffic,
+      though some functionality is lost (specifically the unicast
+      reply bit, which is used rarely anyway). Make sure to not run
+      multiple reflectors between the same networks, this might
+      cause them to play Ping Pong with mDNS packets. Defaults to
+      "no".</p>
+    </option>
+
+    <option>
+      <p><opt>reflect-ipv=</opt> Takes a boolean value ("yes" or
+      "no"). If set to "yes" and <opt>enable-reflector</opt> is
+      enabled, avahi-daemon will forward mDNS traffic between IPv4
+      and IPv6, which is usually not recommended. Defaults to "no".</p>
+    </option>
+  </section>
+
+  <section name="Section [rlimits]">
+    <p>This section is used to define system resource limits for the
+    daemon. See <manref section="2" name="setrlimit"/> for more
+    information. If any of the options is not specified in the configuration
+    file, avahi-daemon does not change it from the system
+    defaults.</p>
+
+    <option>
+      <p><opt>rlimit-as=</opt> Value in bytes for RLIMIT_AS (maximum size of the process's virtual memory). Sensible values are heavily system dependent.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-core=</opt> Value in bytes for RLIMIT_CORE (maximum core file size). Unless you want to debug avahi-daemon, it is safe to set this to 0.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-data=</opt> Value in bytes for RLIMIT_DATA (maximum size of the process's data segment). Sensible values are heavily system dependent.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-fsize=</opt> Value for RLIMIT_FSIZE (maximum size of files the process may create). Since avahi-daemon shouldn't write any files to disk, it is safe to set this to 0.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-nofile=</opt> Value for RLIMIT_NOFILE (open file descriptors). avahi-daemon shouldn't need more than 15 to 20 open file descriptors concurrently.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-stack=</opt> Value in bytes for RLIMIT_STACK (maximum size of the process stack). Sensible values are heavily system dependent.</p>
+    </option>
+
+    <option>
+      <p><opt>rlimit-nproc=</opt> Value for RLIMIT_NPROC (number of process of user). avahi-daemon forks of a helper process on systems where <manref name="chroot" section="2"/> is available. Therefore this value should not be set below 2.</p>
+    </option>
+
+  </section>
+
+  <section name="Authors">
+    <p>The Avahi Developers &lt;@PACKAGE_BUGREPORT@&gt;; Avahi is
+    available from <url href="@PACKAGE_URL@"/></p>
+  </section>
+
+  <section name="See also">
+    <p>
+      <manref name="avahi-daemon" section="8"/>, <manref name="avahi-dnsconfd" section="8"/>
+    </p>
+  </section>
+
+  <section name="Comments">
+    <p>This man page was written using <manref name="xml2man" section="1"
+    href="http://masqmail.cx/xml2man/"/> by Oliver Kurth.</p>
+  </section>
+
+</manpage>