- switch (tag) {
- case MSG_DONE:
- if (len != 0 || !am_generator) {
- rprintf(FERROR, "invalid message %d:%d\n", tag, len);
- exit_cleanup(RERR_STREAMIO);
- }
- flist_ndx_push(&redo_list, -1);
- break;
- case MSG_REDO:
- if (len != 4 || !am_generator) {
- rprintf(FERROR, "invalid message %d:%d\n", tag, len);
- exit_cleanup(RERR_STREAMIO);
- }
- read_loop(fd, buf, 4);
- if (remove_sent_files)
- decrement_active_files(IVAL(buf,0));
- flist_ndx_push(&redo_list, 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);
- if (defer_forwarding_messages)
- msg_list_add(&msg2sndr, MSG_DELETED, buf, len);
- else
- io_multiplex_write(MSG_DELETED, buf, len);
- break;
- case MSG_SUCCESS:
- if (len != 4 || !am_generator) {
- rprintf(FERROR, "invalid message %d:%d\n", tag, len);
- exit_cleanup(RERR_STREAMIO);
- }
- read_loop(fd, buf, len);
- if (remove_sent_files) {
- decrement_active_files(IVAL(buf,0));
- if (defer_forwarding_messages)
- msg_list_add(&msg2sndr, MSG_SUCCESS, buf, len);
- else
- io_multiplex_write(MSG_SUCCESS, buf, len);
- }
- if (preserve_hard_links)
- flist_ndx_push(&hlink_list, IVAL(buf,0));
- break;
- case MSG_SOCKERR:
- if (!am_generator) {
- rprintf(FERROR, "invalid message %d:%d\n", tag, len);
- exit_cleanup(RERR_STREAMIO);
- }
- close_multiplexing_out();
- defer_forwarding_messages = 0;
- /* FALL THROUGH */
- case MSG_INFO:
- case MSG_ERROR:
- case MSG_LOG:
- while (len) {
- n = len;
- if (n >= sizeof buf)
- n = sizeof buf - 1;
- read_loop(fd, buf, n);
- if (am_generator && am_server
- && defer_forwarding_messages && tag != MSG_LOG)
- msg_list_add(&msg2sndr, tag, buf, n);
- else
- rwrite((enum logcode)tag, buf, n);
- len -= n;
- }
- break;
- default:
- rprintf(FERROR, "unknown message %d:%d [%s]\n",
- tag, len, who_am_i());
- exit_cleanup(RERR_STREAMIO);