]> gitweb.ps.run Git - ps-cgit/blobdiff - scan-tree.c
scan_path(): Improve handling of inaccessible directories
[ps-cgit] / 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)
 {
 
 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;
 
        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);
        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);
        }
        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] == '.') {
        }
        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);
        }
                        scan_path(base, buf, fn);
                free(buf);
        }
+end:
        closedir(dir);
 }
 
        closedir(dir);
 }