aboutsummaryrefslogtreecommitdiff
path: root/src/backend/replication/basebackup.c
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 /src/backend/replication/basebackup.c
parent75594e0cf7674d78ba40699ff614a847fe675dc2 (diff)
downloadpostgresql-9c32da5caa2efc9bdc7f04ae26488211ff219e8a.tar.gz
postgresql-9c32da5caa2efc9bdc7f04ae26488211ff219e8a.zip
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.
Diffstat (limited to 'src/backend/replication/basebackup.c')
-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 */