summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--socket.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/socket.c b/socket.c
index f0b1318a..9017007c 100644
--- a/socket.c
+++ b/socket.c
@@ -300,6 +300,42 @@ int open_socket_out_wrapped(char *host, int port, const char *bind_addr,
{
char *prog = getenv("RSYNC_CONNECT_PROG");
+ if (strchr(prog, '%')) {
+ int hlen = strlen(host);
+ int len = strlen(prog) + 1;
+ char *f, *t;
+ for (f = prog; *f; f++) {
+ if (*f != '%')
+ continue;
+ /* Compute more than enough room. */
+ if (f[1] == '%')
+ f++;
+ else
+ len += hlen;
+ }
+ f = prog;
+ if (!(prog = new_array(char, len)))
+ out_of_memory("open_socket_out_wrapped");
+ for (t = prog; *f; f++) {
+ if (*f == '%') {
+ switch (*++f) {
+ case '%':
+ /* Just skips the extra '%'. */
+ break;
+ case 'H':
+ memcpy(t, host, hlen);
+ t += hlen;
+ continue;
+ default:
+ f--; /* pass % through */
+ break;
+ }
+ }
+ *t++ = *f;
+ }
+ *t = '\0';
+ }
+
if (verbose >= 2) {
rprintf(FINFO, "%sopening tcp connection to %s port %d\n",
prog ? "Using RSYNC_CONNECT_PROG instead of " : "",