diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/access/transam/xlogarchive.c | 45 | ||||
-rw-r--r-- | src/backend/libpq/be-secure-common.c | 38 | ||||
-rw-r--r-- | src/backend/postmaster/shell_archive.c | 61 |
3 files changed, 26 insertions, 118 deletions
diff --git a/src/backend/access/transam/xlogarchive.c b/src/backend/access/transam/xlogarchive.c index 76abc74c678..f911e8c3a6f 100644 --- a/src/backend/access/transam/xlogarchive.c +++ b/src/backend/access/transam/xlogarchive.c @@ -23,6 +23,7 @@ #include "access/xlog_internal.h" #include "access/xlogarchive.h" #include "common/archive.h" +#include "common/percentrepl.h" #include "miscadmin.h" #include "pgstat.h" #include "postmaster/startup.h" @@ -291,11 +292,8 @@ void ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOnSignal, uint32 wait_event_info) { - char xlogRecoveryCmd[MAXPGPATH]; + char *xlogRecoveryCmd; char lastRestartPointFname[MAXPGPATH]; - char *dp; - char *endp; - const char *sp; int rc; XLogSegNo restartSegNo; XLogRecPtr restartRedoPtr; @@ -316,42 +314,7 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, /* * construct the command to be executed */ - dp = xlogRecoveryCmd; - endp = xlogRecoveryCmd + MAXPGPATH - 1; - *endp = '\0'; - - for (sp = command; *sp; sp++) - { - if (*sp == '%') - { - switch (sp[1]) - { - case 'r': - /* %r: filename of last restartpoint */ - sp++; - strlcpy(dp, lastRestartPointFname, endp - dp); - dp += strlen(dp); - break; - case '%': - /* convert %% to a single % */ - sp++; - if (dp < endp) - *dp++ = *sp; - break; - default: - /* otherwise treat the % as not special */ - if (dp < endp) - *dp++ = *sp; - break; - } - } - else - { - if (dp < endp) - *dp++ = *sp; - } - } - *dp = '\0'; + xlogRecoveryCmd = replace_percent_placeholders(command, commandName, "r", lastRestartPointFname); ereport(DEBUG3, (errmsg_internal("executing %s \"%s\"", commandName, command))); @@ -364,6 +327,8 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, rc = system(xlogRecoveryCmd); pgstat_report_wait_end(); + pfree(xlogRecoveryCmd); + if (rc != 0) { /* diff --git a/src/backend/libpq/be-secure-common.c b/src/backend/libpq/be-secure-common.c index f6078c91c34..ab5e2dfa2bf 100644 --- a/src/backend/libpq/be-secure-common.c +++ b/src/backend/libpq/be-secure-common.c @@ -22,6 +22,7 @@ #include <sys/stat.h> #include <unistd.h> +#include "common/percentrepl.h" #include "common/string.h" #include "libpq/libpq.h" #include "storage/fd.h" @@ -39,8 +40,7 @@ int run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, int size) { int loglevel = is_server_start ? ERROR : LOG; - StringInfoData command; - char *p; + char *command; FILE *fh; int pclose_rc; size_t len = 0; @@ -49,37 +49,15 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, Assert(size > 0); buf[0] = '\0'; - initStringInfo(&command); + command = replace_percent_placeholders(ssl_passphrase_command, "ssl_passphrase_command", "p", prompt); - for (p = ssl_passphrase_command; *p; p++) - { - if (p[0] == '%') - { - switch (p[1]) - { - case 'p': - appendStringInfoString(&command, prompt); - p++; - break; - case '%': - appendStringInfoChar(&command, '%'); - p++; - break; - default: - appendStringInfoChar(&command, p[0]); - } - } - else - appendStringInfoChar(&command, p[0]); - } - - fh = OpenPipeStream(command.data, "r"); + fh = OpenPipeStream(command, "r"); if (fh == NULL) { ereport(loglevel, (errcode_for_file_access(), errmsg("could not execute command \"%s\": %m", - command.data))); + command))); goto error; } @@ -91,7 +69,7 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, ereport(loglevel, (errcode_for_file_access(), errmsg("could not read from command \"%s\": %m", - command.data))); + command))); goto error; } } @@ -111,7 +89,7 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, ereport(loglevel, (errcode_for_file_access(), errmsg("command \"%s\" failed", - command.data), + command), errdetail_internal("%s", wait_result_to_str(pclose_rc)))); goto error; } @@ -120,7 +98,7 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, len = pg_strip_crlf(buf); error: - pfree(command.data); + pfree(command); return len; } diff --git a/src/backend/postmaster/shell_archive.c b/src/backend/postmaster/shell_archive.c index 6f98414a408..806b81c3f22 100644 --- a/src/backend/postmaster/shell_archive.c +++ b/src/backend/postmaster/shell_archive.c @@ -18,6 +18,7 @@ #include <sys/wait.h> #include "access/xlog.h" +#include "common/percentrepl.h" #include "pgstat.h" #include "postmaster/pgarch.h" @@ -44,58 +45,20 @@ shell_archive_configured(void) static bool shell_archive_file(const char *file, const char *path) { - char xlogarchcmd[MAXPGPATH]; - char *dp; - char *endp; - const char *sp; + char *xlogarchcmd; + char *nativePath = NULL; int rc; - /* - * construct the command to be executed - */ - dp = xlogarchcmd; - endp = xlogarchcmd + MAXPGPATH - 1; - *endp = '\0'; - - for (sp = XLogArchiveCommand; *sp; sp++) + if (path) { - if (*sp == '%') - { - switch (sp[1]) - { - case 'p': - /* %p: relative path of source file */ - sp++; - strlcpy(dp, path, endp - dp); - make_native_path(dp); - dp += strlen(dp); - break; - case 'f': - /* %f: filename of source file */ - sp++; - strlcpy(dp, file, endp - dp); - dp += strlen(dp); - break; - case '%': - /* convert %% to a single % */ - sp++; - if (dp < endp) - *dp++ = *sp; - break; - default: - /* otherwise treat the % as not special */ - if (dp < endp) - *dp++ = *sp; - break; - } - } - else - { - if (dp < endp) - *dp++ = *sp; - } + nativePath = pstrdup(path); + make_native_path(nativePath); } - *dp = '\0'; + + xlogarchcmd = replace_percent_placeholders(XLogArchiveCommand, "archive_command", "fp", file, nativePath); + + if (nativePath) + pfree(nativePath); ereport(DEBUG3, (errmsg_internal("executing archive command \"%s\"", @@ -155,6 +118,8 @@ shell_archive_file(const char *file, const char *path) return false; } + pfree(xlogarchcmd); + elog(DEBUG1, "archived write-ahead log file \"%s\"", file); return true; } |