mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-05 19:09:58 +08:00
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.
This commit is contained in:
parent
16d8e594ac
commit
1f422db663
@ -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)
|
|||||||
|
|
||||||
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,
|
ereport(WARNING,
|
||||||
(errmsg("could not read symbolic link \"%s\": %m", fullpath)));
|
(errmsg("could not read symbolic link \"%s\": %m", fullpath)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (rllen >= sizeof(linkpath))
|
||||||
|
{
|
||||||
|
ereport(WARNING,
|
||||||
|
(errmsg("symbolic link \"%s\" target is too long", fullpath)));
|
||||||
|
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user