mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-10-22 22:04:15 -04:00
Generate a helpful message when we get an option-error from a daemon
while requesting a file-listing and we suspect that the remote rsync is complaining about the -d option.
This commit is contained in:
1 parent
cfdb27b0c1
commit
7f9bf6b710
1 file changed
+43
@@ -45,6 +45,7 @@ extern int inc_recurse;
|
||||
extern int io_error;
|
||||
extern int eol_nulls;
|
||||
extern int flist_eof;
|
||||
extern int list_only;
|
||||
extern int read_batch;
|
||||
extern int csum_length;
|
||||
extern int protect_args;
|
||||
@@ -104,6 +105,7 @@ static int defer_forwarding_messages = 0, defer_forwarding_keep = 0;
|
||||
static int select_timeout = SELECT_TIMEOUT;
|
||||
static int active_filecnt = 0;
|
||||
static OFF_T active_bytecnt = 0;
|
||||
static int first_message = 1;
|
||||
|
||||
static char int_byte_extra[64] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* (00 - 3F)/4 */
|
||||
@@ -112,6 +114,9 @@ static char int_byte_extra[64] = {
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6, /* (C0 - FF)/4 */
|
||||
};
|
||||
|
||||
#define REMOTE_OPTION_ERROR "rsync: on remote machine: -"
|
||||
#define REMOTE_OPTION_ERROR2 ": unknown option"
|
||||
|
||||
enum festatus { FES_SUCCESS, FES_REDO, FES_NO_SEND };
|
||||
|
||||
static void readfd(int fd, char *buffer, size_t N);
|
||||
@@ -321,6 +326,37 @@ static void msg_flush(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void check_for_d_option_error(const char *msg)
|
||||
{
|
||||
static char rsync263_opts[] = "BCDHIKLPRSTWabceghlnopqrtuvxz";
|
||||
char *colon;
|
||||
int saw_d = 0;
|
||||
|
||||
if (*msg != 'r'
|
||||
|| strncmp(msg, REMOTE_OPTION_ERROR, sizeof REMOTE_OPTION_ERROR - 1) != 0)
|
||||
return;
|
||||
|
||||
msg += sizeof REMOTE_OPTION_ERROR - 1;
|
||||
if (*msg == '-' || (colon = strchr(msg, ':')) == NULL
|
||||
|| strncmp(colon, REMOTE_OPTION_ERROR2, sizeof REMOTE_OPTION_ERROR2 - 1) != 0)
|
||||
return;
|
||||
|
||||
for ( ; *msg != ':'; msg++) {
|
||||
if (*msg == 'd')
|
||||
saw_d = 1;
|
||||
else if (*msg == 'e')
|
||||
break;
|
||||
else if (strchr(rsync263_opts, *msg) == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
if (saw_d) {
|
||||
rprintf(FWARNING,
|
||||
"*** Try adding \"-r --exclude='/*/*'\" "
|
||||
"if remote rsync is <= 2.6.3 ***\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Read a message from the MSG_* fd and handle it. This is called either
|
||||
* during the early stages of being a local sender (up through the sending
|
||||
* of the file list) or when we're the generator (to fetch the messages
|
||||
@@ -1119,6 +1155,13 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
|
||||
}
|
||||
read_loop(fd, line, msg_bytes);
|
||||
rwrite((enum logcode)tag, line, msg_bytes, 1);
|
||||
if (first_message) {
|
||||
if (list_only && !am_sender && tag == 1) {
|
||||
line[msg_bytes] = '\0';
|
||||
check_for_d_option_error(line);
|
||||
}
|
||||
first_message = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
rprintf(FERROR, "unexpected tag %d [%s]\n",
|
||||
|
||||
Reference in new issue
Block a user