From 0d67e00af8119231c94951f1291c96a8d09861c8 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Sat, 19 Feb 2005 02:39:18 +0000 Subject: [PATCH] - 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. --- io.c | 33 ++++++++++++++++++++++++++++++--- 1 file 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; -- 2.34.1