]> git.meshlink.io Git - meshlink/commitdiff
Only keep at most 5 Address hints.
authorGuus Sliepen <guus@meshlink.io>
Mon, 14 Aug 2017 19:23:50 +0000 (21:23 +0200)
committerGuus Sliepen <guus@meshlink.io>
Mon, 14 Aug 2017 19:23:50 +0000 (21:23 +0200)
src/conf.c
src/conf.h
src/meshlink.c

index c5c3264e655d5d696d2296314685f06691d87924..ceca04db2fa46840ebd9e79f8f308e3bea538964 100644 (file)
@@ -383,8 +383,8 @@ bool write_host_config(struct meshlink_handle *mesh, const struct splay_tree_t *
        return write_config_file(config_tree, filename);
 }
 
-bool modify_config_file(struct meshlink_handle *mesh, const char *name, const char *key, const char *value, bool replace) {
-       assert(mesh && name && key && (replace || value));
+bool modify_config_file(struct meshlink_handle *mesh, const char *name, const char *key, const char *value, int trim) {
+       assert(mesh && name && key);
 
        char filename[PATH_MAX];
        char tmpname[PATH_MAX];
@@ -410,7 +410,12 @@ bool modify_config_file(struct meshlink_handle *mesh, const char *name, const ch
 
        char buf[4096];
        char *sep;
-       bool found = false;
+       int found = 0;
+
+       if(value) {
+               fprintf(fw, "%s = %s\n", key, value);
+               found++;
+       }
 
        while(readline(fr, buf, sizeof(buf))) {
                if(!*buf || *buf == '#')
@@ -426,20 +431,13 @@ bool modify_config_file(struct meshlink_handle *mesh, const char *name, const ch
                        goto copy;
                }
 
-               if(!value) {
-                       found = true;
+               // We found the key and the value. We already added it at the top, so ignore this one.
+               if(sep[1] == '=' && sep[2] == ' ' && !strcmp(sep + 3, value))
                        continue;
-               }
-
-               // We found the key and the value. Keep one copy around.
-               if(sep[1] == '=' && sep[2] == ' ' && !strcmp(sep + 3, value)) {
-                       if(found)
-                               continue;
-                       found = true;
-               }
 
                // We found the key but with a different value, delete it if wanted.
-               if(!found && replace)
+               found++;
+               if((!value || trim) && found > trim)
                        continue;
 
                *sep = ' ';
@@ -453,10 +451,6 @@ copy:
 
        fclose(fr);
 
-       // Add new key/value pair if necessary
-       if(!found && value)
-               fprintf(fw, "%s = %s\n", key, value);
-
        if(ferror(fw))
                error = true;
 
@@ -488,5 +482,5 @@ copy:
 }
 
 bool append_config_file(meshlink_handle_t *mesh, const char *name, const char *key, const char *value) {
-       return modify_config_file(mesh, name, key, value, false);
+       return modify_config_file(mesh, name, key, value, 0);
 }
index 715f9965f6293366ea200bcee5a435e6e90b4204..fd48ea64feb515b8cd94cf34a2cb70aed687b7db 100644 (file)
@@ -52,7 +52,7 @@ extern bool write_config_file(const struct splay_tree_t *, const char *);
 extern bool read_server_config(struct meshlink_handle *mesh);
 extern bool read_host_config(struct meshlink_handle *mesh, struct splay_tree_t *, const char *);
 extern bool write_host_config(struct meshlink_handle *mesh, const struct splay_tree_t *, const char *);
-extern bool modify_config_file(struct meshlink_handle *mesh, const char *, const char *, const char *, bool);
-extern bool append_config_file(struct meshlink_handle *mesh, const char *, const char *, const char *);
+extern bool modify_config_file(struct meshlink_handle *mesh, const char *name, const char *key, const char *value, int trim);
+extern bool append_config_file(struct meshlink_handle *mesh, const char *name, const char *key, const char *value);
 
 #endif
index 6e03e63bbe7e1b3848ccb8678c2a8b9fd4207d22..5d75e0688bcda7858048b57ed9d3644750f0cc6d 100644 (file)
@@ -2085,7 +2085,7 @@ void meshlink_hint_address(meshlink_handle_t *mesh, meshlink_node_t *node, const
        if(host && port) {
                xasprintf(&str, "%s %s", host, port);
                if((strncmp("fe80", host, 4) != 0) && (strncmp("127.", host, 4) != 0) && (strcmp("localhost", host) != 0))
-                       append_config_file(mesh, node->name, "Address", str);
+                       modify_config_file(mesh, node->name, "Address", str, 5);
                else
                        logger(mesh, MESHLINK_DEBUG, "Not adding Link Local IPv6 Address to config\n");
        }