batctl: avoid parsing bat-hosts multiple times

Message ID 4B8FA639.5000502@tiwoc.de (mailing list archive)
State Superseded, archived
Headers

Commit Message

Daniel Seither March 4, 2010, 12:23 p.m. UTC
  Currently, running batctl from the home directory leads to warnings
("Warning - mac already known") if ~/bat-hosts exists. This is caused by
batctl parsing both "~/bat-hosts" and "bat-hosts" which happen to be the
same file when the working directory is ~

This patch adds duplicate file name detection to bat_hosts_init() to
avoid these warnings.

Signed-off-by: Daniel Seither <post@tiwoc.de>
---
  

Comments

Marek Lindner March 4, 2010, 12:49 p.m. UTC | #1
On Thursday 04 March 2010 20:23:21 Daniel Seither wrote:
> Currently, running batctl from the home directory leads to warnings
> ("Warning - mac already known") if ~/bat-hosts exists. This is caused by
> batctl parsing both "~/bat-hosts" and "bat-hosts" which happen to be the
> same file when the working directory is ~
> 
> This patch adds duplicate file name detection to bat_hosts_init() to
> avoid these warnings.

I tested your patch and it works very well. That is a nice catch! I did not 
stumble over this problem before.
However, I wonder whether it would be better to let realpath() allocate the 
normalized file path buffer instead of using the static normalized array, simply 
to save some disk space. What do you think ?

Cheers,
Marek
  
Daniel Seither March 4, 2010, 1:48 p.m. UTC | #2
Marek Lindner schrieb:
> However, I wonder whether it would be better to let realpath() allocate the 
> normalized file path buffer instead of using the static normalized array, simply 
> to save some disk space. What do you think ?

Yes, would be better; I didn't think about this issue. I'll send an
updated patch in a few seconds.

Regards,
Daniel
  

Patch

Index: batctl/bat-hosts.c
===================================================================
--- batctl/bat-hosts.c	(revision 1579)
+++ batctl/bat-hosts.c	(working copy)
@@ -23,6 +23,7 @@ 

 #include <stdio.h>
 #include <stdint.h>
+#include <limits.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
@@ -144,9 +145,11 @@ 

 void bat_hosts_init(void)
 {
-	unsigned int i;
+	unsigned int i, j, parse;
 	char confdir[CONF_DIR_LEN];
 	char *homedir;
+	size_t locations = sizeof(bat_hosts_path) / sizeof(char *);
+	char normalized[locations][PATH_MAX];

 	host_hash = hash_new(64, compare_mac, choose_mac);

@@ -157,7 +160,7 @@ 

 	homedir = getenv("HOME");

-	for (i = 0; i < sizeof(bat_hosts_path) / sizeof(char *); i++) {
+	for (i = 0; i < locations; i++) {
 		strcpy(confdir, "");

 		if (strlen(bat_hosts_path[i]) >= 2
@@ -169,8 +172,22 @@ 
 			strncpy(confdir, bat_hosts_path[i], CONF_DIR_LEN);
 			confdir[CONF_DIR_LEN - 1] = '\0';
 		}
-
-		parse_hosts_file(&host_hash, confdir);
+		
+		if (realpath(confdir, normalized[i]) == NULL) {
+			normalized[i][0] = '\0';
+			continue;
+		}
+		
+		/* check for duplicates: don't parse the same file twice */	
+		parse = 1;
+		for (j = 0; j < i; j++)
+			if (strncmp(normalized[i], normalized[j], CONF_DIR_LEN) == 0) {
+				parse = 0;
+				break;
+			}
+	
+		if (parse && (normalized[i][0] != '\0'))
+			parse_hosts_file(&host_hash, normalized[i]);
 	}
 }