]> git.meshlink.io Git - catta/blobdiff - avahi-daemon/main.c
* fixed a problem on FreeBSD where sysctl needs locked memory
[catta] / avahi-daemon / main.c
index 7508cf39f8324a40de87f36eb63e5869d216c704..12af74c32ef5615ce6aa25364c7f98e15380f0e7 100644 (file)
@@ -50,6 +50,7 @@
 #include <avahi-common/simple-watch.h>
 #include <avahi-common/error.h>
 #include <avahi-common/alternative.h>
+#include <avahi-common/domain.h>
 
 #include <avahi-core/core.h>
 #include <avahi-core/publish.h>
@@ -100,7 +101,8 @@ typedef struct {
     int use_chroot;
 #endif
     int modify_proc_title;
-    
+
+    int disable_user_service_publishing;
     int publish_resolv_conf;
     char ** publish_dns_servers;
     int debug;
@@ -457,6 +459,24 @@ static int load_config_file(DaemonConfig *c) {
                 } else if (strcasecmp(p->key, "domain-name") == 0) {
                     avahi_free(c->server_config.domain_name);
                     c->server_config.domain_name = avahi_strdup(p->value);
+                } else if (strcasecmp(p->key, "browse-domains") == 0) {
+                    char **e, **t;
+
+                    e = avahi_split_csv(p->value);
+                    
+                    for (t = e; *t; t++) {
+                        char cleaned[AVAHI_DOMAIN_NAME_MAX];
+
+                        if (!avahi_normalize_name(*t, cleaned, sizeof(cleaned))) {
+                            avahi_log_error("Invalid domain name \"%s\" for key \"%s\" in group \"%s\"\n", *t, p->key, g->name);
+                            avahi_strfreev(e);
+                            goto finish;
+                        }
+
+                        c->server_config.browse_domains = avahi_string_list_add(c->server_config.browse_domains, cleaned);
+                    }
+                    
+                    avahi_strfreev(e);
                 } else if (strcasecmp(p->key, "use-ipv4") == 0)
                     c->server_config.use_ipv4 = is_yes(p->value);
                 else if (strcasecmp(p->key, "use-ipv6") == 0)
@@ -467,6 +487,11 @@ static int load_config_file(DaemonConfig *c) {
                     c->server_config.use_iff_running = is_yes(p->value);
                 else if (strcasecmp(p->key, "disallow-other-stacks") == 0)
                     c->server_config.disallow_other_stacks = is_yes(p->value);
+                else if (strcasecmp(p->key, "disable-publishing") == 0)
+                    c->server_config.disable_publishing = is_yes(p->value);
+                else if (strcasecmp(p->key, "disable-user-service-publishing") == 0)
+                    c->disable_user_service_publishing = is_yes(p->value);
+#ifdef HAVE_DBUS
                 else if (strcasecmp(p->key, "enable-dbus") == 0) {
 
                     if (*(p->value) == 'w' || *(p->value) == 'W') {
@@ -478,10 +503,8 @@ static int load_config_file(DaemonConfig *c) {
                     } else {
                         c->enable_dbus = 0;
                     }
-                } else if (strcasecmp(p->key, "drop-root") == 0)
-                    c->drop_root = is_yes(p->value);
-                else if (strcasecmp(p->key, "add-service-cookie") == 0)
-                    c->server_config.add_service_cookie = is_yes(p->value);
+                }
+#endif
                 else {
                     avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name);
                     goto finish;
@@ -503,9 +526,11 @@ static int load_config_file(DaemonConfig *c) {
                     c->server_config.publish_domain = is_yes(p->value);
                 else if (strcasecmp(p->key, "publish-resolv-conf-dns-servers") == 0)
                     c->publish_resolv_conf = is_yes(p->value);
+                else if (strcasecmp(p->key, "add-service-cookie") == 0)
+                    c->server_config.add_service_cookie = is_yes(p->value);
                 else if (strcasecmp(p->key, "publish-dns-servers") == 0) {
                     avahi_strfreev(c->publish_dns_servers);
-                    c->publish_dns_servers = avahi_split_csv(p->value);
+                    c->publish_dns_servers = avahi_split_csv(p->value); 
                 } else {
                     avahi_log_error("Invalid configuration key \"%s\" in group \"%s\"\n", p->key, g->name);
                     goto finish;
@@ -678,6 +703,7 @@ static int run_server(DaemonConfig *c) {
     int error;
     const AvahiPoll *poll_api = NULL;
     AvahiWatch *sig_watch = NULL;
+    int retval_is_sent = 0;
 
     assert(c);
 
@@ -703,7 +729,7 @@ static int run_server(DaemonConfig *c) {
 
 #ifdef HAVE_DBUS
     if (c->enable_dbus) {
-        if (dbus_protocol_setup(poll_api) < 0) {
+        if (dbus_protocol_setup(poll_api, config.disable_user_service_publishing) < 0) {
 
             if (c->fail_on_missing_dbus)
                 goto finish;
@@ -722,14 +748,14 @@ static int run_server(DaemonConfig *c) {
             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("chroot() successful.");
+        avahi_log_info("Successfully dropped remaining capabilities.");
     }
     
 #endif
@@ -748,8 +774,10 @@ static int run_server(DaemonConfig *c) {
 
     update_wide_area_servers();
 
-    if (c->daemonize)
+    if (c->daemonize) {
         daemon_retval_send(0);
+       retval_is_sent = 1;
+    }
 
     for (;;) {
         if ((r = avahi_simple_poll_iterate(simple_poll_api, -1)) < 0) {
@@ -774,7 +802,7 @@ finish:
     
     simple_protocol_shutdown();
 
-#ifdef ENABLE_DBUS
+#ifdef HAVE_DBUS
     if (c->enable_dbus)
         dbus_protocol_shutdown();
 #endif
@@ -794,7 +822,7 @@ finish:
         simple_poll_api = NULL;
     }
 
-    if (r != 0 && c->daemonize)
+    if (!retval_is_sent && c->daemonize)
         daemon_retval_send(1);
     
     return r;
@@ -943,7 +971,8 @@ static void enforce_rlimits(void) {
         set_one_rlimit(RLIMIT_NPROC, config.rlimit_nproc, "RLIMIT_NPROC");
 #endif
 
-#ifdef RLIMIT_MEMLOCK
+    /* the sysctl() call from iface-pfroute.c needs locked memory on FreeBSD */
+#if defined(RLIMIT_MEMLOCK) && !defined(__FreeBSD__)
     /* We don't need locked memory */
     set_one_rlimit(RLIMIT_MEMLOCK, 0, "RLIMIT_MEMLOCK");
 #endif
@@ -992,7 +1021,8 @@ int main(int argc, char *argv[]) {
     config.use_chroot = 1;
 #endif
     config.modify_proc_title = 1;
-    
+
+    config.disable_user_service_publishing = 0;
     config.publish_dns_servers = NULL;
     config.publish_resolv_conf = 0;
     config.use_syslog = 0;
@@ -1157,7 +1187,7 @@ finish:
 #endif
     }
 
-#if ENABLE_CHROOT
+#ifdef ENABLE_CHROOT
     avahi_chroot_helper_shutdown();
 #endif