summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2011-12-07 12:09:05 +0100
committerMagnus Hagander <magnus@hagander.net>2011-12-07 12:09:59 +0100
commit9c32da5caa2efc9bdc7f04ae26488211ff219e8a (patch)
tree7aa083721520b8221fb252334bbe8abb994afc86
parent75594e0cf7674d78ba40699ff614a847fe675dc2 (diff)
Avoid using readlink() on platforms that don't support it
We don't have any such platforms now, but might in the future. Also, detect cases when a tablespace symlink points to a path that is longer than we can handle, and give a warning.
-rw-r--r--src/backend/replication/basebackup.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index d6ed49a26fa..73a7f17149e 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -108,6 +108,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
{
char fullpath[MAXPGPATH];
char linkpath[MAXPGPATH];
+ int rllen;
/* Skip special stuff */
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
@@ -115,19 +116,37 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name);
- MemSet(linkpath, 0, sizeof(linkpath));
- if (readlink(fullpath, linkpath, sizeof(linkpath) - 1) == -1)
+#if defined(HAVE_READLINK) || defined(WIN32)
+ rllen = readlink(fullpath, linkpath, sizeof(linkpath) - 1);
+ if (rllen < 0)
+ {
+ ereport(WARNING,
+ (errmsg("could not read symbolic link \"%s\": %m", fullpath)));
+ continue;
+ }
+ else if (rllen >= sizeof(linkpath))
{
ereport(WARNING,
- (errmsg("could not read symbolic link \"%s\": %m", fullpath)));
+ (errmsg("symbolic link \"%s\" target is too long", fullpath)));
continue;
}
+ linkpath[rllen] = '\0';
ti = palloc(sizeof(tablespaceinfo));
ti->oid = pstrdup(de->d_name);
ti->path = pstrdup(linkpath);
ti->size = opt->progress ? sendDir(linkpath, strlen(linkpath), true) : -1;
tablespaces = lappend(tablespaces, ti);
+#else
+ /*
+ * If the platform does not have symbolic links, it should not be possible
+ * to have tablespaces - clearly somebody else created them. Warn about it
+ * and ignore.
+ */
+ ereport(WARNING,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("tablespaces are not supported on this platform")));
+#endif
}
/* Add a node for the base directory at the end */