version 1.19, 2019/03/06 18:37:22 |
version 1.20, 2019/03/23 00:20:55 |
|
|
} |
} |
|
|
/* |
/* |
* Pledges: dns, inet, unix, unveil, rpath, cpath, wpath, stdio, fattr, chown. |
* Talk to a remote rsync://-enabled server sender. |
* |
* Returns exit code 0 on success, 1 on failure, 2 on failure with |
* Pledges (dry-run): -unix, -cpath, -wpath, -fattr, -chown. |
* incompatible protocols. |
* Pledges (!preserve_times): -fattr. |
|
*/ |
*/ |
int |
int |
rsync_socket(const struct opts *opts, const struct fargs *f) |
rsync_socket(const struct opts *opts, const struct fargs *f) |
|
|
struct sess sess; |
struct sess sess; |
struct source *src = NULL; |
struct source *src = NULL; |
size_t i, srcsz = 0; |
size_t i, srcsz = 0; |
int sd = -1, rc = 0; |
int sd = -1, rc = 1, c; |
char **args, buf[BUFSIZ]; |
char **args, buf[BUFSIZ]; |
uint8_t byte; |
uint8_t byte; |
|
|
|
|
|
|
assert(srcsz); |
assert(srcsz); |
for (i = 0; i < srcsz; i++) { |
for (i = 0; i < srcsz; i++) { |
rc = inet_connect(&sess, &sd, &src[i], f->host); |
c = inet_connect(&sess, &sd, &src[i], f->host); |
if (rc < 0) { |
if (c < 0) { |
ERRX1(&sess, "inet_connect"); |
ERRX1(&sess, "inet_connect"); |
goto out; |
goto out; |
} else if (rc > 0) |
} else if (c > 0) |
break; |
break; |
} |
} |
|
|
|
|
if (buf[i - 1] == '\r') |
if (buf[i - 1] == '\r') |
buf[i - 1] = '\0'; |
buf[i - 1] = '\0'; |
|
|
if ((rc = protocol_line(&sess, f->host, buf)) < 0) { |
if ((c = protocol_line(&sess, f->host, buf)) < 0) { |
ERRX1(&sess, "protocol_line"); |
ERRX1(&sess, "protocol_line"); |
goto out; |
goto out; |
} else if (rc > 0) |
} else if (c > 0) |
break; |
break; |
} |
} |
|
|
|
|
"than our own (%" PRId32 " < %" PRId32 "): " |
"than our own (%" PRId32 " < %" PRId32 "): " |
"this is not supported", |
"this is not supported", |
sess.rver, sess.lver); |
sess.rver, sess.lver); |
|
rc = 2; |
goto out; |
goto out; |
} |
} |
|
|
|
|
WARNX(&sess, "data remains in read pipe"); |
WARNX(&sess, "data remains in read pipe"); |
#endif |
#endif |
|
|
rc = 1; |
rc = 0; |
out: |
out: |
free(src); |
free(src); |
free(args); |
free(args); |