extern int quiet;
extern int module_id;
extern int msg_fd_out;
+extern int checksum_len;
extern int allow_8bit_chars;
extern int protocol_version;
+extern int always_checksum;
extern int preserve_times;
+extern int msgs2stderr;
extern int uid_ndx;
extern int gid_ndx;
extern int stdout_format_has_i;
extern iconv_t ic_chck;
#endif
#ifdef ICONV_OPTION
-extern iconv_t ic_send, ic_recv;
+extern iconv_t ic_recv;
#endif
-extern char curr_dir[];
+extern char curr_dir[MAXPATHLEN];
extern char *module_dir;
extern unsigned int module_dirlen;
+extern char sender_file_sum[MAX_DIGEST_LEN];
static int log_initialised;
static int logfile_was_closed;
if (len < 0)
exit_cleanup(RERR_MESSAGEIO);
+ if (msgs2stderr > 0 && code != FLOG)
+ goto output_msg;
+
if (am_server && msg_fd_out >= 0) {
assert(!is_utf8);
/* Pass the message to our sibling. */
/* TODO: can we send the error to the user somehow? */
return;
}
+ msgs2stderr = -1;
}
+output_msg:
switch (code) {
case FERROR_XFER:
got_xfer_error = 1;
f = stderr;
break;
case FINFO:
- f = am_server ? stderr : stdout;
+ case FCLIENT:
+ f = msgs2stderr ? stderr : stdout;
break;
default:
exit_cleanup(RERR_MESSAGEIO);
int ierrno;
INIT_CONST_XBUF(outbuf, convbuf);
- INIT_XBUF(inbuf, (char*)buf, len, -1);
+ INIT_XBUF(inbuf, (char*)buf, len, (size_t)-1);
while (inbuf.len) {
iconvbufs(ic, &inbuf, &outbuf, 0);
n = client_addr(0);
break;
case 'l':
- strlcat(fmt, ".0f", sizeof fmt);
+ strlcat(fmt, "s", sizeof fmt);
snprintf(buf2, sizeof buf2, fmt,
- (double)F_LENGTH(file));
+ big_num(F_LENGTH(file), 0));
n = buf2;
break;
case 'U':
b = stats.total_read -
initial_stats->total_read;
}
- strlcat(fmt, ".0f", sizeof fmt);
- snprintf(buf2, sizeof buf2, fmt, (double)b);
+ strlcat(fmt, "s", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt, big_num(b, 0));
n = buf2;
break;
case 'c':
b = stats.total_read -
initial_stats->total_read;
}
- strlcat(fmt, ".0f", sizeof fmt);
- snprintf(buf2, sizeof buf2, fmt, (double)b);
+ strlcat(fmt, "s", sizeof fmt);
+ snprintf(buf2, sizeof buf2, fmt, big_num(b, 0));
+ n = buf2;
+ break;
+ case 'C':
+ if (protocol_version >= 30
+ && (iflags & ITEM_TRANSFER
+ || (always_checksum && S_ISREG(file->mode)))) {
+ int i, x1, x2;
+ const char *sum = iflags & ITEM_TRANSFER
+ ? sender_file_sum : F_SUM(file);
+ c = buf2 + checksum_len*2;
+ *c = '\0';
+ for (i = checksum_len; --i >= 0; ) {
+ x1 = CVAL(sum, i);
+ x2 = x1 >> 4;
+ x1 &= 0xF;
+ *--c = x1 <= 9 ? x1 + '0' : x1 + 'a' - 10;
+ *--c = x2 <= 9 ? x2 + '0' : x2 + 'a' - 10;
+ }
+ } else {
+ memset(buf2, ' ', checksum_len*2);
+ buf2[checksum_len*2] = '\0';
+ }
n = buf2;
break;
case 'i':