]> git.cameronkatri.com Git - cgit.git/commitdiff
scan_path(): Improve handling of inaccessible directories
authorJohan Herland <johan@herland.net>
Mon, 15 Nov 2010 19:40:43 +0000 (20:40 +0100)
committerLars Hjemli <larsh@prediktor.no>
Tue, 16 Nov 2010 08:03:43 +0000 (09:03 +0100)
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>
scan-tree.c

index a0e09ceac4212c1f8a07ca391d6bc67d6b0cb438..eda8c677805fc01c7e81134a9bd615370e2fa7d2 100644 (file)
@@ -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);
 }