X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/0fb2fc4a1d75dfddeb5bb56d3ca7c5b22511fc29..4e7d07c8d4c75f0fc4207f0d6058db99b61c2f17:/io.c diff --git a/io.c b/io.c index 439f717b..07909fe4 100644 --- a/io.c +++ b/io.c @@ -119,14 +119,17 @@ struct flist_ndx_list { static struct flist_ndx_list redo_list, hlink_list; -struct msg_list { - struct msg_list *next; +struct msg_list_item { + struct msg_list_item *next; char *buf; int len; }; -static struct msg_list *msg_list_head; -static struct msg_list *msg_list_tail; +struct msg_list { + struct msg_list_item *head, *tail; +}; + +static struct msg_list msg_list; static void flist_ndx_push(struct flist_ndx_list *lp, int ndx) { @@ -224,9 +227,9 @@ void set_msg_fd_out(int fd) /* Add a message to the pending MSG_* list. */ static void msg_list_add(int code, char *buf, int len) { - struct msg_list *ml; + struct msg_list_item *ml; - if (!(ml = new(struct msg_list))) + if (!(ml = new(struct msg_list_item))) out_of_memory("msg_list_add"); ml->next = NULL; if (!(ml->buf = new_array(char, len+4))) @@ -234,21 +237,11 @@ static void msg_list_add(int code, char *buf, int len) SIVAL(ml->buf, 0, ((code+MPLEX_BASE)<<24) | len); memcpy(ml->buf+4, buf, len); ml->len = len+4; - if (msg_list_tail) - msg_list_tail->next = ml; + if (msg_list.tail) + msg_list.tail->next = ml; else - msg_list_head = ml; - msg_list_tail = ml; -} - -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); + msg_list.head = ml; + msg_list.tail = ml; } /* Read a message from the MSG_* fd and handle it. This is called either @@ -330,7 +323,7 @@ static void read_msg_fd(void) /* Try to push messages off the list onto the wire. If we leave with more * to do, return 0. On error, return -1. If everything flushed, return 1. * This is only active in the receiver. */ -int msg_list_push(int flush_it_all) +static int msg_list_flush(int flush_it_all) { static int written = 0; struct timeval tv; @@ -339,8 +332,8 @@ int msg_list_push(int flush_it_all) if (msg_fd_out < 0) return -1; - while (msg_list_head) { - struct msg_list *ml = msg_list_head; + while (msg_list.head) { + struct msg_list_item *ml = msg_list.head; int n = write(msg_fd_out, ml->buf + written, ml->len - written); if (n < 0) { if (errno == EINTR) @@ -357,9 +350,9 @@ int msg_list_push(int flush_it_all) check_timeout(); } else if ((written += n) == ml->len) { free(ml->buf); - msg_list_head = ml->next; - if (!msg_list_head) - msg_list_tail = NULL; + msg_list.head = ml->next; + if (!msg_list.head) + msg_list.tail = NULL; free(ml); written = 0; } @@ -367,6 +360,16 @@ int msg_list_push(int flush_it_all) return 1; } +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_flush(NORMAL_FLUSH); +} + int get_redo_num(int itemizing, enum logcode code) { while (1) { @@ -462,7 +465,7 @@ static int read_timeout(int fd, char *buf, size_t len) FD_ZERO(&r_fds); FD_ZERO(&w_fds); FD_SET(fd, &r_fds); - if (msg_list_head) { + if (msg_list.head) { FD_SET(msg_fd_out, &w_fds); if (msg_fd_out > maxfd) maxfd = msg_fd_out; @@ -499,8 +502,8 @@ static int read_timeout(int fd, char *buf, size_t len) continue; } - if (msg_list_head && FD_ISSET(msg_fd_out, &w_fds)) - msg_list_push(NORMAL_FLUSH); + if (msg_list.head && FD_ISSET(msg_fd_out, &w_fds)) + msg_list_flush(NORMAL_FLUSH); if (io_filesfrom_f_out >= 0) { if (io_filesfrom_buflen) { @@ -1145,7 +1148,7 @@ static void mplex_write(enum msgcode code, char *buf, size_t len) void io_flush(int flush_it_all) { - msg_list_push(flush_it_all); + msg_list_flush(flush_it_all); if (!iobuf_out_cnt || no_flush) return;