summaryrefslogtreecommitdiff
path: root/socket.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2007-08-11 16:20:56 +0000
committerWayne Davison <wayned@samba.org>2007-08-11 16:20:56 +0000
commite5f1a96ff8a62685b0499e9c9f17300501bc5c8f (patch)
treea3275c39934538c1b5494d6f478a32c737cad213 /socket.c
parenteb7e7b24996734dd929c5bc1fbc0744b3908e5d8 (diff)
downloadrsync-e5f1a96ff8a62685b0499e9c9f17300501bc5c8f.tar.gz
Added support for a %H escape in the value of the RSYNC_CONNECT_PROG
environment variable.
Diffstat (limited to 'socket.c')
-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 " : "",