about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohan Herland <johan@herland.net>2010-11-15 20:40:43 +0100
committerLars Hjemli <larsh@prediktor.no>2010-11-16 09:03:43 +0100
commit682adbc0cad2baa1a6119013b166f52de3ee3352 (patch)
treebef3cd4f21672a40399816dcbcab2fedf20b5f5f
parentui-stats: Remove unnecessary #include (diff)
downloadcgit-pink-682adbc0cad2baa1a6119013b166f52de3ee3352.tar.gz
cgit-pink-682adbc0cad2baa1a6119013b166f52de3ee3352.zip
scan_path(): Improve handling of inaccessible directories
When scanning a tree containing inaccessible directories (e.g. '.ssh'
directories in users' homedirs, or repos with explicitly restricted access),
scan_path() currently causes three lines of "Permissions denied" errors to be
printed to the CGI error log per inaccessible directory:

  Error checking path /home/foo/.ssh: Permission denied (13)
  Error checking path /home/foo/.ssh/.git: Permission denied (13)
  Error opening directory /home/foo/.ssh: Permission denied (13)

This is a side-effect of calling is_git_dir(path) and
is_git_dir(fmt("%s/.git", path) _before_ we try to opendir(path).

By placing the opendir(path) before the two is_git_dir() calls, we reduce the
noise to a single line per inaccessible directory:

  Error opening directory /home/foo/.ssh: Permission denied (13)

Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Lars Hjemli <larsh@prediktor.no>
Diffstat (limited to '')
-rw-r--r--scan-tree.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/scan-tree.c b/scan-tree.c
index a0e09ce..eda8c67 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -159,24 +159,23 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
 
 static void scan_path(const char *base, const char *path, repo_config_fn fn)
 {
-	DIR *dir;
+	DIR *dir = opendir(path);
 	struct dirent *ent;
 	char *buf;
 	struct stat st;
 
+	if (!dir) {
+		fprintf(stderr, "Error opening directory %s: %s (%d)\n",
+			path, strerror(errno), errno);
+		return;
+	}
 	if (is_git_dir(path)) {
 		add_repo(base, path, fn);
-		return;
+		goto end;
 	}
 	if (is_git_dir(fmt("%s/.git", path))) {
 		add_repo(base, fmt("%s/.git", path), fn);
-		return;
-	}
-	dir = opendir(path);
-	if (!dir) {
-		fprintf(stderr, "Error opening directory %s: %s (%d)\n",
-			path, strerror(errno), errno);
-		return;
+		goto end;
 	}
 	while((ent = readdir(dir)) != NULL) {
 		if (ent->d_name[0] == '.') {
@@ -202,6 +201,7 @@ static void scan_path(const char *base, const char *path, repo_config_fn fn)
 			scan_path(base, buf, fn);
 		free(buf);
 	}
+end:
 	closedir(dir);
 }
 
1-10 18:51:36 -0500'>2019-11-10Expand client configuration documentation and list capabilitiesJune McEnroe 2019-11-10Request all supported caps from serverJune McEnroe 2019-11-10Filter ACCOUNT, AWAY, CHGHOST for incapable clientsJune McEnroe 2019-11-10Rename listen to localJune McEnroe 2019-11-09Remove extended-join and invite-notifyJune McEnroe The remaining caps only generate new commands which can easily be filtered out when sending to clients so will be in the first pass of support. extended-join is probably safe to pass through unaltered, just causing extraneous parameters on JOIN commands, but maybe not. invite-notify reuses the INVITE command where the invited user is not self. 2019-11-09Maintain stateCaps and offer them to clientsJune McEnroe 2019-11-09Parse capabilitiesJune McEnroe The list that I've defined are the ones that I expect to be able to enable probably without any clients breaking... And of course server-time which pounce implements itself. 2019-11-09Avoid the reserved _A names with BIT macroJune McEnroe 2019-11-09Define macro for bit flag enumsJune McEnroe 2019-11-08Check that password is hashedJune McEnroe 2019-11-08Avoid calling getopt_long again after it returns -1June McEnroe On GNU, calling getopt_long again will reset optind back to the first non-option argument, which would cause an infinite loop of reading the same configurtion file forever. 2019-11-08Only change AWAY status for registered clientsJune McEnroe Turns out I did eventually fix this, because I may want to implement "passive clients" for logging or notification stuff, which wouldn't affect AWAY status either. 2019-11-07Just write the example normallyJune McEnroe 2019-11-07Include path in readlinkat errorJune McEnroe 2019-11-07Call clientConsume before clientRecvJune McEnroe This might reduce the frequency of a client getting its own message back because it was behind in the ring when it sent it. 2019-11-06Use -l:filename in Linux.mkJune McEnroe 2019-11-06Fix compat.h for #defined strlcpyJune McEnroe 2019-11-06Allow unsetting LIBRESSL_PREFIXJune McEnroe 2019-11-06Document calico service configurationJune McEnroe 2019-11-06Document SASL EXTERNAL configuration in more detailJune McEnroe 2019-11-06Document pounce service configurationJune McEnroe 2019-11-06Mention Darwin and GNU/Linux in READMEJune McEnroe 2019-11-06Assume LibreSSL from brew on DarwinJune McEnroe 2019-11-06Remove -DNO_EXPLICIT_BZERO from Darwin.mkJune McEnroe 2019-11-06Don't install rc scripts or dirs on LinuxJune McEnroe