]> git.meshlink.io Git - catta/blobdiff - avahi-daemon/main.c
core: implement packet rate limiting and enable it by default
[catta] / avahi-daemon / main.c
index 6dd2dcd3062bbc84a2b9ca9e8ad77a9419320e12..8bd856eee68a84a8bb5175e2fd7354eb39e357bb 100644 (file)
@@ -551,6 +551,26 @@ static int parse_unsigned(const char *s, unsigned *u) {
     return 0;
 }
 
+static int parse_usec(const char *s, AvahiUsec *u) {
+    char *e = NULL;
+    unsigned long long ull;
+    AvahiUsec k;
+
+    errno = 0;
+    ull = strtoull(s, &e, 0);
+
+    if (!e || *e || errno != 0)
+        return -1;
+
+    k = (AvahiUsec) ull;
+
+    if ((unsigned long long) k != ull)
+        return -1;
+
+    *u = k;
+    return 0;
+}
+
 static int load_config_file(DaemonConfig *c) {
     int r = -1;
     AvahiIniFile *f;
@@ -642,6 +662,26 @@ 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, "ratelimit-interval-usec") == 0) {
+                    AvahiUsec k;
+
+                    if (parse_usec(p->value, &k) < 0) {
+                        avahi_log_error("Invalid ratelimit-interval-usec setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->server_config.ratelimit_interval = k;
+
+                } else if (strcasecmp(p->key, "ratelimit-burst") == 0) {
+                    unsigned k;
+
+                    if (parse_unsigned(p->value, &k) < 0) {
+                        avahi_log_error("Invalid ratelimit-burst setting %s", p->value);
+                        goto finish;
+                    }
+
+                    c->server_config.ratelimit_burst = k;
+
                 } else if (strcasecmp(p->key, "cache-entries-max") == 0) {
                     unsigned k;
 
@@ -1525,10 +1565,8 @@ int main(int argc, char *argv[]) {
             daemon_log_use = DAEMON_LOG_SYSLOG;
 
         if (sd_listen_fds(0) <= 0)
-            if (daemon_close_all(-1) < 0) {
-                avahi_log_error("Failed to close remaining file descriptors: %s", strerror(errno));
-                goto finish;
-            }
+            if (daemon_close_all(-1) < 0)
+                avahi_log_warn("Failed to close all remaining file descriptors: %s", strerror(errno));
 
         if (make_runtime_dir() < 0)
             goto finish;