On Tue, 26 Jun 2001, Martin Pool wrote:
> On 25 Jun 2001, Wayne Davison <[EMAIL PROTECTED]> wrote:
> > I was wondering if the protocol should be updated to avoid ever
> > assuming that an EOF on the socket was OK. The only case I know of
> > where this allowed is when we're listing modules from an rsync server.
> > If we modified the protocol to have the daemon rsync send an EOF token
> > (such as "@RSYNCD: EOF") at the end of the list, this would allow the
> > rsync client to always report an unexpected EOF as an error.
>
> Yes, that sounds good. I think I applied the patch that clears up the
> "is eof OK?" flag, so please go ahead and send the new one.
I haven't seen this show up in the CVS version at pserver.samba.org.
Here's (finally) a combo patch that incorporates my previous two patches
(that removed the bogus EOF error) while also adding an EOF-marker
message if the other rsync is using the newest protocol (eliminating the
need for us to ever allow an actual EOF to be silently ignored).
..wayne..
---8<------8<------8<------8<---cut here--->8------>8------>8------>8---
Index: rsync/authenticate.c
--- rsync/authenticate.c 22 Jun 2001 10:16:04 -0000 1.17
+++ rsync/authenticate.c 10 Jul 2001 22:41:28 -0000
@@ -224,7 +224,7 @@
io_printf(fd,"%s%s\n", leader, b64_challenge);
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, 0)) {
return NULL;
}
Index: rsync/clientserver.c
--- rsync/clientserver.c 7 May 2001 06:59:37 -0000 1.67
+++ rsync/clientserver.c 10 Jul 2001 22:41:29 -0000
@@ -44,9 +44,9 @@
extern int am_sender;
extern struct in_addr socket_address;
extern char *shell_cmd;
+ extern int list_only;
if (argc == 0 && !am_sender) {
- extern int list_only;
list_only = 1;
}
@@ -93,7 +93,7 @@
io_printf(fd,"@RSYNCD: %d\n", PROTOCOL_VERSION);
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, 0)) {
return -1;
}
@@ -107,9 +107,11 @@
if (p) *p = '/';
while (1) {
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, list_only)) {
return -1;
}
+ if (strcmp(line,"@RSYNCD: EOF") == 0)
+ return 0;
if (strncmp(line,"@RSYNCD: AUTHREQD ",18) == 0) {
auth_client(fd, user, line+18);
@@ -277,7 +279,7 @@
argv[argc++] = "rsyncd";
while (1) {
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, 0)) {
return -1;
}
@@ -377,10 +379,13 @@
{
int n = lp_numservices();
int i;
-
+ extern int remote_version;
+
for (i=0;i<n;i++)
if (lp_list(i))
io_printf(fd, "%-15s\t%s\n", lp_name(i), lp_comment(i));
+ if (remote_version >= 25)
+ io_printf(fd,"@RSYNCD: EOF\n");
}
/* this is called when a socket connection is established to a client
@@ -418,7 +423,7 @@
io_printf(fd,"\n");
}
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, 0)) {
return -1;
}
@@ -429,7 +434,7 @@
while (i == -1) {
line[0] = 0;
- if (!read_line(fd, line, sizeof(line)-1)) {
+ if (!read_line(fd, line, sizeof(line)-1, 0)) {
return -1;
}
Index: rsync/io.c
--- rsync/io.c 7 May 2001 06:59:37 -0000 1.85
+++ rsync/io.c 10 Jul 2001 22:41:41 -0000
@@ -178,12 +178,13 @@
if (n == 0) {
- if (eof_error) {
- rprintf(FERROR,
- "%s: connection to server unexpectedly closed"
- " (%.0f bytes read so far)\n",
- RSYNC_NAME, (double)stats.total_read);
- }
+ extern int remote_version;
+ if (!eof_error && remote_version < 25)
+ exit_cleanup(0);
+ rprintf(FERROR,
+ "%s: connection to server unexpectedly closed"
+ " (%.0f bytes read so far)\n",
+ RSYNC_NAME, (double)stats.total_read);
exit_cleanup(RERR_STREAMIO);
}
@@ -560,9 +561,9 @@
write_buf(f,(char *)&c,1);
}
-int read_line(int f, char *buf, int maxlen)
+int read_line(int f, char *buf, int maxlen, int eof_ok)
{
- eof_error = 0;
+ eof_error = !eof_ok;
while (maxlen) {
buf[0] = 0;
Index: rsync/proto.h
--- rsync/proto.h 7 May 2001 08:59:47 -0000 1.126
+++ rsync/proto.h 10 Jul 2001 22:41:46 -0000
@@ -71,7 +71,7 @@
void write_longint(int f, int64 x);
void write_buf(int f,char *buf,int len);
void write_byte(int f,unsigned char c);
-int read_line(int f, char *buf, int maxlen);
+int read_line(int f, char *buf, int maxlen, int eof_ok);
void io_printf(int fd, const char *format, ...);
void io_start_multiplex_out(int fd);
void io_start_multiplex_in(int fd);
Index: rsync/rsync.h
--- rsync/rsync.h 17 Mar 2001 01:06:34 -0000 1.99
+++ rsync/rsync.h 10 Jul 2001 22:41:50 -0000
@@ -48,7 +48,7 @@
#define SAME_TIME (1<<7)
/* update this if you make incompatible changes */
-#define PROTOCOL_VERSION 24
+#define PROTOCOL_VERSION 25
#define MIN_PROTOCOL_VERSION 15
#define MAX_PROTOCOL_VERSION 30
---8<------8<------8<------8<---cut here--->8------>8------>8------>8---