aboutsummaryrefslogtreecommitdiffstats
path: root/io.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2005-02-19 02:39:18 +0000
committerWayne Davison <wayned@samba.org>2005-02-19 02:39:18 +0000
commit0d67e00af8119231c94951f1291c96a8d09861c8 (patch)
treec09fea6d88a437e40e8d10769bfa1c4b5eda3060 /io.c
parent7448177753f8a69cb0edf396e05094642b9bcbc8 (diff)
downloadandroid_external_rsync-0d67e00af8119231c94951f1291c96a8d09861c8.tar.gz
android_external_rsync-0d67e00af8119231c94951f1291c96a8d09861c8.tar.bz2
android_external_rsync-0d67e00af8119231c94951f1291c96a8d09861c8.zip
- Allow send_msg() to be called by the delete code in flist.c and
have it figure out if it should send the message to our sibling or the other side. - Handle the new MSG_DELETED message in both the generator and the sender. This message is used to let the client side log each deletion when the server side is the receiver.
Diffstat (limited to 'io.c')
-rw-r--r--io.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/io.c b/io.c
index e5574025..f01353ff 100644
--- a/io.c
+++ b/io.c
@@ -203,6 +203,10 @@ static void msg_list_add(int code, char *buf, int len)
void send_msg(enum msgcode code, char *buf, int len)
{
+ if (msg_fd_out < 0) {
+ io_multiplex_write(code, buf, len);
+ return;
+ }
msg_list_add(code, buf, len);
msg_list_push(NORMAL_FLUSH);
}
@@ -244,6 +248,14 @@ static void read_msg_fd(void)
read_loop(fd, buf, 4);
redo_list_add(IVAL(buf,0));
break;
+ case MSG_DELETED:
+ if (len >= (int)sizeof buf || !am_generator) {
+ rprintf(FERROR, "invalid message %d:%d\n", tag, len);
+ exit_cleanup(RERR_STREAMIO);
+ }
+ read_loop(fd, buf, len);
+ io_multiplex_write(MSG_DELETED, buf, len);
+ break;
case MSG_INFO:
case MSG_ERROR:
case MSG_LOG:
@@ -640,7 +652,7 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
static size_t remaining;
static size_t iobuf_in_ndx;
int tag, ret = 0;
- char line[1024];
+ char line[MAXPATHLEN+1];
if (!iobuf_in || fd != sock_f_in)
return read_timeout(fd, buf, len);
@@ -677,6 +689,21 @@ static int readfd_unbuffered(int fd, char *buf, size_t len)
read_loop(fd, iobuf_in, remaining);
iobuf_in_ndx = 0;
break;
+ case MSG_DELETED:
+ if (remaining >= sizeof line) {
+ rprintf(FERROR, "invalid multi-message %d:%ld\n",
+ tag, (long)remaining);
+ exit_cleanup(RERR_STREAMIO);
+ }
+ read_loop(fd, line, remaining);
+ line[remaining] = '\0';
+ /* A directory name was sent with the trailing null */
+ if (remaining > 0 && !line[remaining-1])
+ log_delete(line, S_IFDIR);
+ else
+ log_delete(line, S_IFREG);
+ remaining = 0;
+ break;
case MSG_INFO:
case MSG_ERROR:
if (remaining >= sizeof line) {
@@ -729,7 +756,7 @@ static void readfd(int fd, char *buffer, size_t N)
}
-unsigned short read_short(int f)
+int read_shortint(int f)
{
uchar b[2];
readfd(f, (char *)b, 2);
@@ -1063,7 +1090,7 @@ static void writefd(int fd,char *buf,size_t len)
}
-void write_short(int f, unsigned short x)
+void write_shortint(int f, int x)
{
uchar b[2];
b[0] = x;