From 1b7c47cb550e7600a66528c9cbd4bc1e880fb91e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 2 Nov 1998 04:17:56 +0000 Subject: [PATCH] Jason told me that's its very important for his site to log exactly how many bytes were needed to be transferred for each file. I added %b and %c log format options to cover this. See the man page for details. --- io.c | 8 ++++++-- log.c | 36 +++++++++++++++++++++++++++++++----- receiver.c | 8 ++++++-- rsyncd.conf.yo | 3 +++ sender.c | 10 +++++++--- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/io.c b/io.c index 9f6b2280..dbd9f643 100644 --- a/io.c +++ b/io.c @@ -100,7 +100,6 @@ static int read_timeout(int fd, char *buf, int len) n = read(fd, buf, len); if (n > 0) { - stats.total_read += n; buf += n; len -= n; ret += n; @@ -264,6 +263,8 @@ static void readfd(int fd,char *buffer,int N) ret = read_unbuffered(fd,buffer + total,N-total); total += ret; } + + stats.total_read += total; } @@ -390,7 +391,6 @@ static void writefd_unbuffered(int fd,char *buf,int len) blocked = 0; total += ret; - stats.total_written += ret; if (io_timeout) last_io = time(NULL); @@ -441,6 +441,8 @@ void io_end_buffering(int fd) static void writefd(int fd,char *buf,int len) { + stats.total_written += len; + if (!io_buffer) { writefd_unbuffered(fd, buf, len); return; @@ -577,6 +579,8 @@ int io_multiplex_write(int f, char *buf, int len) SIVAL(io_buffer-4, 0, ((MPLEX_BASE + f)<<24) + len); memcpy(io_buffer, buf, len); + stats.total_written += (len+4); + writefd_unbuffered(multiplex_out_fd, io_buffer-4, len+4); return 1; } diff --git a/log.c b/log.c index 732a96b7..09f9e2bf 100644 --- a/log.c +++ b/log.c @@ -174,7 +174,8 @@ void rflush(int fd) /* a generic logging routine for send/recv, with parameter substitiution */ -static void log_formatted(char *op, struct file_struct *file) +static void log_formatted(char *op, struct file_struct *file, + struct stats *initial_stats) { extern int module_id; extern char *auth_user; @@ -182,6 +183,9 @@ static void log_formatted(char *op, struct file_struct *file) char *p, *s, *n; char buf2[100]; int l; + extern struct stats stats; + extern int am_sender; + int64 b; strlcpy(buf, lp_log_format(module_id), sizeof(buf)-1); @@ -208,6 +212,28 @@ static void log_formatted(char *op, struct file_struct *file) case 'm': n = lp_name(module_id); break; case 'P': n = lp_path(module_id); break; case 'u': n = auth_user; break; + case 'b': + if (am_sender) { + b = stats.total_written - + initial_stats->total_written; + } else { + b = stats.total_read - + initial_stats->total_read; + } + slprintf(buf2,sizeof(buf2)-1,"%.0f", (double)b); + n = buf2; + break; + case 'c': + if (!am_sender) { + b = stats.total_written - + initial_stats->total_written; + } else { + b = stats.total_read - + initial_stats->total_read; + } + slprintf(buf2,sizeof(buf2)-1,"%.0f", (double)b); + n = buf2; + break; } if (!n) continue; @@ -232,20 +258,20 @@ static void log_formatted(char *op, struct file_struct *file) } /* log the outgoing transfer of a file */ -void log_send(struct file_struct *file) +void log_send(struct file_struct *file, struct stats *initial_stats) { extern int module_id; if (lp_transfer_logging(module_id)) { - log_formatted("send", file); + log_formatted("send", file, initial_stats); } } /* log the incoming transfer of a file */ -void log_recv(struct file_struct *file) +void log_recv(struct file_struct *file, struct stats *initial_stats) { extern int module_id; if (lp_transfer_logging(module_id)) { - log_formatted("recv", file); + log_formatted("recv", file, initial_stats); } } diff --git a/receiver.c b/receiver.c index bf843e7c..376c3fca 100644 --- a/receiver.c +++ b/receiver.c @@ -292,6 +292,8 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) struct file_struct *file; int phase=0; int recv_ok; + extern struct stats stats; + struct stats initial_stats; if (verbose > 2) { rprintf(FINFO,"recv_files(%d) starting\n",flist->count); @@ -339,6 +341,8 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) continue; } + initial_stats = stats; + if (verbose > 2) rprintf(FINFO,"recv_files(%s)\n",fname); @@ -418,10 +422,10 @@ int recv_files(int f_in,struct file_list *flist,char *local_name,int f_gen) log_transfer(file, fname); } - log_recv(file); - /* recv file data */ recv_ok = receive_data(f_in,buf,fd2,fname,file->length); + + log_recv(file, &initial_stats); if (buf) unmap_file(buf); if (fd1 != -1) { diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo index 08c188f6..2b01601b 100644 --- a/rsyncd.conf.yo +++ b/rsyncd.conf.yo @@ -129,6 +129,9 @@ itemize( it() %P for the module path it() %m for the module name it() %u for the authenticated username (or the null string) + it() %b for the number of bytes actually transferred + it() %c when sending files this gives the number of checksum bytes + received for this file ) The default log format is "%o %h [%a] %m (%u) %f %l" diff --git a/sender.c b/sender.c index bc30e4cb..79eb1c8c 100644 --- a/sender.c +++ b/sender.c @@ -91,6 +91,8 @@ void send_files(struct file_list *flist,int f_out,int f_in) int i; struct file_struct *file; int phase = 0; + extern struct stats stats; + struct stats initial_stats; if (verbose > 2) rprintf(FINFO,"send_files starting\n"); @@ -149,6 +151,8 @@ void send_files(struct file_list *flist,int f_out,int f_in) continue; } + initial_stats = stats; + s = receive_sums(f_in); if (!s) { io_error = 1; @@ -184,8 +188,6 @@ void send_files(struct file_list *flist,int f_out,int f_in) rprintf(FINFO,"send_files mapped %s of size %d\n", fname,(int)st.st_size); - log_send(file); - write_int(f_out,i); write_int(f_out,s->count); @@ -200,7 +202,9 @@ void send_files(struct file_list *flist,int f_out,int f_in) } match_sums(f_out,s,buf,st.st_size); - + + log_send(file, &initial_stats); + if (buf) unmap_file(buf); close(fd); -- 2.34.1