void setup_text_search(void);
void create_data_directory(void);
void create_xlog_symlink(void);
+void warn_on_mount_point(int error);
void initialize_data_directory(void);
void
create_data_directory(void)
{
- switch (pg_check_dir(pg_data))
+ int ret;
+
+ switch ((ret = pg_check_dir(pg_data)))
{
case 0:
/* PGDATA not there, must create it */
break;
case 2:
+ case 3:
+ case 4:
/* Present and not empty */
fprintf(stderr,
_("%s: directory \"%s\" exists but is not empty\n"),
progname, pg_data);
- fprintf(stderr,
- _("If you want to create a new database system, either remove or empty\n"
- "the directory \"%s\" or run %s\n"
- "with an argument other than \"%s\".\n"),
- pg_data, progname, pg_data);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ fprintf(stderr,
+ _("If you want to create a new database system, either remove or empty\n"
+ "the directory \"%s\" or run %s\n"
+ "with an argument other than \"%s\".\n"),
+ pg_data, progname, pg_data);
exit(1); /* no further message needed */
default:
if (strcmp(xlog_dir, "") != 0)
{
char *linkloc;
+ int ret;
/* clean up xlog directory name, check it's absolute */
canonicalize_path(xlog_dir);
}
/* check if the specified xlog directory exists/is empty */
- switch (pg_check_dir(xlog_dir))
+ switch ((ret = pg_check_dir(xlog_dir)))
{
case 0:
/* xlog directory not there, must create it */
break;
case 2:
+ case 3:
+ case 4:
/* Present and not empty */
fprintf(stderr,
_("%s: directory \"%s\" exists but is not empty\n"),
progname, xlog_dir);
- fprintf(stderr,
- _("If you want to store the transaction log there, either\n"
- "remove or empty the directory \"%s\".\n"),
- xlog_dir);
+ if (ret != 4)
+ warn_on_mount_point(ret);
+ else
+ fprintf(stderr,
+ _("If you want to store the transaction log there, either\n"
+ "remove or empty the directory \"%s\".\n"),
+ xlog_dir);
exit_nicely();
default:
}
+void
+warn_on_mount_point(int error)
+{
+ if (error == 2)
+ fprintf(stderr,
+ _("It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n"));
+ else if (error == 3)
+ fprintf(stderr,
+ _("It contains a lost+found directory, perhaps due to it being a mount point.\n"));
+
+ fprintf(stderr,
+ _("Using the top-level directory of a mount point is not recommended.\n"));
+}
+
+
void
initialize_data_directory(void)
{
int result = 1;
DIR *chkdir;
struct dirent *file;
+ bool dot_found = false;
errno = 0;
/* skip this and parent directory */
continue;
}
+#ifndef WIN32
+ /* file starts with "." */
+ else if (file->d_name[0] == '.')
+ {
+ dot_found = true;
+ }
+ else if (strcmp("lost+found", file->d_name) == 0)
+ {
+ result = 3; /* not empty, mount point */
+ break;
+ }
+#endif
else
{
- result = 2; /* not empty */
+ result = 4; /* not empty */
break;
}
}
#ifdef WIN32
-
/*
* This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but not in
* released version
if (errno != 0)
result = -1; /* some kind of I/O error? */
+ /* We report on dot-files if we _only_ find dot files */
+ if (result == 1 && dot_found)
+ result = 2;
+
return result;
}