- tag = tag >> 24;
-
- if (tag == MPLEX_BASE)
- continue;
-
- tag -= MPLEX_BASE;
-
- if (tag != FERROR && tag != FINFO) {
- rprintf(FERROR, "unexpected tag %d\n", tag);
- exit_cleanup(RERR_STREAMIO);
- }
-
- if (remaining > sizeof(line) - 1) {
- rprintf(FERROR, "multiplexing overflow %d\n\n",
- remaining);
+ tag = (tag >> 24) - MPLEX_BASE;
+
+ switch (tag) {
+ case MSG_DATA:
+ if (remaining > iobuf_in_siz) {
+ if (!(iobuf_in = realloc_array(iobuf_in, char,
+ remaining)))
+ out_of_memory("readfd_unbuffered");
+ iobuf_in_siz = remaining;
+ }
+ 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_SUCCESS:
+ if (remaining != 4) {
+ rprintf(FERROR, "invalid multi-message %d:%ld\n",
+ tag, (long)remaining);
+ exit_cleanup(RERR_STREAMIO);
+ }
+ read_loop(fd, line, remaining);
+ successful_send(IVAL(line, 0));
+ remaining = 0;
+ break;
+ case MSG_INFO:
+ case MSG_ERROR:
+ if (remaining >= sizeof line) {
+ rprintf(FERROR,
+ "[%s] multiplexing overflow %d:%ld\n\n",
+ who_am_i(), tag, (long)remaining);
+ exit_cleanup(RERR_STREAMIO);
+ }
+ read_loop(fd, line, remaining);
+ rwrite((enum logcode)tag, line, remaining);
+ remaining = 0;
+ break;
+ default:
+ rprintf(FERROR, "[%s] unexpected tag %d\n",
+ who_am_i(), tag);