Commit 1f422db6 authored by Magnus Hagander's avatar Magnus Hagander

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.
parent 16d8e594
...@@ -109,6 +109,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) ...@@ -109,6 +109,7 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
{ {
char fullpath[MAXPGPATH]; char fullpath[MAXPGPATH];
char linkpath[MAXPGPATH]; char linkpath[MAXPGPATH];
int rllen;
/* Skip special stuff */ /* Skip special stuff */
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
...@@ -116,19 +117,37 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir) ...@@ -116,19 +117,37 @@ perform_base_backup(basebackup_options *opt, DIR *tblspcdir)
snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name); snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name);
MemSet(linkpath, 0, sizeof(linkpath)); #if defined(HAVE_READLINK) || defined(WIN32)
if (readlink(fullpath, linkpath, sizeof(linkpath) - 1) == -1) 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, ereport(WARNING,
(errmsg("could not read symbolic link \"%s\": %m", fullpath))); (errmsg("symbolic link \"%s\" target is too long", fullpath)));
continue; continue;
} }
linkpath[rllen] = '\0';
ti = palloc(sizeof(tablespaceinfo)); ti = palloc(sizeof(tablespaceinfo));
ti->oid = pstrdup(de->d_name); ti->oid = pstrdup(de->d_name);
ti->path = pstrdup(linkpath); ti->path = pstrdup(linkpath);
ti->size = opt->progress ? sendDir(linkpath, strlen(linkpath), true) : -1; ti->size = opt->progress ? sendDir(linkpath, strlen(linkpath), true) : -1;
tablespaces = lappend(tablespaces, ti); 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 */ /* Add a node for the base directory at the end */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment