summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas2015-02-17 15:19:30 +0000
committerRobert Haas2015-02-17 15:19:30 +0000
commit5d6c2405f4bae6c87533d981d6a47587db501220 (patch)
tree9988097186f9c8c2f78851304d401264e0e443a7
parentc923e82a231ebfe7c4329984c68819e26837bee6 (diff)
Improve pg_check_dir code and comments.
Avoid losing errno if readdir() fails and closedir() works. Consistently return 4 rather than 3 if both a lost+found directory and other files are found, rather than returning one value or the other depending on the order of the directory listing. Update comments to match the actual behavior. These oversights date to commits 6f03927fce038096f53ca67eeab9adb24938f8a6 and 17f15239325a88581bb4f9cf91d38005f1f52d69. Marco Nenciarini
-rw-r--r--src/port/pgcheckdir.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/port/pgcheckdir.c b/src/port/pgcheckdir.c
index 706189369c..7102f2c741 100644
--- a/src/port/pgcheckdir.c
+++ b/src/port/pgcheckdir.c
@@ -22,7 +22,9 @@
* Returns:
* 0 if nonexistent
* 1 if exists and empty
- * 2 if exists and not empty
+ * 2 if exists and contains _only_ dot files
+ * 3 if exists and contains a mount point
+ * 4 if exists and not empty
* -1 if trouble accessing directory (errno reflects the error)
*/
int
@@ -32,6 +34,8 @@ pg_check_dir(const char *dir)
DIR *chkdir;
struct dirent *file;
bool dot_found = false;
+ bool mount_found = false;
+ int readdir_errno;
chkdir = opendir(dir);
if (chkdir == NULL)
@@ -51,10 +55,10 @@ pg_check_dir(const char *dir)
{
dot_found = true;
}
+ /* lost+found directory */
else if (strcmp("lost+found", file->d_name) == 0)
{
- result = 3; /* not empty, mount point */
- break;
+ mount_found = true;
}
#endif
else
@@ -64,9 +68,20 @@ pg_check_dir(const char *dir)
}
}
- if (errno || closedir(chkdir))
+ if (errno)
result = -1; /* some kind of I/O error? */
+ /* Close chkdir and avoid overwriting the readdir errno on success */
+ readdir_errno = errno;
+ if (closedir(chkdir))
+ result = -1; /* error executing closedir */
+ else
+ errno = readdir_errno;
+
+ /* We report on mount point if we find a lost+found directory */
+ if (result == 1 && mount_found)
+ result = 3;
+
/* We report on dot-files if we _only_ find dot files */
if (result == 1 && dot_found)
result = 2;